
У меня часто происходит сбой приложения из-за ошибки распределения памяти (сообщение от dmesg), даже во время обычного просмотра с несколькими открытыми вкладками или обработки изображений с помощью gimp. На машине 16 ГБ оперативной памяти. Я попытался проверить распределение памяти следующим образомэтот вопрос:
$ stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
stress-ng: info: [28129] defaulting to a 86400 second (1 day, 0.00 secs) run per stressor
stress-ng: info: [28129] dispatching hogs: 1 vm
stress-ng: error: [28148] stress-ng-vm: gave up trying to mmap, no available memory
stress-ng: info: [28129] successful run completed in 10.02s
Обратите внимание, что сообщение "нет доступной памяти" не возвращается, если я использую 0,55 вместо 0,9 в строке awk, но каждое значение больше 0,55 приводит к ошибке. Почему я не могу выделить более 0,55 доступной памяти?
Это содержимое /proc/meminfo
MemTotal: 15919800 kB
MemFree: 5488312 kB
MemAvailable: 12100632 kB
Buffers: 716568 kB
Cached: 6156352 kB
SwapCached: 0 kB
Active: 5465468 kB
Inactive: 4214576 kB
Active(anon): 2985580 kB
Inactive(anon): 117944 kB
Active(file): 2479888 kB
Inactive(file): 4096632 kB
Unevictable: 176576 kB
Mlocked: 2476 kB
SwapTotal: 999420 kB
SwapFree: 999420 kB
Dirty: 156 kB
Writeback: 0 kB
AnonPages: 2983852 kB
Mapped: 713212 kB
Shmem: 294288 kB
KReclaimable: 380216 kB
Slab: 448228 kB
SReclaimable: 380216 kB
SUnreclaim: 68012 kB
KernelStack: 14432 kB
PageTables: 55080 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 16760020 kB
Committed_AS: 9543584 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 31412 kB
VmallocChunk: 0 kB
Percpu: 2848 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 274432 kB
DirectMap2M: 9728000 kB
DirectMap1G: 6291456 kB
и вот мои настройки overcommit:
$ cat /proc/sys/vm/overcommit_memory
2
$ cat /proc/sys/vm/overcommit_ratio
99
$ cat /proc/sys/vm/swappiness
10
решение1
Вы используетестрогий учет сверхобязательств, поэтому процессам не разрешено отображать больше, чем доступно памяти. Линия Committed_AS
показывает, что в настоящее время выделено 9543584 КБ, а CommitLimit
линия показывает, что предел составляет 16760020 КБ, что оставляет 7216436 КБ, которые могут быть выделены; это 59,6% вашей доступной памяти, поэтому, принимая во внимание некоторые накладные расходы для stress-ng
, неудивительно, что вы не можете выделить более 55% вашей доступной памяти для vm worker.
Если вы хотите разрешить stress-ng
выделение большего объема доступной памяти, вам необходимо разрешить превышение лимита:
sudo sysctl vm.overcommit_memory=0
или увеличьте сумму обмена, чтобы повысить лимит фиксации.