Назад | Перейти на главную страницу

Почему malloc () может возвращать NULL, если Linux имеет 20 ГБ кэшированной памяти, как показано в `top`?

Мое приложение случайным образом возвращало ошибки OOM, пытаясь выделить 16 миллионов фрагментов, в то время как у Linux было много памяти, используемой дисковым кешем (20 ГБ).

Замена отключена. Все ограничения ОС кажутся нормальными.

После очистки кеша Linux ошибка drop_caches исчезла.

Есть идеи, что проверить, или это какое-то ожидаемое поведение?

Памяти было много, но, вероятно, она была фрагментирована, поэтому вы не могли получить непрерывный кусок размером 16 МБ. Drop_caches запустит дефрагментацию памяти, поэтому после этого будет достаточно постоянной памяти, доступной для выполнения вашего запроса malloc.

(Этот вопрос, вероятно, больше подходит для одного из форумов по программированию.)

Malloc () не выделяет физическую память, а выделяет виртуальную память. Malloc () может завершиться ошибкой из-за нехватки (непрерывного свободного фрагмента) виртуальной памяти или превышения лимита фиксации.

  1. Проверьте использование виртуальной памяти процессом с помощью ps, top или pmamp команды. 64-битные архитектуры (amd64) имеют чрезвычайно большую виртуальную память, и ее практически невозможно исчерпать, но 32-битный процесс будет ограничен максимум 4 ГБ виртуальной памяти.
  2. Проверьте /proc/sys/vm/overcommit_memory и Committed_AS и CommitLimit ряды в /proc/meminfo. Если overcommit_memory равен 1, превышение CommitLimit приведет к сбою malloc ().