Ограничить процессор одного MYSQL процесса
Это относительно простой вопрос, на который, надеюсь, есть простой ответ. Всемогущий гугл пока не очень помогает в этом.
Я веду довольно активный бизнес веб-хостинга. У меня есть клиент, который импортирует довольно большую базу данных (преобразование vbulletin в ipb ~ 4 ГБ), который использует скрипт PHP, чтобы извлечь все из базы данных vbulletin и вставить его в программное обеспечение ipb.
По сути, он покалечивает мой сервер, пока он работает.
Теперь я хотел бы не быть хорошим хозяином и позволять ему делать это, но не по причине других пользователей на моей коробке.
Есть идеи?
9 ответов
Вы можете использовать [re]nice для настройки приоритета процесса - это само по себе не будет "ограничивать", но позволит другим операциям на сервере продолжать работать. Команда renice изменит приоритет запущенного процесса. Из man renice "Полезные приоритеты: 20 (затронутые процессы будут запускаться только тогда, когда больше ничего не нужно в системе), 0 (" базовый "приоритет планирования), что угодно отрицательно (чтобы все шло очень быстро)."
renice N PID
например: renice +5 987, это сделает процесс 987 менее благоприятным для планирования.
Редактировать: я бы не стал арендовать ваш процесс на сервере MySQL, поскольку это, безусловно, повлияет на других пользователей - найдите клиентский процесс MySQL и используйте его вместо этого.
Если рассматриваемый ресурс - процессор, попробуйте cpulimit. cpulimit - это простая программа, которая пытается ограничить использование процессором процессора.
Ссылаться на
http://webupd8.blogspot.com/2009/05/limit-cpu-usage-by-process-linux.html
или же
http://www.cyberciti.biz/faq/cpu-usage-limiter-for-linux/
надеюсь, это поможет
Можно ли не использовать ограничение ресурсов для каждой учетной записи, чтобы ограничить число подключений, которые может установить клиент, и, следовательно, ограничить используемые системные ресурсы. В MySQL 5.0 вы можете ограничить следующие ресурсы сервера для отдельных учетных записей:
- Количество запросов, которые может выполнить учетная запись в час
- Количество обновлений, которые может выпустить аккаунт в час
- Сколько раз аккаунт может подключиться к серверу в час
- Количество одновременных подключений к серверу, которое может иметь учетная запись (по состоянию на MySQL 5.0.3)
"Ницца" - это хорошо знать, как и предлагали другие.
Но вот в чем дело: если вам "приятно" что-либо, кроме самого сервера mysql, то все вставки будут выполняться с приоритетом Mysql, который довольно высок.
Например, если "хороший" скрипт php генерирует массивный оператор INSERT с низким приоритетом, а затем отправляет его на сервер mysql, сервер mysql выполнит эту вставку в своем обычном высокоприоритетном режиме независимо от "милости" PHP скрипт. Это связано с тем, что сервер Mysql - это отдельный процесс со своей привлекательностью и PRI.
С другой стороны, если вам "нравится" сервер MySQL, все операции с БД каждого будут выполняться медленнее. Не хорошо, как указано в других ответах.
Мне кажется, что лучшее решение - попросить этого клиента настроить его PHP-скрипт для вставки небольшими битами (через цикл) и попросить его поместить операторы sleep() в цикл. Вставки будут иметь полный приоритет, но они будут управляемыми по размеру, и тогда оператор sleep должен позволить другому процессу работать и дать базе данных шанс наверстать упущенное.
Если вы привередливы в использовании оперативной памяти, вы можете попросить клиента "сбросить" ненужные переменные непосредственно перед оператором сна.
Если клиент запускает этот скрипт из командной строки, то, в дополнение к вышесказанному, его "приятно" - это, конечно, хорошая идея.
http://dev.mysql.com/doc/refman/5.0/en/user-resources.html посмотрите на это
Nice подходит для того, чтобы позволить процессу использовать только неиспользуемые ресурсы. Если вы действительно хотите ограничить его еще больше, то для пользователя сервера web/db может понадобиться "ulimit".
Изменить: это может быть не очень хорошая идея в конце концов. Я думаю, что установка ulimit приведет к уничтожению процессов, если они превысят пределы.
Это может быть что-то, чтобы рассмотреть на будущее - виртуализация.
Если вы используете что-то вроде OpenVZ или VServer, вы можете ограничить количество процессорного времени, потребляемого каждым виртуальным сервером. Вы можете создать виртуальный сервер, который просто запускает MySQL, а затем ограничить его. Не сильно меняется в противном случае.
Извини за поздний ответ:)
Вот ваше решение: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/ch01.html
ei использовать функцию контрольных групп (cgroups)