Linux не использует своп, но запускается OOM killer
У меня уже давно есть эта проблема, и я не могу понять, в принципе, моя система Linux (32-битная 3.2.6-3.fc16.i686.PAE) отказывается использовать своп. Когда я бегу
$ tail /dev/zero
tail: memory exhausted
он не прибегает к использованию свопа вообще... он просто умирает после использования физической памяти. Вот соответствующие детали.
$ free -m
total used free shared buffers cached
Mem: 8076 4652 3423 0 123 543
-/+ buffers/cache: 3985 4090
Swap: 8192 116 8076
$ cat /proc/sys/vm/swappiness
60
$ ulimit -m
unlimited
$ cat /proc/sys/vm/overcommit_ratio
50
$ cat /proc/sys/vm/overcommit_memory
0
Я попытался установить его на 1:
# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
$ cat /proc/sys/vm/overcommit_memory
1
и попробовал еще раз, тот же результат. Есть идеи?
2 ответа
Это 32-битный Linux, поэтому нет способа выделить больше 4 ГБ памяти для приложения, потому что оно исчерпает свое адресное пространство. У вас 8 ГБ ОЗУ, и оно в основном свободно, поэтому 4096 МБ можно выделить без использования подкачки.
Этот вопрос довольно старый, но есть довольно простой ответ:
tail
из /dev/zero
не приносит пользы Если вы просто хотите поток нулевых байтов, используйте cat
,
tail
(с параметрами по умолчанию) вернет последние 10 строк из аргумента. поскольку /dev/zero
является символьным устройством, оно начнет считывать фрагменты данных с него до конца (обычные файлы сканируются в обратном направлении). Считанные данные сохраняются до тех пор, пока не будет найдено 10 строк, затем первые строки удаляются из буфера.
Линии будут разделены символами новой строки - \n
, поскольку /dev/zero
не возвращает никаких новых строк, все данные (все прочитанные нулевые байты) по-прежнему считаются первой строкой и, следовательно, хранятся в буфере. А также tail
будет продолжаться до тех пор, пока не будет найден конец файла, что никогда не случится для /dev/zero
, Таким образом, вы никогда не получите никакой полезной информации от tail /dev/zero
,
К счастью, вы работаете в 32-битной системе и имеете достаточно свободной памяти, поэтому память, доступная для одного процесса (обычно 2 ГБ, но может быть разной в зависимости от конфигурации ядра), исчерпывается довольно быстро и без перестановки, и команда прервана Если вы попробуете то же самое в системе с меньшей свободной памятью или большим адресным пространством (64-битная система), tail поглотит всю память, которую сможет получить, заставит ядро выгрузить как можно больше, и в конечном итоге вы все равно останетесь получить ошибку выделения памяти. Или вызвать OOM-убийцу. Но все еще нет нулевых байтов на стандартный вывод.