Запрещаем службе MySQL/MariaDB использовать SWAP

Сколько бы у вас не было ОЗУ и какой бы мощный процессор, все равно все будет упираться в скорость жесткого диска, запросы и таблицы не берем в расчет. Не так давно я заметил, что HDD на сервак очень сильно нагружены, а именно из за того что служба mysql/mariadb лезет в swap


UPD: Будьте осторожны, если у вас закончится swap и ОЗУ могут быть поврежденные данные

Пошуршав в доках mysql нашел интересный параметр --memlock(Lock the mysqld process in memory. This option might help if you have a problem where the operating system is causing mysqld to swap to disk. )
Как раз то что надо, добавляем memlock в конфиг my.cnf, но не спешим радоваться, есть такая штука как ulimit, и по умолчанию там запрещено лочить память больше 16384 кбайт, посмотреть можно командой ulimit -l.

Решение:
Если у вас systemd, идем в каталог /etc/systemd/system ищем там каталог mariadb.service.d или mysqld.service.d если таких каталогов нет, то нужно создать в зависимости от того какой сервер у вас установлен, внутри создаем файл custom.conf с содержимым:
[Service]
LimitMEMLOCK=infinity
Данный параметр разрешает «захватывать» память без ограничений.

Выполняем systemctl system-reload и перезапускаем службу mysql, systemctl restart mysqld

Если до этого mysql лез в swap, то после данных манипуляций больше он это делать не посмеет.
Главное убедитесь что у вас есть достаточное количество ОЗУ для ваших настроек, как все подсчитать есть в интернетах.

Примерная формула:
innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size

Данный скрипт покажет кто использует swap
#!/bin/bash 
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`
    for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done
    if (( $SUM > 0 )); then
        echo "PID=$PID swapped $SUM KB ($PROGNAME)"
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "Overall swap used: $OVERALL KB"

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 31 августа 2020, 15:55
    Let's Encrypt это легко и просто 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    Алексей 19 июня 2020, 15:06
    Обновление Scala Rider G4 34
    Tmks 24 января 2020, 01:05
    Настройка прокси mtproto для Telegram 50
    cloudsv 26 октября 2019, 20:11
    Linux I/O Scheduler, для кого какой? 2
    alex 26 февраля 2019, 11:28
    Установка и настройка minidlna 1
    Георгий 18 декабря 2018, 09:13
    Пароль от резервной копии Bitrix 2
    cloudsv 17 октября 2020, 12:55
    Arch Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 31 июля 2020, 00:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 18:45
    Arch Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 11:00
    Arch Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 19:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 31 июля 2019, 00:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 21:29
    Telegram Полезные боты в Telegram 0