Когда бы я ни бегал du -sh
или rsync
Я использую свой диск на 100%. Это вызывает появление медленных запросов mysql, что обычно приводит к зависанию моего сайта.
Есть ли какие-нибудь советы или уловки, позволяющие каким-то образом использовать их для команд, чтобы приоритет доступа к диску оставался за Mysql и другими основными службами?
Да, с ionice
:
ionice -c 3 <pid>
где <pid>
ID процесса, который нужно замедлить. Это установит класс ввода-вывода этой программы на idle
, что означает, что он получит время ввода-вывода, когда его больше ничего не запрашивает.
Ты можешь использовать ionice -c3
в качестве префикса для ваших команд, таким образом, эти команды будут выполняться внутри idle
Класс ввода-вывода, то есть они будут получать время ввода-вывода только тогда, когда оно не требуется другим процессам. Однако это требует, чтобы ваша система использовала планировщик ввода-вывода CFQ. В настоящее время это планировщик ввода-вывода по умолчанию в большинстве дистрибутивов Linux.
Однако такое поведение обычно является признаком чего-то другого. Ваш диск почти заполнен? Это вызывает замедление работы систем с большим количеством операций записи, поскольку все имеет тенденцию к фрагментации. Или у вас есть десятки миллионов маленьких файлов?
У вас есть ядро с включенным PREEMPT? Существуют различные настройки ядра PREEMPT, которые можно включить, чтобы избежать зависаний, например, во время большой нагрузки на диск (возможно, за счет некоторой потери производительности серверных приложений). Сколько по умолчанию включено, зависит от вашего дистрибутива.
В backports Debian теперь есть, например, linux-image-rt-amd64, который включает набор исправлений реального времени PREEMPT_RT. Этот набор исправлений может помочь даже больше, однако у него могут быть свои проблемы ...
Запустите что-то вроде этого, чтобы увидеть, что установлено:
# grep PREEMPT /boot/config-2.6.32-5-amd64 <-- in case of a Debian stable amd64 kernel
Результат:
# CONFIG_TREE_PREEMPT_RCU is not set
CONFIG_PREEMPT_NOTIFIERS=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
Вы можете установить что-нибудь более агрессивное. Посмотрите документацию ядра, которая поставляется с исходным кодом вашего ядра, чтобы узнать, что подойдет вам. И проверьте, какие ядра в вашем дистрибутиве могут иметь более агрессивные настройки PREEMPT. Они могут быть предназначены для использования на рабочем столе и / или в режиме реального времени. Но это не значит, что он не будет работать на сервере. Если они являются частью стандартного дистрибутива, они должны получить обычные исправления безопасности.
В дополнении к ionice (1) rsync может выталкивать блоки, необходимые mysql, из кеша диска. Вы можете исправить rsync с помощью модная поддержка чтобы не помещать данные, прочитанные rsync, в кеш.