LINUX.ORG.RU

Большая часть памяти занята кешами, работает oom_killer, drop_caches не дает эффекта

 , linuxatemyram, ,


1

7

Заметил, что пока я был на работе, oom_killer прикончил Firefox на фоне общей нехватки памяти. Картина примерно следующая:

# free -m
             total       used       free     shared    buffers     cached
Mem:         15891      15711        179          0          3      13136
-/+ buffers/cache:       2571      13320
Swap:            0          0          0
Остановил приложения с активным I/O, сделал sync && echo 3 > /proc/sys/vm/drop_caches, кеши почти не уменьшились, тормоза UI заметны на глаз. Вопрос, в общем-то, очевиден: кто виноват и что делать?

Возможно, эти данные чем-то помогут:

★★★
Ответ на: комментарий от tailgunner

Тебе не кажется, что если кто-то внезапно отожрал 16 ГБ рамы, то стоит разобраться, кто это был и почему он себя так повел? А добавление свопа - это симптоматическое лечение, которое, скорее всего, не будет работать.

ddos3 ★
()
Ответ на: комментарий от tailgunner

Своп был. Тогда вместо тормозов от нехватки памяти были тормоза из-за активного перемещения кеша в своп и обратно

si0 ★★★
() автор топика

на фоне общей нехватки памяти. Картина примерно следующая:

Не вижу нехватки памяти.

free -m
             total       used       free     shared    buffers     cached
Mem:          3892       3775        117          2        601       2621
-/+ buffers/cache:        552       3339
Swap:         5844          0       5844

как и в этом случае

roman77 ★★★★★
()
Последнее исправление: roman77 (всего исправлений: 1)
Ответ на: комментарий от ddos3

Тебе не кажется, что если кто-то внезапно отожрал 16 ГБ рамы, то стоит разобраться, кто это был и почему он себя так повел?

Мне кажется, что в логах есть вот это:

[1797823.696096] Node 0 Normal free:52584kB

И если в таких условиях при fork невозможно выделить 8КБайт, дело, скорее всего, в фрагментации. Использование свопа - способ ее обойти.

А разобраться, конечно, стоит. Только вряд ли мы сумеем это сделать.

tailgunner ★★★★★
()
Ответ на: комментарий от si0

Своп был. Тогда вместо тормозов от нехватки памяти были тормоза из-за активного перемещения кеша в своп и обратно

(пожимая плечами) Выбирай, что для тебя лучше: OOM или свопинг.

tailgunner ★★★★★
()

большая часть памяти занята кешами
перемещения кеша в своп и обратно

Про то, что такое кеши, читаем здесь: http://www.linuxatemyram.com/ (кратко: Линукс хранит кеши ФС в свободной памяти, при необходимости выделить память, кеши выбрасываются; в своп кеши не пишутся; у тебя доступно для программ еще 13 ГБ из 16).

Причин для запуска oom_killer я не вижу, рамы у тебя очень много. Возможно, имел место принудительный запуск (что маловероятно, но все же). Проверь, что это за скрипт covertart.sh, во время работы которого произошел oom_killer.

Посмотри, кто у тебя активнее всех потребляет CPU (top) и диск (iotop).

ddos3 ★
()
Ответ на: комментарий от tailgunner

невозможно выделить 8КБайт

Откуда ты знаешь, что был запрос на выделение 8КБ? Подскажи, где это написано.

дело, скорее всего, в фрагментации.

Фрагментации чего?

ddos3 ★
()
Ответ на: комментарий от roman77

Я не знаю, зачем ядро это делает. Возможно, оно вместо того, чтобы вытеснить кеши из памяти и занять ее чем-нибудь полезным, вытесняло полезные данные на диск, а кеши не трогало. Но тормоза были, своп активно использовался до момента заполнения, а потом включался тот же oom_killer. Никакое приложение в момент его работы не ело память, более 10ГБ было всегда занято кешами.

si0 ★★★
() автор топика
Ответ на: комментарий от ddos3

Про то, что такое кеши, читаем здесь: http://www.linuxatemyram.com/ (кратко: Линукс хранит кеши ФС в свободной памяти, при необходимости выделить память, кеши выбрасываются; в своп кеши не пишутся; у тебя доступно для программ еще 13 ГБ из 16).

Гладко было на бумаге... Недоступны для программ эти 13ГБ и даже через drop_caches не освобождаются, в этом вся суть треда

А скрипт coverart.sh безобидный, там нечему память есть - ему просто не повезло :)

si0 ★★★
() автор топика
Ответ на: комментарий от tailgunner

