Почему Linux перестает отвечать на запросы при использовании большого объема памяти (OOM не может быть запущен)

Мне это нужно так часто, что я написал плагин для упрощения и обеспечения максимальной скорости:ReplaceWithRegister .

Этот плагин предлагает команду «два -в -одну gr, которая заменяет текст, покрытый {движением} / текстовым объектом, всю строку (с )или текущий выбор содержимым регистр; старый текст удаляется в регистр черной дыры -, т.е. его нет. Он прозрачно обрабатывает многие крайние случаи и позволяет быстро повторить с помощью стандартной команды .. Если вам это не нравится, на его странице есть ссылки на альтернативы. (Он работает точно так же, как фрагмент кода @s1n7az, но в качестве плагина он более сложен и надежен.)

0
08.06.2020, 12:40
1 ответ

Основная причина проблемы заключается в том, что убийца OOM активируется только в том случае, если при попытке запустить все процессы не удается продвинуться вперед. Обратите внимание, что «прогресс вперед» рассматривается как некоторая часть памяти, которая может быть постоянно доступна, где «непрерывно» — это как минимум 4 КБ дополнительной ОЗУ после однократного сканирования всей структуры таблицы страниц виртуальной памяти.

В наихудшем случае поведение требует постоянного сканирования этой структуры так долго, что кажется, что система зависает, потому что для этого прогресса нет ограничения по времени, и пока подсистема памяти может двигаться вперед, она будет пытаться продолжать работу, хотя очень медленно. Сканирование всей памяти может занять до 0,5 секунды, а в худшем случае продвижение вперед приводит к 4 КБ свободной памяти. Если система действительно нуждается, например. 20 МБ для повторного -рендеринга дисплея потребовалось бы около 2500 сканирований памяти, а это заняло бы более получаса. Очевидно, что система, в которой одно обновление экрана занимает полчаса, эквивалентна полностью зависшей системе для пользователя, даже если ядро ​​​​довольно прогрессом.

Я думаю, что лучшим вариантом было бы разрешить указывать максимальную задержку для подсистемы памяти, и убийца OOM автоматически активировался бы, когда задержка становится слишком высокой (, например.подсистема управления памятью должна обеспечивать не менее 100 МБ свободного места в секунду, в противном случае состояние системы следует рассматривать как нехватку ОЗУ ). Проблема с earlyoomили другими подобными решениями заключается в том, что для того, чтобы избежать наихудшего поведения при сильно пиковых нагрузках, эти решения требуют очень широких запасов безопасности, которые заставляют вас тратить ОЗУ на запасы безопасности.

0
24.08.2021, 14:36

Теги

Похожие вопросы