1

У меня уже давно есть эта проблема, и я не могу понять, в принципе, мой 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 ответа2

0

Этот вопрос довольно старый, но есть довольно простой ответ:

tail из /dev/zero не приносит никакой пользы. Если вы просто хотите поток нулевых байтов, используйте cat .

tail (с параметрами по умолчанию) вернет последние 10 строк аргумента. Поскольку /dev/zero является символьным устройством, оно начнет считывать фрагменты данных из него до конца (обычные файлы сканируются в обратном направлении). Считанные данные сохраняются до тех пор, пока не будет найдено 10 строк, затем первые строки удаляются из буфера.

Строки будут разделены символами новой строки - \n . Поскольку /dev/zero не возвращает никаких новых строк, все данные (все прочитанные до сих пор нулевые байты) по-прежнему считаются первой строкой и, следовательно, хранятся в буфере. И tail будет продолжаться до тех пор, пока не найдет конец файла, что никогда не произойдет для /dev/zero . Таким образом, вы никогда не получите полезного вывода из tail /dev/zero .

К счастью, вы работаете в 32-разрядной системе и имеете достаточно свободной памяти, поэтому память, доступная для одного процесса (обычно 2 ГБ, но может быть разной в зависимости от конфигурации ядра), исчерпывается довольно быстро и без перестановки, и команда прервана Если вы попробуете то же самое в системе с меньшей свободной памятью или большим адресным пространством (64-битная система), tail поглотит всю память, которую сможет получить, заставит ядро выгрузить как можно больше, и в итоге вы все равно останетесь получить ошибку выделения памяти. Или вызвать OOM-убийцу. Но все еще нет нулевых байтов на стандартный вывод.

0

Это 32-битный Linux, поэтому нет никакого способа выделить больше 4 ГБ памяти для приложения, потому что оно исчерпает свое адресное пространство. У вас 8 ГБ ОЗУ, и оно в основном свободно, поэтому 4096 МБ можно выделить без использования подкачки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .