Steal внутри виртуальных машин

Опубликовано August@Karro - чт, 11/05/2020 - 11:37

Что такое steal

Steal  - это метрика, указывающая на нехватку процессорного времени для процессов внутри виртуальной машины. Как описано в патче ядра KVM, steal - это время, в течение которого гипервизор выполняет другие процессы на хостовой операционной системе, хотя он поставил процесс виртуальной машины в очередь на выполнение. То есть steal считается как разница между временем, когда процесс готов выполниться, и временем, когда процессу выделено процессорное время.

Метрику steal ядро виртуальной машины получает от гипервизора. При этом гипервизор не уточняет, какие именно другие процессы он выполняет, просто "пока занят, тебе времени уделить не могу". На KVM поддержка подсчёта steal добавлена в патчах. Ключевых моментов здесь два:

1.   Виртуальная машина узнает о steal от гипервизора. То есть, с точки зрения потерь, для процессов на самой виртуалке это непрямое измерение, которое может быть подвержено различным искажениям.

2.   Гипервизор не делится с виртуалкой информацией о том, чем он занят - главное, что он не уделяет время ей. Из-за этого сама виртуалка не может выявить искажения в показателе steal, которые можно было бы оценить по характеру конкурирующих процессов.

Как вычислить steal

По сути, steal считается как обычное время утилизации процессора. В ядре добавляется ещё один счетчик непосредственно для процесса KVM (процесса виртуальной машины), который считает длительность пребывания процесса KVM в состоянии ожидания процессорного времени. Счетчик берет информацию о процессоре из его спецификации и смотрит, все ли его тики утилизированы процессом виртуалки. Если все, то считаем, что процессор занимался только процессом виртуальной машины. В ином случае информируем, что процессор занимался чем-то еще, появился steal. Подробнее читайте в статье Brendann Gregg.

Как мониторить steal

Мониторить steal внутри виртуальной машины можно как любую другую процессорную метрику. Главное, чтобы виртуалка была на Linux. Windows  такую информацию не предоставляет.

Сложность возникает при попытке получить эту информацию с гипервизора. Можно попробовать спрогнозировать steal на хостовой машине, например, по параметру Load Average (LA) - усредненного значения количества процессов, ожидающих в очереди на выполнение. Методика подсчета этого параметра непростая, но в целом пронормированный по количеству потоков процессора LA > 1 указывает на перегрузку Linux-сервера.

Чего же ждут все эти процессы? Очевидный ответ - процессора. Но иногда процессор свободен, а LA зашкаливает. На самом деле, процессы могут ожидать окончания любой блокировки, как физической, связанной с устройством ввода/вывода, так и логической, например мьютекса. Туда же относятся блокировки на уровне железа (того же ответа от диска) или логики (так называемых блокировочных примитивов).

Ещё одна особенность LA в том, что оно считается как среднее значение по ОС, причём не меньше, чем за минуту. Например, 100 процессов конкурируют за один файл, тогда LA=50. Такое большое значение, казалось бы, говорит, что ОС плохо. Но для криво написанного кода это может быть нормой - плохо только ему, а другие процессы не страдают. Из-за этого усреднения (причём не меньше, чем за минуту), определение чего-либо по LA может закончиться весьма неопределенными результатами в конкретных случаях.

Полная статья


 

Последние материалы