Steal Time и Load Average — вещи, которые линукс-админ видит ежедневно, но мало кто закапывается под капот и понимает, как оно устроено.
Кирилл Казарин, Senior DevOps и SRE менеджер, спикер нашего курса «Администрирование Linux.Мега», рассказал, что такое Steal Time: что это за метрика процессора, как она работает и как её понимать. Давайте разбираться:
Что такое Steal Time
Steal Time (или "steal time") — это термин, который используется в контексте виртуализации и операционных систем, чтобы описать время, которое виртуальная машина (VM) ожидает доступа к физическому процессору, потому что этот процессор в данный момент используется другой виртуальной машиной.
В системах виртуализации несколько виртуальных машин могут работать на одном физическом сервере, разделяя его ресурсы — процессоры (CPU), память и устройства ввода-вывода.
Гипервизор (программное обеспечение, управляющее виртуальными машинами) распределяет ресурсы между виртуальными машинами, определяя, какой VM и когда предоставить доступ к физическому процессору.
Steal time возникает, когда виртуальная машина готова выполнять задачи и запрашивает доступ к процессору, но гипервизор откладывает выполнение этих задач, так как в этот момент физический процессор занят выполнением задач другой виртуальной машины. Проще говоря, это время, в течение которого виртуальная машина "украдена" от процессора другим виртуальным окружением.
Почему стоит об этом знать
Потому что в 2024 году бОльшая часть серверов — это виртуальные машины. Если вы пользуетесь каким-то публичным облаком — то и подавно. Я, например, последний раз работал с "железным" сервером лет 5 назад. С тех пор только виртуалки.
Что такое этот тайм мы поняли, но как он считается? Как ВМ может узнать что-то о ситуации за ее пределами?
Виртуальная машина (VM) сама по себе не отслеживает время ожидания доступа к физическому процессору. Вместо этого, гипервизор (виртуализирующее программное обеспечение, управляющее виртуальными машинами) контролирует использование CPU и предоставляет виртуальной машине информацию о steal time.
Как это работает
1. Роль гипервизора
Гипервизор управляет распределением физических ресурсов, таких как процессор
(CPU), между несколькими виртуальными машинами, которые работают на одном
физическом сервере. Когда виртуальная машина хочет выполнить какую-либо задачу,
она запрашивает доступ к CPU.Гипервизор решает, когда и какой виртуальной машине
предоставить этот доступ.
Ожидание доступа:
Если в данный момент все доступные CPU заняты выполнением задач других виртуальных машин, гипервизор помещает запрос текущей виртуальной машины в очередь ожидания. В это время виртуальная машина не получает доступ к физическому процессору и, соответственно, не может выполнять свои задачи. Гипервизор "крадет" (steal) время у этой виртуальной машины, предоставляя ресурсы другой.-
Отслеживание steal time:
Гипервизор отслеживает время, в течение которого каждая виртуальная машина находится в состоянии ожидания, потому что CPU занят выполнением задач других VM. Когда виртуальная машина получает управление процессором, гипервизор может сообщить ей, сколько времени она провела в ожидании доступа к CPU. Это время и называется steal time.
Передача информации в виртуальную машину:
Гипервизор предоставляет информацию о steal time операционной системе, работающей внутри виртуальной машины. Эта информация передается через специальный интерфейс — paravirtualization (paravirtualized CPU). В операционной системе виртуальной машины steal time может быть доступен через стандартные инструменты мониторинга, такие как top, vmstat и другие, которые просто интерпретируют данные, предоставленные гипервизором.
Чувствуете, как глубока кроличья нора?)
Что такое Paravirtualization
Paravirtualization — это особый метод взаимодействия между виртуальной машиной и гипервизором, который позволяет передавать информацию о производительности
и ресурсах напрямую в операционную систему внутри виртуальной машины.
1. Paravirtualization (Paravirt):
Paravirtualization — это технология, которая позволяет гипервизору предоставлять виртуальным машинам более точное представление о состоянии их виртуализированного окружения, включая такие показатели, как steal time. В случае steal time гипервизор предоставляет ядру Linux внутри виртуальной машины информацию о том, сколько времени процессор был недоступен из-за того, что гипервизор выполнял задачи других виртуальных машин.
2. Передача steal time через KVM (или другие гипервизоры):
Наиболее распространенные гипервизоры, такие как KVM (Kernel-based Virtual Machine), VMware, Xen или Hyper-V, используют специальные интерфейсы для передачи информации о steal time. В случае KVM информация о steal time передается через виртуализированный процессор (vCPU), который сообщает ядру Linux о времени, которое было "украдено" у виртуальной машины.
3. Интеграция с ядром Linux:
В ядре Linux существует код, который интегрируется с механизмом paravirtualization и обрабатывает информацию о steal time. Этот код был добавлен в ядро Linux в рамках реализации поддержки paravirtualized CPU. Когда Linux ядро получает данные о steal time, оно обновляет соответствующее значение, которое затем может быть использовано системными инструментами для мониторинга.
4. Пользовательские инструменты мониторинга:
Информация о steal time затем доступна через стандартные утилиты мониторинга, такие как top, htop, vmstat и другие. Эти утилиты получают данные о steal time из /proc/stat — специального файла, который ядро Linux обновляет в реальном времени. Например, в top вы можете увидеть steal time в колонке %st.
Как это работает в ядре
Ниже приведён пример кода из ядра Linux, который связан с обработкой steal time.
Этот код находится в файле kernel/sched/cputime.c - файле, который отвечает за учет времени процессора, включая steal time.
Например:
https://github.com/torvalds/linux/blob/master/kernel/sched/cputime.c#L211
https://github.com/torvalds/linux/blob/master/kernel/sched/cputime.c#L253
Скрытый текст
Больше тонкостей и деталей по знанию и администрированию Linux – на нашем курсе «Администрирование Linux.Мега». Присоединиться к текущему потоку можно до 15 сентября включительно. Видеокурс «Ansible: Infrastructure as Code» к этому потоку даём в подарок. А больше полезных материалов лично от Кирилла — в его телеграм-канале.
kitako4
"...Когда виртуальная машина хочет выполнить какую-либо задачу,она запрашивает доступ к CPU..."
Как машина, еще не имея доступа к CPU может что-то выполнить, в том числе "запросить"? Что значить "хочет"? Непонятные объяснения.
geher
Я это реревел с русского на русский пимерно так: "Гипервизор рещает (исходя из текущего состояния ВМ, например, не поставлена ли она на паузу, не ждет ли ответа от железки), что ей можно и поработать, и выставляет по этому поводу запрос от имени ВМ на доступ к процессору".
kakazarin
да, можно и так сформулировать, спасибо!
kakazarin
если кратко
- если вм не имеет доступа к CPU то она не запустится совсем и разговаривать нечего
- почти такая же сиутация будет в случае если оверселинг очень высок и фактически вм не дают времени поработать.
в обоих этих ситуациях нам не важно значение steal time - мы де факто не работаем.
это значеие важно когда мы работаем - когда мы свободно имеем доступ к цпу с тз виртуальной машины.
но тк может присутствовать эффект оверселинга, чтобы администратор VM мог его отследить и введено это понятие.
надеюсь так понятнее