Запрещаем службе 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"

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

    Авторизация

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

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 26 октября 2024, 11:31
    MySQL Workbench падает при подключении 4
    Diego mont 25 мая 2023, 07:04
    Полезные боты в Telegram 2
    cloudsv 24 апреля 2023, 17:56
    Обновление Scala Rider G4 52
    cloudsv 12 ноября 2022, 19:16
    Установка и настройка minidlna 3
    cloudsv 03 ноября 2022, 03:42
    Настройка прокси mtproto для Telegram 52
    cloudsv 03 января 2022, 10:50
    Let's Encrypt это легко и просто 4
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    cloudsv 07 августа 2023, 22:56
    Linux Asus ROG x13 flow 2022 GV301RE и Linux 0
    cloudsv 15 апреля 2023, 16:23
    Linux Уведомление о смены workspace в X11 Linux 0
    cloudsv 17 октября 2020, 09:55
    Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 30 июля 2020, 21:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 15:45
    Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 08:00
    Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 16:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 30 июля 2019, 21:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 18:29
    Telegram Полезные боты в Telegram 2