Skip to content

Commit ee81184

Browse files
committed
Limit qemu-img execution arenas
qemu-img attempts to launch multiple threads by default *and* attempts to have multiple memory allocation arenas to operate from. While multithreading can be good for performance, this pattern and the memory footprint for process launch and dependencies can turn the memory footprint for a cirros image conversion (16MB) into 1.2GB of memory being asked for by the qemu-img tool. In order to limit this impact, as the default number of arenas is governed by the number of CPUs times the number 8, it seems reasonable to lower this to a more reasonable number which also helps keep our possible memory footprint from being exceeded. NOTE: This change is largely different than the original change as an intermediate change converted write_image.sh to python. As it is unlikely for us to backport the intermediate change, it is logical for us to just modify the original script. Otherwise the release note is ultimately what is backported for release note tooling continutity. Change-Id: I71a28ec59ec31c691205eb34d9fcab63a2ccb682 Story: 2008928 Task: 42528 (cherry picked from commit 9e4c705) (cherry picked from commit 9c20cca)
1 parent ab97415 commit ee81184

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

ironic_python_agent/shell/write_image.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ log "Imaging $IMAGEFILE to $DEVICE"
4949

5050
# limit the memory usage for qemu-img to 2 GiB
5151
ulimit -v 2097152
52+
# NOTE(TheJulia): qemu-img uses multiple threads by default and in
53+
# cross-thread memory allocation lock conflicts, glibc will ultimately
54+
# attempt to provide it with an additional arena to allocate from, however
55+
# the running default, when not overridden is 8 * ncpu * the footprint, which
56+
# very quickly exceeds the ulimit. This is most observable on CI systems where
57+
# cross-vcpu thread locking can result in a conflict that wouldn't normally be
58+
# as likely on physical hardware.
59+
# See discussion on https://bugzilla.redhat.com/show_bug.cgi?id=1892773
60+
export MALLOC_ARENA_MAX=3
5261
qemu-img convert -t directsync -O host_device $IMAGEFILE $DEVICE
5362
sync
5463

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
fixes:
3+
- |
4+
Fixes failures with disk image conversions which result in memory
5+
allocation or input/output errors due to memory limitations by limiting
6+
the number of available memory allocation pools to a non-dynamic
7+
reasonable number which should not exceed the available system memory.

0 commit comments

Comments
 (0)