Від PID до контейнера: Як відстежити високе використання CPU в Docker
Якщо ви запускаєте кілька контейнерів Docker на системі Linux, то часто стикаєтесь з ситуацією, коли певний процес споживає занадто багато CPU. Однак, перевіряючи процес за допомогою таких інструментів, як top
, ви можете побачити лише PID (Process ID) процесу, який використовує CPU, без безпосереднього вказування, до якого контейнера Docker він належить. У цьому посібнику я покажу вам, як відстежити PID до конкретного контейнера Docker.
Крок 1: Визначте PID, який споживає багато CPU
Використовуючи команду top
або інший інструмент для моніторингу системи, ви можете визначити, що певний PID споживає значну частину CPU. Наприклад, припустимо, що PID дорівнює 5678
.
top
У виведенні запишіть PID процесу, який споживає надмірно багато CPU.
Крок 2: Перевірте Cgroup процесу
Якщо ви визначили процес, можете перевірити, чи належить він контейнеру Docker. Ключовим моментом є інформація про cgroup, яка вказує на ID контейнера.
Перевірте cgroup процесу:
cat /proc/5678/cgroup
Виведення може виглядати так:
0::/system.slice/docker-e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7.scope
Тут рядок, що починається з docker-
і закінчується .scope
, ідентифікує контейнер, і ви можете витягти ID контейнера з цього рядка. У цьому випадку ID контейнера виглядає так:
e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7
Як альтернативу, можна використовувати лише перші 12 символів ID контейнера (наприклад, e1878ccb3caf
), щоб звертатися до контейнера.
Крок 3: Перевірте контейнер Docker
Тепер, коли ви маєте ID контейнера, ви можете отримати більше інформації про контейнер за допомогою команди docker inspect
:
docker inspect e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7
Це надасть детальну інформацію про контейнер, включаючи його конфігурацію, використання ресурсів та запущені процеси.
Як альтернативу, ви можете використовувати перші 12 символів ID контейнера:
docker inspect e1878ccb3caf
Крок 4: Моніторинг використання ресурсів
Для подальшого моніторингу використання ресурсів контейнера скористайтеся командою docker stats
:
docker stats e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7
Це дозволить вам бачити реальний час використання ресурсів (CPU, пам'ять, мережевий трафік тощо) контейнера.
Крок 5: Налагодження або оптимізація контейнера
Коли ви визначили контейнер, можна провести подальше налагодження, зайшовши в оболонку контейнера (якщо необхідно), щоб знайти або оптимізувати процес, що спричиняє високе використання CPU.
docker exec -it e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7 bash
Всередині контейнера ви можете запускати команди, такі як top
, ps
, або перевіряти журнали додатків для визначення основної причини проблеми. Також може бути корисно перевірити журнали контейнера на наявність помилок, специфічних для додатку:
docker logs e1878ccb3cafdd88ce57e73e47dbf012b3769f08eface24b711cfdd3e64919e7
Висновок
Дотримуючись кроків, описаних у цьому посібнику, ви зможете легко відстежити процеси з високим використанням CPU до конкретного контейнера Docker, до якого вони належать. Цей метод особливо корисний, коли ви працюєте з комплексними налаштуваннями Docker, де кілька контейнерів запускають різні процеси.
Використання cat /proc//cgroup
є ключовим для визначення, який контейнер Docker відповідає за певний процес. Після того, як ви знайдете контейнер, docker inspect
та docker stats
допоможуть глибше дослідити його використання ресурсів і визначити основну причину проблем з продуктивністю.
Перекладено з: From PID to Container: How to Track High CPU Usage in Docker