vak: (Daemon)
[personal profile] vak
Помаленьку 4.4bsd начинает оживать. Пытаюсь отловить утечку памяти в ядре, и наблюдаю забавный эффект. Есть два системных процесса, отвечающих за память: демон подкачки (swapper) и демон откачки (pagedaemon). Демон откачки старается поддерживать в ядре определенное количество пустых страниц памяти. Когда он не справляется и страниц становится критически мало, он решает откачать один из процессов целиком на диск, в область свопа. Первыми уходят спящие процессы типа init. Если памяти все еще недостаточно, наступает черед активных процессов. В какой-то момент в своп улетает единственный активный процесс - консольный шелл, и система фактически останавливается. Секунд через десять демон подкачки решает, что пора подкачать шелл обратно, и система оживает.

Это не ошибка, а фича, описанная в книжке Кирка Маккузика. Интересно, что в FreeBSD это место поправили, чтобы ядро никогда не выталкивало активные процессы в своп. Вместо этого самый большой и толстый процесс пришибается сигналом. Я склоняюсь к тому, что для встроенных систем это решение подходит лучше.

Date: 2014-11-14 23:17 (UTC)
From: [identity profile] sab123.livejournal.com
Если ядро сожрало всю память, уже никакой процесс больше не запустится.

Date: 2014-11-15 01:40 (UTC)
From: [identity profile] sab123.livejournal.com
Неа, не освободится. Проблема же в физической памяти, а не в логической. При утечке в ядре физической памяти делается так мало, что код уже может только заниматься загрузкой-выгрузкой страниц. Следующий процесс загрузится из свопа, чуть-чуть потрешится и точно так же убьется. И так далее.