Мы разрабатываем распределенную базу данных «ключ-значение» (C++) на основе LSM-Tree. И мы разворачиваем базу данных во многих кластерах, каждый из которых представляет собой набор с состоянием k8s. На каждом хосте работает CentOS с ядром 4.18.0-147, только 1 узел NUMA. И каждый хост может обслуживать несколько модулей. Но на одном хосте не будет модулей из одного кластера базы данных. Архитектура выглядит так:
Код: Выделить всё
host x | host y | ...
cluster A pod1 | cluster C pod1 |
cluster B pod2 | cluster A pod2 |
Странно то, что потоки модуля заикаются на 0–2 секунды, даже если загрузка процессора как хоста, так и модуля очень низкая (около 20–30%).
Когда происходит заикание, выполните несколько простых инструкций, например. int, может занять 2 секунды.
И
- использование памяти хостом и модулем очень низкий, около 30 %
- /cpu/stat cgroup сообщает об отсутствии регулирования процессора в этих контейнерах
- сеть выглядит нормально
- когда в каком-то модуле происходит зависание, другие модули, обслуживаемые тем же хостом, работают нормально
- Я использую запись perf для непрерывного профилирования своей программы, по 60 секунд каждый раз. А затем используйте Flamescope, чтобы рисовать график пламени каждые 10 мс. Во время проблемы с заиканием не наблюдалось никаких неожиданных стеков вызовов.
- Я использую C++ для написания простой программы тикера, которая вызывает std::this_thread::sleep_for( 10 мс) постоянно и используйте system_clock::now() для вычисления реальной продолжительности сна. Ставлю в контейнеры, и реальная продолжительность сна иногда доходит до 20мс. Опять же, нагрузка на модуль и хост очень низкая.
- Я использую atop для мониторинга системы каждые 1 секунду. Ничего странного не обнаружено.
Подробнее здесь: https://stackoverflow.com/questions/785 ... nvironment
Мобильная версия