Существует класс приложений, в которые вы никогда не хотите, чтобы они менялись местами. Одним из таких классов является база данных. Базы данных будут использовать память в качестве кэшей и буферов для своих дисковых областей, и нет никакого смысла в том, что они когда-либо будут заменены. Конкретная память может содержать некоторые релевантные данные, которые не нужны в течение недели до одного дня, когда клиент запрашивает их. Без кэширования / замены база данных просто найдет соответствующую запись на диске, что будет довольно быстро; но при обмене вашему сервису может потребоваться много времени, чтобы ответить.
mysqld
включает код для использования ОС / системный вызов memlock
. В Linux, начиная с версии 2.6.9, этот системный вызов будет работать для процессов без полномочий root, которые имеют возможность CAP_IPC_LOCK
[1] . При использовании memlock()
процесс должен все еще работать в пределах ограничения LimitMEMLOCK
. [2] * * +1011. Одна из (немногих) хороших вещей в systemd
заключается в том, что вы можете предоставить процессу mysqld
эти возможности, не требуя специальной программы. Если также можно установить ограничения, как вы ожидаете с ulimit
. Вот файл override
для mysqld
, который выполняет необходимые шаги, включая несколько других, которые могут вам понадобиться для такого процесса, как база данных:
[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK
# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1
# do not kills this process if low on memory
OOMScoreAdjust=-900
# Use higher io scheduling
IOSchedulingClass=realtime
Type=simple
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS
Примечание Стандартное сообщество mysql в настоящее время поставляется с Type=forking
и добавляет --daemonize
в опции к услуге в строке ExecStart
. Это по своей природе менее стабильно, чем описанный выше метод.
ОБНОВЛЕНИЕ Я не на 100% доволен этим решением. После нескольких дней работы я заметил, что процесс по-прежнему требует огромного количества перестановок! Изучая /proc/XXXX/smaps
, отмечу следующее:
- Самый большой вклад в своп - это сегмент стека! 437 МБ и колеблется. Это создает очевидные проблемы с производительностью. Это также указывает на утечку памяти из стека.
- Есть ноль заблокированных страниц . Это указывает, что опция
memlock
в MySQL (или Linux) не работает. В этом случае это не будет иметь большого значения, потому что MySQL не может блокировать стеки памяти.