Обычно у провайдеров используется модифицированный под себя линуксовый
kvm.
Там уже есть куча механизмов разделения ресурсов:
1. Можно делить тупо софтварно по времени. Допустим выделять сколько то микросекунд на одного гостя, когда его таймаут проходит, он вытесняется планировщиком, ставится на паузу, сохраняет контекст и закидывает на исполнение следующего.
2. Можно по VM-exit'у какой-то инструкции, например x86
MWAIT и её аналогов, которые означают, что гостю сейчас не нужны ресурсы, он чего-то ждёт, и их можно отдать другому.
3. Можно привязываться к гостевым таймерам через external-interrupt exiting и решать на их основе.
4. Можно при соответствующей поддержке процессором воспользоваться более жёстким preemption timer'ом, который даст vm-exit по дедлайну.
5. Делить софтварно, но через более точное что-то, типа TSC deadline.
6. Так же можно использовать уже существующие линуксовые cgroups для квотирования, но проще самому написать шедулер, чем разбираться в этом поделии.
Вариантов миллион, только их нужно изучать, просто так накрутить настройками практически нереально, нужно доскональное понимание работы гипервизора, чтобы впустую не тратить кучу ресурсов.
А вообще, есть вопрос:
нахрена оно тебе на личном сервере? Если ты не провайдер, которому нужно делить ресурсы между сотнями гостевых систем, тебе это не нужно. Закручивай процессы через обычную контейнеризацию, которая из коробки в линуксах есть и не парься.