Найти в Дзене

Linux и виртуальная пямять.

Бывает такое что при обработке большого массива данных приложение аварийно останавливается, в лучшем случае с кодом выхода 1, а иногда и вовсе без него. В данной статье будем посмотреть в виртуальную память линуска и зачем она нужна. Итак, для этой статьи я использую Linux Mint 21 Vanessa и запускаю игру Dayz через Steam Proton (нету у меня ничего больше и требовательнее к пямяти чем Dayz). У меня простенький ноутбук Итак, как видно памяти у меня не хватает и что же происходит при запуске такой программы, на таком ноутбуке? Ну по началу вроде ни чего. Игра запускается и даже подключается к какому ни будь серверу, но при загрузке игрового мира происходит вот что: игра просто закрывается и все. Ни ошибок, ни дыма из кулера, ни чего. Все дело в том что в Linux программы часто хранятся "где попало", т.е. равномерно размазываются по файловой системе, и MMU (блок упарвления памятью) составляет "страницы" с адресными пространствами используемой программы, затем ядро ОС начинает ловко жонг

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

Итак, для этой статьи я использую Linux Mint 21 Vanessa и запускаю игру Dayz через Steam Proton (нету у меня ничего больше и требовательнее к пямяти чем Dayz).

Системные требования игры DayZ
Системные требования игры DayZ

У меня простенький ноутбук

System info
System info

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

Все дело в том что в Linux программы часто хранятся "где попало", т.е. равномерно размазываются по файловой системе, и MMU (блок упарвления памятью) составляет "страницы" с адресными пространствами используемой программы, затем ядро ОС начинает ловко жонглировать этими страницами выгружая или загружая нужные. Таким образом получается что виртуальная память нужна что бы запускать большие и рессурсоемкие программы кусками.

Так почему-же игра "вылетает" если ядро ОС запускает программы по кусочкам? Вся проблема в этих самых кусочках, они могут быть как маленькими так и очень большими. Что бы не допустить утечку памяти в ОС Linux по умолчанию установлена квота на использование виртуальной памяти в 65530 map. Проверить это занчение можно командой

$ cat /proc/sys/vm/max_map_count
Результат работы команды в терминале
Результат работы команды в терминале

Расширить квоту можно так:

$ sudo sysctl -w vm.max_map_count=1048576
Результат работы команды в терминале
Результат работы команды в терминале

Работать такой способ будет до первой перезагрузки!

Есть таблица соответствия maps в мегабайтах:

  • 524288 = 128Гб
  • 1048576 = 256Гб
  • 2097152 = 512Гб
  • 4194304 = 1Тб

Для пермаментного изменения квоты достаточно использовать такую команду:

sudo sh -c 'echo "vm.max_map_count=<custom max_map_count>" > /etc/sysctl.d/99-vm-max-map-count.conf'

Где <custom max_map_count> - это значение maps которое Вам подойдет

После всех выше перечисленных манипуляций Dayz перестал вылетать, ноут, на удивление, не греется ядро нейтронной звезды, и самое главное что увеличение квоты виртуальной памяти не несет негативного влияния на уже запущенные процессы в ОС. Данный способ пременим не только к играм, DayZ я использовал просто как пример загрузки огромных страниц в ядро, таким же способом можно расширить квоту виртуальной памяти что бы можно было жорнглировать огромными массивами данных, например CSV файлом в пару тройку десятков миллионов строк.