(пожимая плечами) Выбирай, что для тебя лучше: OOM или свопинг.

Мне не нужен ни oom, ни своппинг - у меня 13ГБ свободной памяти - я хочу, чтобы она была доступна приложениям, а не лежала мертвым грузкешем

si0 ★★★
() автор топика
Ответ на: комментарий от si0

А проверь, на всякий случай, нет ли у тебя какого-нибудь ramfs, забитого под завязку. Вроде /tmp и тому подобных. Что говорят cat /proc/mounts и df -h?

ddos3 ★
()
Ответ на: комментарий от ddos3

Несколько примонтированных tmpfs есть, но там было суммарно мегабайт 50 - я сразу проверил :)

Как трактовать строку «Shmem: 13075100 kB» в /proc/meminfo?

si0 ★★★
() автор топика
Ответ на: комментарий от ddos3

Откуда ты знаешь, что был запрос на выделение 8КБ?

[1797823.695987] coverart.sh invoked oom-killer: gfp_mask=0x3000d0, order=1, oom_score_adj=0

оrder=1 - это 2 страницы, 8К.

tailgunner ★★★★★
()
Ответ на: комментарий от si0

я хочу, чтобы она была доступна приложениям, а не лежала мертвым грузкешем

Покрути swappiness. Но своп тебе всё равно нужен, чтобы обойти фрагментацию.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Крутил swappiness, она дает только отсрочку oom_killer-a. При активном случайном чтении 2ТБ данных дисковые кеши неуклонно растут - надо их как-то перевоспитать, чтобы они своевременно освобождали оперативку, когда та нужна приложениям, иначе никакого свопа не напасешься.

si0 ★★★
() автор топика
Ответ на: комментарий от si0

Крутил swappiness, она дает только отсрочку oom_killer-a

Ты крутил swappiness без свопа, или у тебя даже со свопом срабатывает OOM killer?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от si0

Как я понимаю, кто-то выжирает shared memory (в выводе free это же значение показывается в колонке «shared», но в том, что ты постил выше, там был 0). Перепроверь показания free и посмотри, какой процесс у тебя использует так много shared memory.

ddos3 ★
()
Ответ на: комментарий от tailgunner

Даже со свопом. Только ждать приходится дольше и мучительнее - пока своп заполнится под завязку, все дико тормозит, но если набраться терпения, можно дождаться oom_killer

si0 ★★★
() автор топика
Ответ на: комментарий от ddos3

Цитата из man free: «The shared memory column should be ignored; it is obsolete.» Так что надо смотреть только на meminfo:

[sio@hugetower] /home/sio/
# grep Shmem /proc/meminfo
Shmem:          13080504 kB


[sio@hugetower] /home/sio/
# ipcs -m      

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 1474560    sio        600        393216     2          dest         
0x00000000 3244033    sio        600        393216     2          dest         
0x00000000 3276802    sio        600        393216     2          dest         
0x00000000 3309571    sio        600        393216     2          dest         
0x00000000 3342340    sio        600        393216     2          dest         
0x00000000 3375109    sio        600        393216     2          dest         
0x00000000 915341318  sio        600        393216     2          dest  
Вручную просмотрел каждую запись - мелочевка всякая, родители - обычные десктопные приложения (sonata, gajim, xchat). Даже размер суммарно всего ничего: 393KB*7

tmpfs, повторюсь, есть, но пустые

si0 ★★★
() автор топика
Ответ на: комментарий от ddos3

А если 16 гиг рамы за некоторое время заполняются, то вывод не очевиден?

Нет. И посмотри уже на dmesg - там доходчиво.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

посмотри уже на dmesg - там доходчиво.

посмотрел очень внимательно, увидел вот это: «shmem:3291517» (==13 ГБ). О том же рассказывает /proc/meminfo.

А теперь скажи мне, убогому, где искать эти 13 ГБ, и при помощи какой магии включение свопа решит проблему, а не просто оттянет ее до тех пор, пока своп не забьется?

ddos3 ★
()
Ответ на: комментарий от si0

Еще одна сумасшедшая идея: прогони sudo lsof на tmpfs. Твои симптомы воспроизводятся с удаленными, но все еще открытыми, файлами. Может какой процесс чего открыл, удалил, да забыл закрыть?

ddos3 ★
()
Ответ на: комментарий от ddos3

Прогнал, среди открытых только существующие файлы.

si0 ★★★
() автор топика
Ответ на: комментарий от ddos3

посмотрел очень внимательно, увидел вот это: «shmem:3291517» (==13 ГБ)

Про shmem уже сказали выше.

А теперь скажи мне, убогому, где искать эти 13 ГБ

