Linux ядро не может мягко обрабатывать ситуации с нехваткой памяти

Известна проблема, которая донимает множество людей на протяжении многих лет и которую можно воспроизвести меньше, чем за несколько минут на последней версии ядра Linux 5.2.6. Все параметры ядра установлены в значения по умолчанию.

Шаги:

  • Загружаемся с параметром «mem=4G».
  • Выключаем поддержку swap (sudo swapoff -a).
  • Запускаем любой веб браузер, например, Chrome/Chromium или/и Firefox.
  • Начинаем открывать вкладки с сайтами и смотрим как уменьшается объём свободной памяти.

Как только возникает ситуация, что новая вкладка требует больше оперативной памяти, чем доступно, система практически полностью зависает. Вы даже с трудом сможете двигать курсором мыши. Индикатор жёсткого диска будет моргать без остановки (мне не ясно почему). Вы не сможете запустить новые приложения или закрыть текущие запущенные.

Этот маленький кризис может продолжаться минуты или дольше. Я предполагаю, что система не так должна себя вести в этой ситуации. Я думаю, что что-то нужно сделать, чтобы избежать такие «зависания».

Я почти уверен, что можно поменять некоторые параметры sysctl, чтобы избежать подобную ситуацию, но что-то подсказывает, что это можно сделать по умолчанию для всех, потому что нетехнические пользователи, столкнувшись с такой проблемой, просто откажутся от использования Linux и им будет не того, чтобы искать решения в Google.

В комментариях на Reddit некоторые пользователи предлагают включить swap, но это не решает проблему, а только её отодвигает и часто усугубляет. В качестве возможного решения в будущем может быть привлечена появившаяся в ядре 4.20 и улучшенная в ядре 5.2 подсистема PSI (Pressure Stall Information), которая позволяет анализировать информацию о времени ожидания получения различных ресурсов (CPU, память, ввод/вывод). Данная подсистема даёт возможность организовать отслеживание нехватки памяти на ранней стадии, определять источник проблем и завершать неважные приложения, не доводя до появления заметных пользователю эффектов.

©  OpenNet