linux не использует swap, но запускается OOM killer

у меня была эта проблема в течение длительного времени, и я не могу понять это, в основном, мой linux (32bit 3.2.6-3.fc16.i686.PAE) система отказывается использовать swap. Когда я бегу

$ 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

и попробовал снова, тот же результат. Есть идеи?

7
задан insaner
25.02.2023 19:07 Количество просмотров материала 3513
Распечатать страницу

2 ответа

Это 32-битный Linux, поэтому нет способа выделить больше 4gib памяти для приложения, потому что оно исчерпает свое адресное пространство. У вас есть 8GIB оперативной памяти, и это в основном бесплатно, так 4096 MiB может быть выделен без использования swap.

0
отвечен ilkhd 2023-02-27 02:55

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

tailing от /dev/zero ничего хорошего не дает. Если вам просто нужен поток null-байтов, используйте cat.

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

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

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

0
отвечен Adalbert 2023-02-27 05:12

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх