Короткий ответ
Однозначного ответа нет: стратегия зависит от критичности и профиля нагрузки каждой команды (задержко-чувствительные онлайн-сервисы против фоновых batch-задач), допустимого уровня переподписки по CPU/памяти и готовности организации инвестировать в мониторинг и автоматическое масштабирование; решение всегда балансирует между стоимостью простаивающих зарезервированных ресурсов и риском деградации при overcommit.
Как это работает подробнее
Переподписка означает, что сумма заявленных requests/limits процессов превышает физическую ёмкость хоста, в расчёте на то, что не все сервисы используют пиковые значения одновременно; cgroups позволяют реализовать это через комбинацию soft-лимитов (requests/CPUWeight/MemoryHigh), которые гарантируют минимум и allow burst за счёт простаивающих соседей, и hard-лимитов (limits/CPUQuota/MemoryMax), которые защищают от полного исчерпания ресурсов хоста одним сервисом; степень overcommit по CPU обычно выше, чем по памяти, так как память нельзя 'отобрать' у процесса без его убийства, а CPU-время можно просто разделить во времени.
Пример кода
Пример классов обслуживания на хосте:
- guaranteed: requests == limits (критичные онлайн-сервисы)
- burstable: requests < limits, MemoryHigh задан как мягкий порог
- best-effort: без гарантированных requests, низкий CPUWeight/IOWeightЧто использовать на практике
- Практика. вводят классы обслуживания (аналог QoS-классов): критичные сервисы получают resources, близкие к guaranteed (requests ≈ limits, низкий overcommit), а batch/аналитические задачи — burstable или best-effort классы с высоким overcommit по CPU, но жёстко ограниченные по приоритету вытеснения; обязательно нужен постоянный мониторинг фактической утилизации против заявленных ресурсов и регулярный пересмотр лимитов (rightsizing) по историческим данным, а не разовая настройка.
- Компромисс. При одновременном пике нагрузки система в первую очередь троттлит/вытесняет best-effort и burstable классы, оставляя guaranteed-сервисам стабильные задержки — это проверяется управляемым нагрузочным тестом с одновременной нагрузкой на все классы и замером p99 latency критичного сервиса.
Подводные камни
- Риск. вводить overcommit без мониторинга реальной деградации (latency, троттлинг) у критичных сервисов; применять одинаковую политику переподписки ко всем командам без учёта различий в профиле нагрузки; не закладывать процесс пересмотра лимитов по мере роста нагрузки, что приводит либо к хроническому недоиспользованию оборудования, либо к систематическим инцидентам 'шумного соседа'.