Skip to content

Разобраться #447

Description

@skulidropek

Почему один grep так забивает процессор

Дело в трёх вещах, которые сложились вместе:

  1. ugrep по умолчанию многопоточный. Он смотрит в /proc/cpuinfo, видит 16 ядер хоста и поднимает ~16 рабочих потоков — независимо от того, что контейнеру разрешено меньше.
    Обычный grep был бы однопоточным; rtk переписал его в параллельный ugrep, и вместо 1 ядра он захотел 16.
  2. Контейнер dg-utpmarket-issue-1 ограничен 4.8 ядрами (cgroup cpu.max = 480000/100000). 16 голодных потоков дерутся за 4.8 разрешённых ядра → ядро Linux душит (throttle)
    контейнер в 96% интервалов. Все 16 потоков постоянно висят в состоянии «готов работать, но не пущен».
  3. Эти «задушенные, но готовые» потоки раздувают метрики. Load average считает все runnable-потоки → отсюда load ~13. CPU pressure считает время, что задачи стоят в очереди
    за CPU → отсюда 58%. Плюс поиск идёт от корня / по гигантскому дереву (node_modules, кэши, монтирования) — он физически не может закончиться, крутится 4 часа.

Важный нюанс

Реально хост съедено ~6.5 ядра из 16 (utpmarket ~4.8 + browser ~1 + мелочь). То есть железо не упёрто в потолок — но цифры load/pressure выглядят страшно именно из-за
троттлинга: куча потоков молотит вхолостую в очереди. При этом само окружение utpmarket полностью встало (агент внутри задушен), а частые переключения троттлинга (142 тыс.
событий) добавляют накладных расходов планировщику на весь хост.

Что это значит для панели

Если панель отвечает медленно — это либо тот же эффект (её бэкенд docker-git-api стоит в общей очереди / дёргает подтормаживающий docker-демон), либо у панели есть отдельная
причина. Честно: доказанный факт — это зависший ugrep. Убьём его (освободит 4.8 ядра и уберёт троттлинг-шум) — и сразу станет видно, ушёл ли лаг панели полностью или
осталась вторая причина, которую тогда добью отдельно.

Убить зависший ugrep? Либо, если хочешь, сначала отдельно продиагностирую именно контейнер панели — скажи, что предпочитаешь.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions