У меня проблемы с убийцей OOM на одной из моих установок Linux (2.6.37). В компьютере 4 ГБ памяти, которую я иногда использую полностью. В таких случаях я ожидаю, что обработчик OOM придет и выполнит свою работу, убив один или два процесса. Вместо того, чтобы делать это или, возможно, при попытке сделать это, система блокируется, выполняя дисковый ввод-вывод, как будто завтра не наступит. Вот в чем дело: у меня НЕ включена свопинг. По какой-то причине моя система без подкачки все еще блокируется из-за огромного количества дисковых операций ввода-вывода, даже несмотря на то, что надлежащий курс действий - просто убить один или два процесса. Мысли?
Вся проблема заставляет меня задуматься, требует ли Linux каким-либо образом подкачки, о которой я не знаю. Мы будем очень признательны за объяснение того, так ли это и почему. Я знаком с идеями подкачки на концептуальном уровне (т.е. виртуальная память, разбиение на страницы, чрезмерная фиксация), но мне интересно, есть ли какие-нибудь детали реализации, которые я мог пропустить.
Настоящий вопрос в том, почему вы работаете без свопа? Особенно, если вы наблюдаете (серьезные) проблемы с производительностью, связанные с нехваткой оперативной памяти? Вы же знаете, что отсутствие подкачки действительно может замедлить работу вашей системы, верно?
Очевидное решение - добавить немного места для подкачки, чтобы ваша система не перебивала вас. Учитывая, насколько дешево дисковое пространство, я не могу придумать ни одной типичной ситуации1 где ты должен Когда-либо построить систему без свопа.
Что касается ответа на ваш вопрос, я не помню всех низкоуровневых деталей того, почему своп важен даже в системах, где вы не собираетесь исчерпывать память, но в списке рассылки ядра Linux были аргументы о том, разумно запускать системы без свопа (и однозначных ответов не так много). По общему мнению, обычно всегда есть своп, и при необходимости отрегулируйте замену.
Кроме того, я думаю, что вы неправильно понимаете некоторые важные оговорки, касающиеся убийцы Linux OOM. Во-первых, полагаться на него для решения проблем с нехваткой памяти - очень плохая идея (tm). Он может быть очень неразборчивым в отношении того, что он убивает, и вполне возможно, что у вас останется нестабильная или даже непригодная для использования система. Да, он пытается убить недавние процессы, которые потребляют много памяти (небольшая гарантия, чтобы попытаться поймать убегающий процесс), но нет никаких гарантий. Я видел, как он убивает ssh, уничтожает процессы Xen (на виртуальном хост-сервере Xen, что приводит к сбою виртуальных машин), и в одном случае он убивает NFS.
Что касается ввода-вывода. . . Я не знаю наверняка, чем это было вызвано. Возможно, была остановлена файловая система или процесс, связанный с диском? Возможно, в процесс встроена какая-то функция «кэш-диск», когда он не может выделить достаточно памяти?
Еще одно замечание: если это рабочий стол, для приостановки на диск требуется свопинг. Если это сервер, полагаться на OOM - это никогда хорошая идея, поскольку она ставит под угрозу стабильность, ну, ну, вообще без уважительной причины.
[1] Встроенные системы - это единственное очевидное исключение, и они не особо распространены (и если вы имеете дело со встроенными системами, вы уже будете знать о требованиях).
Я думаю, что AndreasM ударил его по голове (причина того, что диск перегружен). Исполняемые файлы выгружаются по запросу - так что при нормальной работе у вас будет почти все ваши исполняемые файлы и библиотеки, которые будут находиться в старой доброй физической памяти. Но когда ОЗУ заканчивается, но недостаточно для запуска средства защиты от нехватки памяти, эти страницы удаляются из ОЗУ. Таким образом, вы получаете ситуацию, когда страницы вытесняются - поначалу это не проблема, потому что они выселяются первыми из наименее недавно использованных, и это удаляет страницы, которые вы все равно не используете. Но затем он выгоняет тех, кого вы являются используя, просто чтобы вернуть их обратно через несколько мгновений. Трэш-сити.
По сути, если бы что-то использовало немного больше ОЗУ, вы, вероятно, задействовали бы убийцу OOM, но вас еще не было. Как уже говорили некоторые, OOM killer неизбирательный, это скорее последнее средство, позволяющее избежать паники ядра, чем то, что вы должны использовать в нормальных условиях. Если у вас есть какие-то индивидуальные настройки, я бы подумал о написании какого-нибудь демона для мониторинга свободной памяти и уничтожения с использованием выбранной вами политики, когда она приближается к полной.