Мое приложение случайным образом возвращало ошибки OOM, пытаясь выделить 16 миллионов фрагментов, в то время как у Linux было много памяти, используемой дисковым кешем (20 ГБ).
Замена отключена. Все ограничения ОС кажутся нормальными.
После очистки кеша Linux ошибка drop_caches исчезла.
Есть идеи, что проверить, или это какое-то ожидаемое поведение?
Памяти было много, но, вероятно, она была фрагментирована, поэтому вы не могли получить непрерывный кусок размером 16 МБ. Drop_caches запустит дефрагментацию памяти, поэтому после этого будет достаточно постоянной памяти, доступной для выполнения вашего запроса malloc.
(Этот вопрос, вероятно, больше подходит для одного из форумов по программированию.)
Malloc () не выделяет физическую память, а выделяет виртуальную память. Malloc () может завершиться ошибкой из-за нехватки (непрерывного свободного фрагмента) виртуальной памяти или превышения лимита фиксации.
ps
, top
или pmamp
команды. 64-битные архитектуры (amd64) имеют чрезвычайно большую виртуальную память, и ее практически невозможно исчерпать, но 32-битный процесс будет ограничен максимум 4 ГБ виртуальной памяти./proc/sys/vm/overcommit_memory
и Committed_AS
и CommitLimit
ряды в /proc/meminfo
. Если overcommit_memory равен 1, превышение CommitLimit приведет к сбою malloc ().