форумы  рассылка  download Перейти на новую версию сайта:
www.slackware.ru
Искать    где:    






    
slackware.ru > Дистрибутив > Ядро > oom killer - иметь или не иметь ID:1199
 
2003-12-01 Hudbrog
oom killer - иметь или не иметь
Среди изменений(changelog\'а) 23ого ядра меня привлек пункт, в котором говорилось что убран oom killer. Причем добавлен он был сравнительно недавно. Ну и стало мне интересно что ж это такое. Почитав доки, выяснил что oom killer (в народе очень-очень мудрый киллер) это интеллектуальная система, которая занимается тем, что в случае, когда какому-то процессу не хватает памяти (т.е. в системе ее просто не осталось), он по мудрому алгоритму решает, кого-бы прибить, чтоб эта память освободилась, а ниче важного не убилось. Алгоритм выбора там довольно сложный, и, как правило, шансы что прибьется mysql или apache чтоб запустить mc практически нулевые. А в 23 его убрали со словами, что мол хотите интелектуальную систему - идите под винды. В 23ем же, как я понял, должен убиваться тот самый процесс которому памяти не хватает(последний), а не \"что попало\".
Вот, ну, на самом деле, меня это несколько заинтересовало. Ибо в голову пришла такая мысля - а что если процес, который хочет получить память - тот же mysqld. Ведь его 23ее и прибьет, а это плохо. И я решил проверить одну такую штуку - а не получится ли написать небольшой локальный DoS в этом самом 23ем ядре (сразу скажу, что обычно я подобным не занимаюсь, а сейчас попробовал исключительно в целях сформировать свое представление об oom killer\'е). Собственно идея была такая: допустим, я запускаю процесс, который пытается выделить себе 2гб памяти( с моими 128 + 256свапа), этот процесс, ессно, сдохнет сразу. Если выделять память мелкими кусками чтоб забить ее всю - ессно процес прибьется в любом случае опять таки. А вот, если забрать себе всю память, кроме пары метров - могут быть интересные вещи. Сказано-сделано. Было написано две софтинки. Первая - сам ДоС(назван mem.grabber) - выясняет сколько памяти свободно в системе (и сколько занято кешем), после чего выделяет это количество без пяти мб, потом идет немного колдовства. Вторая программка(daemon) - эмулятор клиентов сетевых =) Занимается тем, что форкает 90 одинаковых процессов, которые подключаются к mysql и с переодичностью в 1 сек. 40 раз делают простенький select запрос. Потом началась самая интересная часть - проверка.
Ядро 2.4.22:
1) запущены Хы, мозила, хчат, mpg321, кучка мелких программок типа часов, миксера, проверки почты и т.п. запускаю mem.grabber. жду пока пройдет магическая часть. пробую запустить mc - убивается грабер.
2) запущены стандартные сетевые сервисы. запускаю mem.grabber, жду. запускаю daemon\'а. Где-то к 40ому клиенту прибивается грабер.
Ядро 2.2.23:
1) запущено все как и в 22ом. ./mem.grabber, жду. пробую запустить mc. Прибивается mc, mem.grabber, все мелкие утилики(часы, почта и т.д.). неприятно.
2) опять чистая консоль. ./mem.grabber, ждемс. Запускаю daemon\'а. Примерно на 20ом клиенте убивается mysqld_safe (вместе со всеми его детьми ессно) и mem.grabber. Причем грабер - после mysql\'а. Вот тут я понял почему надо пользовать именно mysqld_safe. Ибо практически сразу mysql перезапускается автоматически. =)

Небольшое резюме. oom killer в простейших случаях справляется со своей задачей. Вероятно справится и в более сложных, хотя вероятность его ошибки есть. А вот система в 23ем не выдерживает никакой критики. При небольшом усовершенствовании mem.grabber\'а( я уверен на 90%) можно его сохранить работающим(например разбить на несколько процессов, один из которых будет ждать убийства остальных а потом пораждать новые) при убийстве. А вот mysql/apache/squid/любая_прога_порождающая_детей вылетает. И хорошо еще mysql умный. другая бы не запустилась заново. Вот так-то. Так что лично мне в этом плане 22 больше нравица и 23 на серьезные сервера ставить не рекомендую.



оставить комментарий
Как Вы оцениваете эту статью? 
коментарии к статье

 развернуть комментарии (всего 4,персональных 2)