Назад | Перейти на главную страницу

Как предотвратить перегрузку ввода-вывода ядра при отсутствии памяти подкачки в Linux?

У меня была проблема с процессом, порождающим очень много потоков из-за ошибки, съедающей память, вызывая тяжелую подкачку к разделу подкачки. Таким образом, я отключил подкачку - что в любом случае рекомендуется для кластеров серверов - чтобы программа с ошибками вылетела раньше. К моему удивлению, это совсем не улучшило ситуацию! Точно так же установка vm.swappiness до 0 не помогло. iotop показал тяжелый чтение с диска (записи почти нет).

Я подозреваю, что ядро ​​Linux все еще меняет местами кодовые страницы в памяти и перечитывает перезаписанные кодовые страницы с диска, когда они нужны. Когда ОЗУ очень мало, это происходит очень часто, вызывая перебои, в результате чего компьютер почти не отвечает.

Как предотвратить эту досадную и потенциально опасную ситуацию? Я попытался отключить подкачку, cgroups для ограничений памяти и ЦП для этого процесса и ulimit для max. 30 процессов. Ничто даже не улучшило ситуацию. (Что ж, это не совсем так: ограничение ОЗУ, из-за которого сотни МБ оставались неиспользованными, действительно помогло.)

В частности: Могу ли я предотвратить перестановку сегментов кода в памяти и позволить процессу, запрашивающему RAM, просто получить NULL для своего следующего malloc?

Как насчет настройки учета избыточной фиксации памяти и установки для нее варианта 2 (не выполнять избыточную фиксацию) вместо параметра по умолчанию 0 (эвристическая избыточная фиксация)? Описание этого состояния

Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable amount (default is 50%) of physical RAM.
Depending on the amount you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.

Приведенный выше фрагмент взят из документация ядра

Политика может быть установлена ​​с помощью vm.overcommit настраиваемый.