Окей, но это последний раз. Вот искомые 13ГБ.:

[1797823.696127] 3291810 total pagecache pages

и при помощи какой магии включение свопа решит проблему

Если проблема связана с фрагментацией, то свопинг может ее уменьшить.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ок, кеш большой из-за активного чтения с диска. Почему он своевременно не освобождается, когда память нужна приложениям?

si0 ★★★
() автор топика
Ответ на: комментарий от ubuntuawp

tmpfs не заполнена. Проблема наблюдается на всех ядрах, прошедших бэкпорты дебиана за последние полгода

si0 ★★★
() автор топика
Ответ на: комментарий от tailgunner

Вот искомые 13ГБ
невозможность выделить 8К
проблема связана с фрагментацией

1) Фрагментация чего? Дай ссылку, где про это почитать.
2) Есть какие-то веские основания полагать, что проблема именно в этом? Занято всего порядка 20% памяти. Это должна быть какая-то очень адовая фрагменатция, чтобы в остальных 80% не нашелся цельный блок из двух страниц.

ddos3 ★
()
Ответ на: комментарий от si0

Почему он своевременно не освобождается, когда память нужна приложениям?

То, что он «своевременно не освобождается», ты заключил из OOM?

tailgunner ★★★★★
()

+1 Проблема в больших файлах в tmpfs.

Я переписывал 1Гб файл с флэшки в tmpfs, кэш возрос, а в tmpfs показывало что, файл занимает несколько Мб. Я сначала думал, что файл не прочитался, но когда записал на жесткий диск, размер оказался нормальным.

Shmem как раз говорит об этом.

Параметры tmpfs крутить тут.

/etc/default/tmpfs

anonymous
()
Ответ на: комментарий от tailgunner

Фрагментация, как я

О какой такой фрагментации ты все время говоришь? Дай уже наконец ссылку, где можно об этом почитать. И какие у тебя есть основания предполагать фрагментацию при 80% свободной памяти?

заполнение tmpfs

Проверили же уже, ничего не нашли.

ошибка ядра

ТС пробовал разные версии ядра. Если ошибка давняя и легко воспроизводится, то почему ее еще не починили? А если ошибка проявляется только в определенных условиях, хочется понять, в каких именно.

ddos3 ★
()

Мне все еще на дает покоя идея про tmpfs. Попробуй их отмонтировать по одной (в single user mode, если потребуется). Может внезапно обнаружится, что одна из них все-таки держала всю память? А если нет, то по крайней мере, можно будет окончательно снять подозрения с tmpfs/ramfs и начать копать в другом направлении.

ddos3 ★
()
Ответ на: комментарий от ddos3

заполнение tmpfs

Проверили же уже, ничего не нашли.

Пусть скажет как проверял.

anonymous
()
Ответ на: комментарий от ddos3

Свои tmpfs (за исключением стандартных от дистрибутива) я так и проверял.

Сегодня утром почти случайно удалось освободить эти 13ГБ shmem без перезагрузки: когда, убив по одному все сколько-нибудь активные приложения (после каждого делая sync и drop_caches), я сдался и собрался было перезагрузиться, я вышел из иксов и наудачу сделал те же sync + drop_caches. Счетчик shmem обнулился.

Последним шагом были остановлены X, fluxbox, conky (3 инстанции), xxkb, urxvtd, xscreensaver и два маленьких самописных скрипта. Сейчас иксы запущены снова, буду ждать накопления мусора в shmem и убивать этих по одному. Наибольшие подозрения у меня вызывает xscreensaver (он 18 часов в сутки крутит слайдшоу из фотографий), следующий на очереди urxvtd.

Как только узнаю что-то новое - отпишусь здесь.

si0 ★★★
() автор топика

И никто не вспомнил про zram...

anonymous
()
Ответ на: комментарий от si0

а проблемма воспроизводится на раз-два или нужны специфические условия?

ZuBB ★★★★★
()
Последнее исправление: ZuBB (всего исправлений: 1)
Ответ на: комментарий от ZuBB

Проблема воспроизводится при обычном использовании, но медленно - через две недели обычно на глаз ничего еще не заметно - а там, глядишь, и новое ядро выпускают :)

Urxvtd был запущен те же 20 дней, что и компьютер.

si0 ★★★
() автор топика

У меня тоже на дебиане оно течет, при любой попытке обращения к миллионам мелких файлов в ext4. Пытался бороться, потом забил.

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

У меня тоже на дебиане оно течет, при любой попытке обращения к миллионам мелких файлов в ext4

Еще один специалист по системному программированию...

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.