Как определить, занята ли виртуалка: четыре разных вопроса в VDI-пуле

Инженер написал VDI-портал самостоятельно и столкнулся с нетривиальной задачей: как понять, используется ли виртуальная машина. Оказалось, что «занята ли машина» — это четыре разных вопроса, каждый из которых требует своего решения.

Как определить, занята ли виртуалка: четыре разных вопроса в VDI-пуле

Администратору технического отдела понадобился пул виртуальных машин: сотрудников много, а ресурсы гипервизора ограничены. Одновременно работает лишь четверть машин, поэтому держать все включёнными невозможно. Первое очевидное решение — скрипт, который гасит машину по таймауту, — оказалось лишь началом пути, который привёл к созданию полноценного VDI-портала.

Четыре разных вопроса о занятости виртуалки

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

Первый вопрос — активна ли учётная запись пользователя. Если пользователь залогинен в системе, машина, скорее всего, занята. Второй — есть ли активная сессия RDP или SSH. Третий — идёт ли какая-то фоновая работа, например, сборка или тест. Четвёртый — есть ли сетевые подключения, которые указывают на активность.

Каждый из этих вопросов даёт свой ответ, и они могут противоречить друг другу. Например, пользователь может быть залогинен, но оставить машину на ночь — она формально занята, но фактически простаивает. Или на машине идёт длительный процесс, который нельзя прерывать, хотя пользователь уже вышел.

Предыстория и контекст

Инженер не ставил задачу «создать VDI» — он хотел просто автоматизировать гашение простаивающих виртуалок. Начальный скрипт по таймауту работал, но быстро обнаружились узкие места. Например, как отличить пользователя, который отошёл на обед, от того, кто забыл выключить машину на выходные? Как не погасить машину, на которой идёт сборка проекта?

Вместо того чтобы искать готовое решение, инженер начал последовательно решать каждую проблему. Вопросы нарастали, и в итоге получился полноценный VDI-портал: система, которая клонирует виртуалки из шаблона, выдаёт их пользователям и автоматически гасит простаивающие. Переезжать на готовое решение было уже поздно — своё работало и полностью закрывало потребности.

Чем отличается определение занятости по RDP от проверки активности CPU?

Проверка активной RDP-сессии — это один из самых надёжных способов понять, работает ли пользователь прямо сейчас. Если сессия активна, машина точно занята. Но RDP-сессия может быть просто открыта, а пользователь ушёл. Поэтому инженер дополнительно анализирует активность CPU и сети: если нагрузка стабильно низкая в течение длительного времени, машину можно гасить.

Для Linux-машин используется проверка SSH-сессий и процессов. Если пользователь запустил длительную задачу через nohup, машина должна оставаться включённой. Инженер реализовал несколько уровней проверки: сначала активность пользователя, затем системные процессы, затем сетевые подключения. Комбинация этих признаков позволяет точно определить, используется ли машина.

Технические подробности реализации

Инженер создал REST API, который опрашивает каждую виртуалку: проверяет, есть ли активные сессии, какие процессы запущены, какая нагрузка на CPU и сеть. На основе этих данных принимается решение о гашении. Для каждой машины задаётся индивидуальный таймаут — от 15 минут до нескольких часов, в зависимости от типа задач.

Особое внимание уделено исключениям: машины, на которых идут длительные сборки или тесты, не гасятся автоматически. Инженер добавил механизм «блокировок» — пользователь может явно пометить машину как занятую, и она не будет погашена до снятия блокировки. Это решает проблему фоновых задач, которые не видны по активности пользователя.

Кого затронет и как

Эта статья будет полезна администраторам, которые управляют пулами виртуальных машин в небольших и средних компаниях. Подход инженера — не использовать готовый VDI, а написать свой — может показаться необычным, но он демонстрирует, как важно правильно сформулировать задачу. Вместо «нужен VDI» он спросил себя «как понять, занята ли машина?» — и это привело к более гибкому и эффективному решению.

Для разработчиков и DevOps-инженеров статья ценна разбором практических кейсов: как отличать активную сессию от простаивающей, как учитывать фоновые процессы, как избегать ложных срабатываний. В российских компаниях, где часто используются собственные инфраструктурные решения, такой подход особенно актуален.

Что будет дальше

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

Итог

История показывает, что даже тривиальный вопрос «занята ли машина?» может оказаться сложнее, чем кажется. Четыре разных ответа — и каждый требует своего подхода. Если вы управляете пулом виртуалок, не спешите покупать готовый VDI — возможно, вам достаточно скрипта, который делает именно то, что нужно. А если потребности вырастут, вы сможете развить его в полноценную систему, как это сделал автор.