Debian.pro/

Про Debian


Debian, KVM. Лимит потребления процессора с иммунитетом к перезагрузке VDSа. KVM Mhz limit. KVM CPU limit.

UPD от 16 августа 2011: переписали скрипт, убрали проблему с именами виртуалок. Спасибо Gremlin’у за реализацию.

Сразу оговорюсь, что «KVM mhz limit» в заголовок было добавлено только ради поисковиков. На самом деле мы не можем лимитировать количество мегагерц нашего контейнера.
Лимитировать мы будем процессорное время.
Для начала моё имхо. Не делайте этого. Не надо. Не стоит портить этот идеал производительности.
От наших действий ядро виртуальной машины не начнёт понимать, что его ограничивают. И будет пытаться использовать дополнительные ресурсы. И будет получать по носу. И так раз за разом. Так же, пользователь VDSки не сможет увидеть сколько он действительно потребляет CPU. Он увидит только то, насколько загружены ядра физического процессора, к которым имеет доступ VDS.
Тем не менее ограничивать их на постоянной основе можно и я расскажу как.

Решение, что логично, основано на cpulimit (aptitude install cpulimit не забудьте). А значит, вам стоит почитать про то, как работает и что делает cpulimit.
Для начала установим скриптик, который будет делать за нас грязную работу по определению PIDа виртуалки и натравливанию на этот PID cpulimit’а.
Debian:~# wget -O /usr/bin/vdscpulimit "http://debian.pro/files/scripts/vdscpulimit" && chmod +x /usr/bin/vdscpulimit && chmod 755 /usr/bin/vdscpulimit
Теперь мы можем сделать финт ушами, например:
Debian:~# vdscpulimit vds32 50
Process 9990 detected

Где vds32 — имя виртуалки (-n в virt-install), а 50 — количество процессорного времени, которое мы выделяем виртуалке. 100 = 1 ядро. 800 = 8 ядер процессора. 50 = половинка одного ядра. 150+разрешение пользоваться двумя ядрами физического хоста — некоторая свобода действий для виртуалки (может быть 50+150, 75+75 и т.д. процентов от каждого из ядер). Если вы ещё не поняли этого абзаца — срочно дочитывайте мануал про cpulimit.

Что с этим делать… ну.. хм.. решать вам. Можете запихать в крон попробовать.
Я же открываю несколько скринов (screen, ctrl+a c, ctrl+a c, ctrl+a c, ctrl+a c — в общем ман по скрину сами найдёте) и запускаю в них вот такую конструкцию:
Debian:~# while [ 1 ]; do vdscpulimit vds32 50; done
Когда VDS перезагрузится — процесс cpulimit так же остановится. А потом while натравит его на новый PID VDSки.

Резать научили. Как же теперь их расселять?
А очень просто.
Имеем vds31 и vds32. Каждому из них нужно выделить по половинке ядра.
Debian:~# virsh vcpupin vds31 0 3
Debian:~# virsh vcpupin vds32 0 3

Поясню. Сейчас мы заставили виртуальные CPU серверов vds31 и vds32 «являться» физическим процессором номер 3 (нумерация с нуля). То есть нулевой процессора на vds31 — фактически есть 3й процессор физического сервера и нулевой процессора на vds32 — фактически есть 3й процессор физического сервера.

Всё. Теперь уже натравливаем мой скрипт в цикле на обе вдски и радуемся.

Почему я не стал развивать идею сильнее? Решение — костыльное. Просмотреть скрипт вы можете и сами по адресу http://debian.pro/files/scripts/vdscpulimit и дописать, как следствие, тоже. Можете внести туда цикл…. Да что хотите делайте с ним) Просто мне удобнее запускать именно так, как я написал выше (с while в screen).


Комментарии (7):

  1. Я так понял с limits не получилось.
    Но КРУТО теперь можно хоть и таким способом ограничивать.
    А не знаешь что там редхатовцы еще не думають сделать ограничение нормальное.?

  2. > Я так понял с limits не получилось.
    Я бы сказал, что в UserMode Vdsки не очень хорошо работают (при запуске не от рута). Точнее там проблем с сетью.

    > А не знаешь что там редхатовцы еще не думають сделать ограничение нормальное.?

    И никогда не будут, вероятнее всего в рамках KVM.

  3. ХМ странно. Я думал всетаки они допилят квм.

  4. cronfy :

    А как разместить два процесса kvm на одном процессоре без использования virsh?

  5. libvirtd должен препяствовать этому. Да и администратор ВДСки увидит такое.

    Вообще — в /etc/libvirt/qemu/vds_name.xml

    Сразу оговорюсь — сам не пробовал.

  6. Дмитрий :

    А что думаете по поводу использования taskset для «закрепления» процессов KVM за отдельными ядрами CPU?

  7. Плохо я об этом думаю.

Написать комментарий