У меня была проблема с процессом, порождающим очень много потоков из-за ошибки, съедающей память, вызывая тяжелую подкачку к разделу подкачки. Таким образом, я отключил подкачку - что в любом случае рекомендуется для кластеров серверов - чтобы программа с ошибками вылетела раньше. К моему удивлению, это совсем не улучшило ситуацию! Точно так же установка 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
настраиваемый.