Перейти до вмісту

Модуль 5.2: Планування CPU

Hands-On Lab Available
Ubuntu advanced 35 min
Launch Lab ↗

Opens in Killercoda in a new tab

Продуктивність Linux | Складність: [MEDIUM] | Час: 30–35 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після завершення цього модуля ви зможете:

  • Пояснити, як працює планувальник CPU в Linux (CFS, nice values, CPU affinity)
  • Діагностувати конкуренцію за CPU за допомогою mpstat, pidstat та perf
  • Налаштувати CPU pinning та ліміти CPU cgroup для навантажень, чутливих до продуктивності
  • Оцінити, чи навантаження обмежене CPU, I/O чи пам’яттю

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Коли ваш под у Kubernetes “гальмує” (throttled) або застосунки працюють повільно попри наявність вільних ресурсів — у справу вступає планувальник (scheduler). Розуміння того, як Linux розподіляє час процесора, пояснює, чому ліміти CPU в Kubernetes працюють саме так.

Розуміння планування CPU допоможе вам:

  • Вирішувати проблеми з CPU throttling — чому под повільний при низькому завантаженні?
  • Правильно встановлювати ліміти — різниця між requests та limits.
  • Аналізувати продуктивність — чому load average та %CPU кажуть про різне.
  • Оптимізувати навантаження — підбирати розміри контейнерів на основі їх реальної поведінки.

Load average — це кількість процесів, які хочуть працювати (чекають на CPU) або чекають на ввід/вивід (I/O).

┌─────────────────────────────────────────────────────────────┐
│ LOAD AVERAGE │
├─────────────────────────────────────────────────────────────┤
│ │
│ 4-ядерна система, load average = 4.0: │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ П1 │ │ П2 │ │ П3 │ │ П4 │ ← 4 процеси працюють │
│ │CPU 0│ │CPU 1│ │CPU 2│ │CPU 3│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ Load = 4.0 = Ідеальна утилізація │
│ │
│ 4-ядерна система, load average = 8.0: │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ П1 │ │ П2 │ │ П3 │ │ П4 │ ← 4 працюють │
│ │CPU 0│ │CPU 1│ │CPU 2│ │CPU 3│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ Черга: [П5] [П6] [П7] [П8] ← 4 чекають │
│ │
│ Load = 8.0 = 100% завантаження + 100% черга │
│ │
└─────────────────────────────────────────────────────────────┘

Як Kubernetes транслює CPU в Linux

Розділ «Як Kubernetes транслює CPU в Linux»

Kubernetes використовує абстракцію “міліядра” (millicores), але Linux про них нічого не знає. K8s перетворює ваші налаштування в параметри cgroups:

KubernetesLinux cgroupsМеханізм
cpu: "100m" (request)cpu.shares = 102Відносна вага (пріоритет)
cpu: "500m" (limit)cpu.cfs_quota_us = 50000Жорстке обмеження часу

Shares (requests):

  • Гарантований мінімум під час конкуренції.
  • Якщо CPU вільний, под може використовувати хоч 100%, навіть якщо реквест малий.

Quotas (limits):

  • Жорстка “стеля”.
  • Навіть якщо CPU вільний на 90%, под із лімітом 500m не отримає більше 50% часу одного ядра.
  • Це викликає throttling (гальмування).

CPU Throttling та затримки (Latency)

Розділ «CPU Throttling та затримки (Latency)»

Гальмування відбувається періодами (за замовчуванням 100мс). Якщо под вичерпав свою квоту в 50мс за перші 10мс періоду — він чекатиме наступні 90мс. Це створює різкі стрибки затримок (latency spikes).

Terminal window
# Перевірити гальмування контейнера в cgroups
cat /sys/fs/cgroup/cpu/cpu.stat
# nr_periods - загальна кількість періодів
# nr_throttled - скільки разів було застосовано обмеження

  1. Що входить у показник Load Average в Linux?

    Відповідь Процеси, що виконуються на CPU, процеси, що чекають своєї черги на CPU (runnable), та процеси, що чекають на завершення операцій вводу/виводу (I/O wait).
  2. Яка різниця між CPU requests та CPU limits у Kubernetes?

    Відповідь Requests — це гарантована частка ресурсів під час високого навантаження на вузол (через `cpu.shares`). Limits — це жорстке обмеження, яке ніколи не дозволяє поду споживати більше вказаного, навіть якщо процесор вільний (через `cpu.cfs_quota_us`).
  3. Чому низький % CPU може супроводжуватися високими затримками (latency)?

    Відповідь Через CPU throttling. Якщо ліміт дуже низький, додаток може швидко вичерпати свою мікро-квоту всередині 100-мілісекундного вікна і стати на паузу, чекаючи наступного вікна.
  4. Яка команда показує кількість ядер CPU в системі?

    Відповідь `nproc` або `lscpu`.

Завдання: Дослідити пріоритети та навантаження CPU.

  1. Запустіть два ідентичні процеси з різними пріоритетами (nice):
    Terminal window
    nice -n 19 sha256sum /dev/zero &
    nice -n 0 sha256sum /dev/zero &
  2. Подивіться на розподіл CPU в top (колонка %CPU та NI):
    Terminal window
    top -bn1 | grep sha256sum
  3. Перевірте кількість перемикань контексту (context switches):
    Terminal window
    vmstat 1 3 # Дивіться на колонку 'cs'
  4. Вбийте процеси:
    Terminal window
    killall sha256sum

Критерії успіху: Ви бачите, як пріоритет (nice) впливає на частку часу, яку отримує процес від планувальника.


  • Load average показує загальну насиченість (CPU + I/O).
  • CFS намагається бути чесним з усіма процесами.
  • Requests — це пріоритет, Limits — це жорстка межа.
  • Throttling — головний ворог стабільної затримки (p99 latency).

Далі: Модуль 5.3: Керування пам’яттю — дізнайтеся, як Linux працює з RAM і чому ліміти пам’яті в Kubernetes набагато небезпечніші за ліміти CPU.