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

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

Date: 2014-11-14 10:03 (UTC)
From: [identity profile] tim-caper.livejournal.com
Лучше консольный шелл пристрелить, чтоб не мучился? Хм.
Я склоняюсь к тому, что поддерживать в ядре определенное количество пустых страниц ценой активных процессов - порочная идея.

Date: 2014-11-14 10:04 (UTC)
From: [identity profile] nikname.livejournal.com
А для встроенных систем не лучше что-то более риал-тайм?

Date: 2014-11-14 10:22 (UTC)
From: [identity profile] nms.livejournal.com
Overcommit considered harmful? ;-)

Date: 2014-11-14 10:50 (UTC)
From: [identity profile] ircicq.livejournal.com
Есть ли вообще польза в SWAP во встроенных системах без HDD?
Это же гарантированый износ Flash storage

Date: 2014-11-14 12:14 (UTC)
From: [identity profile] vit-r.livejournal.com
Самый большой и толстый процесс может быть приложением, которое тянет всю систему. надо всё-таки различать встроенное от пользовательского.

Date: 2014-11-14 13:55 (UTC)
From: [identity profile] bowhill.livejournal.com
Я бы наверное оставил что-нибудь на усмотрение администратора. То есть группы лимитов, приоритеты ( возможно с изменчивой эластичностью) и группы процессов. Ну и соответствия. То есть оценочная функция немного сложнее чем "съедим самого толстого".

Date: 2014-11-14 15:25 (UTC)
From: [identity profile] ircicq.livejournal.com
"Съедим самого толстого" хорошо тем, что стимулирует программистов экономить ресурсы.

Date: 2014-11-14 15:57 (UTC)
From: [identity profile] bowhill.livejournal.com
Иконка в трее может занимать больше места, чем виртуальная машина с bsd. Девять бессмысленных процессов девяти бессмысленных программистов могут занимать ресурсов больше, чем ресурсы одного осмысленного процесса.

Imho, не стоит переоценивать стимуляцию программистов. Мы живём в мире, где средний программист уверен, что может обновлять свой софт 24x7 через Интернет.

Date: 2014-11-14 18:08 (UTC)
From: [identity profile] oboguev.livejournal.com
Есть другой способ: открыть книжку "VAX/VMS Internals and Data Structures" и прочитать о том, как в правильной системе это всё было решено и прекрасно работало в production на высоких нагрузках за много лет до появления BSD.

К слову, года три назад я по параллельной нужде проглядел текст VMS-ного swapper'a и был поражён утончённостью и продуманностью алгоритмики. Главное впечатление было: "такого теперь уже не делают" -- и понятно конечно почему не делают: если система тормозит по нехватки памяти, то правильное решение в новых исторических условиях состоит в том, что нужно добавить памяти столько, чтобы никакого пейджинга не было. Но если для экзотических случаев вроде тех, с которыми ты возишься, то вот.
Edited Date: 2014-11-14 18:10 (UTC)

Date: 2014-11-14 18:43 (UTC)
From: [identity profile] sab123.livejournal.com
Без свопа получается интересный эффект: Можно выбрасывать из памяти чистые страницы и нельзя измененные. Поэтому если измененных страниц накапливается много, места для чистых страниц остается мало и чистые страницы (т.е. исполняемый код) начинают загружаться-выбрасываться со страшной интенсивностью, и все жутко тормозит. В-принципе, хорошим решением тут будет быстро убить процесс с большим количеством грязных страниц.

Date: 2014-11-14 18:45 (UTC)
From: [identity profile] sab123.livejournal.com
Это не то, что обычно понимается под оверкоммитом. Оверкоммит - это относительно всей виртуальной памяти, включая своп. А это - другой оверкоммит, физической памяти.

Date: 2014-11-14 18:50 (UTC)
From: [identity profile] sab123.livejournal.com
Из описания выходит, что этот консольный шелл сожрал всю память. Иначе чего бы ему страдать при всех остальных выгруженных процессах? Тогда его да лучше пристрелить, и пусть запустится новый.

Или это какие-то переходные процессы оттого, что выгрузка идет медленнее, чем период опроса демоном? Тогда очевидно, что выгружающий демон просто не должен лишнего суетиться, а должен подождать пока помеченные им страницы высвопленных процассов закончат выгрузку.

Date: 2014-11-14 19:39 (UTC)
From: [identity profile] nikname.livejournal.com
Кстати, а вы не знаете ли - какие процессоры летают в космос? В СССР мы просто троировали всё и ставили компараторы.

Date: 2014-11-14 20:18 (UTC)
From: [identity profile] nikname.livejournal.com
В середине 80-х летали к580. А что там с памятью? Тогда можно было помечать битые куски, как сейчас на флэшках.

Date: 2014-11-14 20:18 (UTC)
From: [identity profile] sab123.livejournal.com
Если ядро сожрало всю память, то система умрет так или иначе.

Date: 2014-11-14 21:25 (UTC)
From: [identity profile] vit-r.livejournal.com
Зависит от того, что делает пользователь или целевое устройство. А то будет как с Ариан 5

Date: 2014-11-14 22:08 (UTC)
From: [identity profile] vit-r.livejournal.com
Ох, если бы всё было "как надо", мир был бы гораздо лучшим местом.

Date: 2014-11-14 22:15 (UTC)
From: [identity profile] dvv.livejournal.com
По-моему, ты Диспак с КРАБом описал.

Date: 2014-11-14 22:34 (UTC)
From: [identity profile] oboguev.livejournal.com
Я вот сейчас уже не помню, а книжку с полки тащить лень: в BSD вообще было понятие working set процесса, т.е. "квоты на память" данного процесса, которую система пыталась удерживать в некоторый пределах, в зависимости от наличия свободной памяти и paging rate данного процесса -- по мере надобности и возможности сжимая или расширяя его working set, а перед тем как решиться на swap-out активных процессов, предварительно trimming их и соседей working sets до некоторого нижнего предела, но пытаясь оставить минимум резидентным? Или там как в Линуксе, один глобальный working set, и если один процесс пострел, то он всё и съел?
Edited Date: 2014-11-14 22:36 (UTC)

Date: 2014-11-14 22:39 (UTC)
From: [identity profile] nikname.livejournal.com
С флэшками можно помечать блоки. А я помню ещё ферритовую на ЕС 1033. Мы ставили ОС МФТ и кусок памяти с ошибкой (16 КБ) накрывали разделом с системным приоритетом. Задачи туда не доходили. Но это - операционка.

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
Неа, не освободится. Проблема же в физической памяти, а не в логической. При утечке в ядре физической памяти делается так мало, что код уже может только заниматься загрузкой-выгрузкой страниц. Следующий процесс загрузится из свопа, чуть-чуть потрешится и точно так же убьется. И так далее.

Date: 2015-01-08 16:20 (UTC)
From: [identity profile] sysmanone.livejournal.com
Ничего там не унаследовали, иначе давно набор костылей был бы сменён на что-то членораздельное.