Что такое stolen CPU

В эпоху Amazon и DigitalOcean мы все сильно привыкли к использованию виртуальных узлов. Это удобно и быстро.

Виртуальный сервер работает также как и физический — у него есть процессор, оперативная и постоянная память.

Гипервизор и выделение ресурсов

Важным (и единственным) отличием виртуального сервера от физического является то, что все ресурсы выделяются ему другой программой (обычно называется гипервизором) — компонентой платформы виртуализации.

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

Если на виртуальных узлах становится слишком много задач, гипервизор перераспределяет ресурсы таким образом, чтобы обеспечить выполнение максимального количества задач. Как это выглядит на практике? Вы арендуете виртуальный сервер. Но на том же физическом оборудовании арендуют виртуальные сервера еще 25 человек. В какой-то момент времени часть (или все) из них начинают напрягать процессор (например, происходят всплески посетителей на сайтах). И тогда вы замечаете, что ваш сервер начал работать медленнее.

Stolen CPU

Если виртуальный узел начал тупить, первым делом нужно понять где проблема — у вас или у гипервизора. Для этого существует показатель Stolen CPU. Его можно легко увидеть, выполнив команду top:

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

Stolen CPU — это количество времени, которое виртуальный сервер ждет процессорных ресурсов от гипервизора

Суммарное время в состоянии Stolen будет доступно в статистке процессора:

root@node:~# cat /proc/stat
cpu  704818582 1283 95229455 732476824 1717222 8296 30114918 12043519 0 0

# числа — это количество времени, которое процессор проводит в разных состояниях

Восьмое число слева — это суммарное время в состоянии Stolen.

Что делать, если Stolen CPU высокий

Нормальный показатель не должен превышать 1...2%. Если же показатель > 5%, это плохо. Платформа перегружена и любой рост нагрузки приведет к усугублению ситуации. В этом случае у вас есть два варианта:

  • Создать новый виртуальный узел и мигрировать на него. В этом случае, новый узел скорее всего попадет в другой сектор, где проблем быть не должно. Однако гарантий не сможет дать даже провайдер.
  • Переехать на физический сервер. Это гарантирует выделение ресурсов, однако придется позаботиться о фейловере таких узлов.

В .io мы используем сотни виртуальных узлов, которые обрабатывают более 10 Тб данных каждый день. Обработка данных подразумевает использование больших процессорных мощностей. Когда мы впревые столкнулись с проблемой Stolen CPU, мы увидели почти катастрофическую картинку — сервер внезапно начал работать крайне медленно:

При этом показатель Stolen CPU обычно скакал от 1...2 до 20%. В момент появления проблемы он вырос почти до 30% и не падал ниже 20%:

Мы приняли решение перенести часть инфраструктуры на физическое железо. В чем получили ряд преимуществ:

  • Это дешевле в 2.5 раза.
  • Мы больше не зависим от внезапных скачков нагрузки на платформе виртуализации.
  • Современные датацентры предоставляют много удобных сервисов для работы с физикой (failover ips, локальные сети, управляемые установки ОС и т.п.)

TL;DR

Если вы работаете с виртуальным железом обязательно мониторьте показатель Stolen CPU (виден в top). Если этот показатель постоянно > 5%, создайте новый сервер и мигрируйте на него. Если проблема наблюдается постоянно, рассмотрите возможность переезда на физическое железо.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень