Node Exporter показывает неверное время простоя процессора - PullRequest
0 голосов
/ 08 ноября 2019

Я настроил систему мониторинга, используя Prometheus, AWS EC2 Auto discovery и экспортер узлов. Используя следующую формулу для получения загрузки ЦП:

100 - (avg by (instance) (irate(node_cpu_seconds_total{instance="instancexyz" ,mode="idle"}[5m])) * 100)

Однако в одной конкретной ASG я получаю процент ЦП в больших отрицательных значениях. Я открыл ссылку экземпляр: 9100 / metrics и обнаружил, что значения простоя являются большими экспоненциальными значениями. Вот одно значение, которое я получил:

node_cpu_seconds_total{cpu="0",mode="idle"} 4.25766215e+06

Метрики работают нормально во всех моих экземплярах, за исключением нескольких. Есть идеи, что происходит?

1 Ответ

1 голос
/ 08 ноября 2019

Те "большие экспоненциальные значения", которые вы видите, являются кумулятивными. Т.е. ЦП (или все ядра ЦП?) Простаивали более 1000 часов (4.25e6 / 3600) с момента запуска виртуальной машины, поэтому они выглядят очень разумно.

Причина, по которой вы получаете отрицательные значения, заключается в том, чтовыборки. Теоретически все выборки с точностью до scrape_interval секунд с точностью до миллисекунды, и задержка сети и время обработки экспортера для каждой очистки абсолютно одинаковы. На практике очистка может быть отложена или даже пропущена, сетевая задержка меняется, и ваша целевая виртуальная машина может время от времени привязывать свой ЦП (или зависать по любой причине).

Это означает, что, например, это вполне возможно для одного образцаnode_cpu_seconds_total иметь значение V в (номинально) время T и значение V + 1 в (номинально) время T + 10s, в результате чего коэффициент простоя составит 110%. Или какие бы ценности вы ни хотели придумать. irate усугубляет эту проблему, потому что она всегда рассматривает два последовательных образца, увеличивая относительную ошибку измерения (ошибку относительно времени между выборками).

Вы ничего не можете с этим поделать, кроме как принять, что это неидеальное измерение и ударить clamp_min(<your_expression>, 0) поверх него. Использование rate вместо irate также может уменьшить ошибку и, как правило, является хорошей идеей, если вы не смотрите на свои данные в полном разрешении.

...