Ищете объяснение о дочерних процессах containerd-shim/runc
Мы используем докер в среде роя. Все хорошо... но для странного процесса с именем "exe", появившегося несколько дней назад:
14126 root 20 0 446836 33648 184 R 49.0 0.2 0:05.98 exe
1 root 20 0 52356 532 332 S 34.3 0.0 2750:22 systemd
13789 root 20 0 5424660 49784 0 S 5.6 0.3 2381:57 dockerd
Это действительно занимало до 100% процессора.
Мы пытались понять, откуда он взялся, но он был очень нестабильным, и его pid менялся каждые 3-4 секунды. Вы можете догадаться, что такое поведение вызвало несколько тревог.
В конце концов, мы настроили несколько инструментов мониторинга (с помощью auditd), чтобы сделать его снимок, и увидели, что:
Syscall event curl /usr/bin/curl 24242 24234
Syscall event 4 / 24240 24234
Syscall event exe /usr/bin/runc 24240 24234
Syscall event runc /usr/bin/runc 24234 10444
Родительский процесс "main" runc:
root 10444 2621 0 Nov13 ? 00:07:07 containerd-shim
Я прочитал несколько вещей (в том числе это одно и тот другой, и многое другое) о containerd-регулировочной шайбы и RunC... Я думаю, что понимаю RunC используется для запуска demonless контейнеров, а затем containerd-регулировочная шайба принимает как процесс контейнера родитель.
Таким образом, я понимаю, почему я ненадолго вижу runc как дочерний процесс containerd-shim при каждом запуске контейнера.
Но кое-что еще ускользает от меня:
- почему существует несколько уровней runc (один runc вызывает другой)?
- почему он называется не "runc", а "exe", и поэтому выглядит очень подозрительно (когда звучит так, как будто это законно)? Это основной процесс контейнера (или другой)?
- что это за странный процесс под названием "4" и путь к исполняемому файлу "/"? Это часть процессов в контейнере (или основной)?
- Я предполагаю, что curl - это проверка работоспособности, выполняемая в контейнере (это контейнер apache с проверкой состояния, нацеленным на localhost). Я прав?
- Если основной процесс контейнера не является "4", должен ли я его видеть и как я могу увидеть его аналогичным образом?
А пока процесс просто перестал использовать весь процессор. Это выглядит коряво (но звучит законно) каждый раз при запуске контейнера, но занимает не более нескольких процентов. Поэтому я думаю, что чрезмерное использование ЦП было связано с какой-то проблемой в нашем контейнере. Во всяком случае, решение проблемы с процессором здесь не входило.
Изменить 1:
О dockerfiles
На виртуальной машине работает много контейнеров, и я не могу предоставить все файлы Docker. Я подозреваю, что завиток запускается через проверку работоспособности - это изображение apache httpd (на основе centOs). Он очень близок к CentOS с некоторыми маркировками, очисткой (неиспользуемые модули) и дополнительной проверкой работоспособности:
HEALTHCHECK --interval=5s --timeout=3s CMD curl --noproxy '*' --fail http://localhost:80/ || exit 1
О мониторинге
мы используем rsyslog с базовой конфигурацией для удаленного сервера, а затем запускаем auditctl для отслеживания запуска процесса:
service rsyslog restart
service auditd start
auditctl -a always,exit -F arch=b64 -S execve -F key=procmon