Ограничить процессор одного 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 должен позволить другому процессу работать и дать базе данных шанс наверстать упущенное.

Если вы привередливы в использовании оперативной памяти, вы можете попросить клиента "сбросить" ненужные переменные непосредственно перед оператором сна.

Если клиент запускает этот скрипт из командной строки, то, в дополнение к вышесказанному, его "приятно" - это, конечно, хорошая идея.

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)

Другие вопросы по тегам