Разделение CPU гипервизором между VM

CPU steal time (top st) — параметр в top, высокое значение которого указывает на то, что виртуальная машина недополучает CPU от мастер сервера.


 

Виртуальные машины или VM отличаются от физических серверов тем, что получают ресурсы такие как оперативная память и ядра процессора от мастер сервера. На мастере для каждой машины в конфигурационном файле задаются лимиты. Также ограничивается объем диска, который может использовать VM.

 

Параметр top st и CPU steal time

Выделение ресурсов

Диск выделяется для каждой машины жестко, как и оперативная память. Циклы CPU выделяются по другому.

 

Мастер сервер является физической машиной, имеющей какое-то количество ядер. Это может быть 8-12-24 или другое число. Виртуализация предполагает необходимость выделить всем VM ядра, которые те смогут использовать полностью.

 

 

Каким образом выделяются ядра определяется используемым гипервизором: KVM, Xen или другим.

Обычно ограничения для виртуальных машин задаются так, что из консоли (в top) VM можно увидеть все ядра CPU мастер сервера, использовать можно то их количество, которое выделено для машины.

CPU steal time

Современные версии KVM позволяют выделять ядра полностью, а не задавать ограничения. Т.е. в top VM будет отображаться только то, что фактически доступно. Пока это используется редко.

 

Виртуализация почти всегда происходит с Overselling-ом. Т.е. провайдеры продают больше ресурсов, чем есть в на мастер сервере рассчитывая на то, что все виртуальные машины не будут постоянно потреблять все выделяемые ресурсы.



Если на хосте запущено 10 виртуальных машин с одинаковым распределением CPU. Фактически это не означает, что каждая будет всегда получать 10%, гипервизор может варьировать пропорции.

 

Когда на VM множестве запускаются ресурсоемкие приложения гипервизор обнаруживает неспособность дать каждой машине столько CPU, сколько требуется. В таких случаях CPU перераспределяется.


Это означает, что если одни VM нагружают мастер сервер, другие будут недополучать ресурсы за которые их владельцы платят провайдеру.


 

CPU Steal Time, top st

В top st будет расти в двух случаях: если сама VM запрашивает больше ресурсов, чем есть в наличии или если их потребляют соседи по серверу и CPU не хватает.


На скриншоте ниже первый случай, полученный запуском утилиты stress с загрузкой 4 ядер CPU на VDS, которому доступно 2 ядра.

top st

Значение st как можно увидеть — 16,7

 

Steal Time — циклы CPU, которые выделяются гипервизором для задач не связанных с данной VM. Фактически значение возрастает когда CPU загружен, но гипервизор решает выделить ресурсы другим процессам.

При отсутствии операций, загружающих процессор на VM, значение steal time не изменится.

 

Если параметр нужно отслеживать в скрипте удобнее ориентироваться на значение stolen cpu ticks в vmstat -s

vmstat -s

Рост значения будет означать недополучение CPU

Подробную информацию по всем ядрам можно получить просмотрев файл /proc/stat, для восприятия она менее удобна, но в скриптах значение можно проверять и так

root@site:~# cat /proc/stat | grep cpu | awk '{print $9}'

86879
9868
6326
10253
8791
7993
9135
6731
5178
5580
6484
5882
4652

 

Что делать если в top st растет

  • Проверить, какие процессы запущены на машине и не запрашивают ли они больше процессора, чем есть в наличии.
  • Обратиться к провайдеру сервиса и сообщить о проблеме. Некоторые провайдеры отслеживают этот параметр самостоятельно и в автоматическом режиме переразмещют VM на других мастер серверах. По запросу это всегда делается вручную

 

Значение steal time должно быть близким к нулю.

Для веб-серверов снижение количества выделяемых циклов CPU означает потерю производительности. Это снижение скорости вычисления или падение количества запросов, которое может быть обработано в единицу времени, что всегда плохо.

 

О проблемах свидетельствует рост в top st при неизменном потреблении процессами на виртуальной машине. Внимания заслуживают любые значения больше 5.

Отслеживать параметр особенно важно если используется кластеры из нескольких VM и каждая машина должна выполнять такие же функции, как другие за то же время.


Не придавать значения steal time можно только на физических серверах, вообще не использующих виртуализацию.

 

Читайте подробнее про top.