Существует класс приложений, в которых вы никогда не захотите их менять местами. Один из таких классов - база данных. Базы данных будут использовать память в качестве кешей и буферов для своих дисковых областей, и совершенно не имеет смысла помещать их в свопинг. В конкретной памяти могут храниться некоторые важные данные, которые не нужны в течение недели, до тех пор, пока клиент не попросит об этом в один прекрасный день. Без кеширования / подкачки база данных просто нашла бы соответствующую запись на диске, что было бы довольно быстро; но при обмене ваша служба может долго реагировать на запросы.
mysqld
включает код для использования OS / системного вызова memlock
. В Linux, начиная с версии 2.6.9, этот системный вызов будет работать для некорневых процессов, которые имеют возможность CAP_IPC_LOCK
[1]. При использовании memlock()
процесс должен по-прежнему работать в пределах LimitMEMLOCK
лимита. [2]. Одна из (немногих) хороших черт systemd
заключается в том, что вы можете предоставить процессу mysqld
эти возможности, не требуя специальной программы. Если также можно установить rlimits, как и следовало ожидать от 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 не может использовать стек блокировки памяти.
person
Otheus
schedule
15.06.2016