Броское название статьи скрывает довольно простой скрипт включения файла подкачки, если основная память уже практически забита.
Минимально необходимое количество оперативной памяти для современных домашних компьютеров составляет примерно 8 гигабайт. Но к сожалению, из-за "ожирения программ" даже этого гигантского количество ОЗУ часто не хватает.
Разные операционные системы распоряжаются ОЗУ по-разному. Но единственным выходом при недостатке ресурсов остаётся использование файла подкачки (SWAP).
В статье "Как ускорить Linux" писал про то, что разные дистрибутивы этой ОС из коробки используют файл подкачки довольно агрессивно. Поэтому рекомендовал установить значение параметра vm.swappiness на минимально возможное. Чтобы вероятность использования файла подкачки тоже была минимальной.
К сожалению, меня лично не устраивает вероятностная модель. Мне по душе "железные" правила использования подкачки. К примеру, разрешать ОС задействовать файлы подкачки только в том случае, если вся оперативная память уже занята. Например, на 90%. Но подобного штатного механизма просто не существует. Поэтому я полностью отключил файл подкачки на своём ПК. И написал небольшой скрипт, который активирует SWAP в случае крайней необходимости:
#!/bin/bash # при каком занятом объёме ОЗУ в % активировать подкачку criticalEnable=90 # при каком занятом объёме ОЗУ в % можно пробовать деактивировать подкачку criticalDisable=75 # занятая ОЗУ в % mem=$(free --mega | head -n -1 | tail -n1 | awk '{print int(0.5+(100*$3/$2))}') # включен ли swap? swapEnabled=$( swapon --show ) if [ "$criticalEnable" -lt "$mem" ] && ! [ "$swapEnabled" ];then # ОЗУ не хватает - активировать подкачку swapon -a fi if [ "$mem" -lt "$criticalDisable" ] && [ "$swapEnabled" ];then # ОЗУ достаточно - нужно попробовать деактивировать подкачку # размер пустого ОЗУ memFree=$( free --mega | head -n -1 | tail -n1 | awk '{print $7}' ) # размер данных в подкачке swapData=$( free --mega | tail -n -1 | awk '{print $3}' ) # если данные из подкачки могут войти в свободное ОЗУ полностью два раза, то деактивируем подкачку if [ "$(( 2*$swapData ))" -lt "$memFree" ];then swapoff -a fi fi
Создайте исполняемый файл /root/swap.sh. Для этого сначала создайте текстовый файл, а потом сделайте его исполняемым с помощью команды "chmod +x /root/swap.sh". И вставьте в него весь этот код.
После чего остаётся только поставить этот файл на выполнение планировщика CRON, раз в минуту. Для этого добавьте в файл /etc/crontab строку с запуском скрипта:
* * * * * root bash /root/swap.sh >/dev/null 2>&1
Скрипт должен запускаться из-под root пользователя, иначе отключить SWAP не получится.
Таким образом раз в минуту будет запускаться скрипт, который будет проверять загрузку ОЗУ. Если загрузка превышает значение "criticalEnable", то выполняется команда включения (swapon -a) всех существующих файлов подкачки в системе. Если это значение падает ниже "criticalDisable", то файлы подкачки выключаются (командой swapoff -a).
У скрипта есть проверка на состояние, чтобы не пытаться отключать уже отключенный файл подкачки или не включать уже включенный.
Во время выключения файлов подкачки вся информация из него копируется обратно в ОЗУ. Поэтому при выключении файла подкачки проверяется условие - размер данных в файле подкачки должен быть минимум в два раза меньше, чем размер свободной ОЗУ. Это нужно, чтобы файл подкачки не активировался опять после деактивации. Логично заметить, что при таком условии удвоенного объёма данных нижний порог отключения должен быть минимум в два раза ниже (относительно 100%), чем порог включения (т.е. "90 и 79" или "80 и 59").
Рекомендую экспериментально проверить на каком уровне заполненности ОЗУ в % происходит зависание компьютера при выключенном разделе подкачки. У меня это значение 94% (7.3 из 7.7 Гб).
Крайне рекомендую установить значение vm.swappiness на минимально возможное (к примеру, vm.swappiness=5) в конец файла /etc/sysctl.conf.
В процессе использования скрипта изменил значения на:
criticalEnable=80
criticalDisable=70
Проблема в том, что скрипт запускается только раз в минуту. А иногда за минуту память успевает забиться на 30 %, поэтому происходит подвисание и приходится ждать окончания минуты, чтобы подключилась подкачка.
Я полагаюсь сведениям только с Вашего интернет-ресурса. У Вас сконцентрированы лучшие из лучших специалисты своего дела.