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-убийцу. Но все еще нет нулевых байтов на стандартный вывод.

Другие вопросы по тегам