Netdata: снижено потребление памяти и CPU
Linting / YAML Lint (push) Canceled after 0s
Linting / Ansible Lint (push) Canceled after 0s

- выключены ML (52 MB и тренировка k-means по 13.7k измерений каждые 3
  часа), network-viewer, debugfs и ioping; storage tiers 3 → 2, то есть
  максимум истории 3 месяца вместо 2 лет; apps.plugin обходит /proc раз в
  30s вместо 10s, метрики групп процессов при этом сохранены
- из /proc/net/dev отфильтрованы veth*, br-* и docker0 — 462 графика на 50
  интерфейсов, из которых 43 безымянные veth докера. Побочный эффект:
  проверка имени в proc_net_dev.c идёт до netdev_rename_this_device(),
  поэтому теряется единственный смапленный cgroup_caddyproxy.net_eth0
- postgres перестал собирать метрики индексов (205 индексов × 2 графика);
  max_db_indexes задан внутри джоб, потому что на верхнем уровне файла
  go.d разбирает только confgroup.Default и молча игнорирует остальное

Замер до: 13.7k метрик, 479 MiB, ~18% ядра. Ожидаемо после: ~11.8k
метрик и ~310 MiB.
This commit is contained in:
av
2026-08-13 08:57:09 +03:00
parent 50c975d49b
commit 626bac5303
2 changed files with 64 additions and 5 deletions
+14 -2
View File
@@ -1,9 +1,21 @@
update_every: 60 update_every: 60
# max_db_indexes задан внутри каждой джобы намеренно: на верхнем уровне
# файла разбирается только confgroup.Default (update_every,
# autodetection_retry, priority), остальные ключи yaml проглотит молча.
#
# Метрики индексов давали 205 индексов × 2 графика на две базы и никакой
# пользы на личном сервере. Лимит означает «не собирать метрики индексов для
# баз, где индексов больше N», так что 10 отключает их для обеих баз.
# Метрики таблиц (seq scans, bloat, hot updates) оставляем: стоковый лимит
# max_db_tables = 50 обе базы проходят.
jobs: jobs:
- name: outline_db - name: outline_db
dsn: 'postgresql://netdata:{{ netdata_postgres_password }}@outline_postgres:5432/outline' dsn: 'postgresql://netdata:{{ netdata_postgres_password }}@outline_postgres:5432/outline'
max_db_indexes: 10
- name: miniflux_db - name: miniflux_db
dsn: 'postgresql://netdata:{{ netdata_postgres_password }}@miniflux_postgres:5432/miniflux' dsn: 'postgresql://netdata:{{ netdata_postgres_password }}@miniflux_postgres:5432/miniflux'
max_db_indexes: 10
+50 -3
View File
@@ -34,6 +34,13 @@
#| datatype: duration (seconds), default value: 1s #| datatype: duration (seconds), default value: 1s
update every = 10s update every = 10s
# Третий tier (2 года с шагом 10 часов) на личном сервере не нужен, а
# per-metric структуры каждого tier'а лежат в памяти для всех ~12k метрик.
# Остаётся 14 дней с шагом 10s и 3 месяца с шагом 10m.
#| >>> [db].storage tiers <<<
#| datatype: number, default value: 3
storage tiers = 2
# enable replication = yes # enable replication = yes
# replication period = 1d # replication period = 1d
# replication step = 1h # replication step = 1h
@@ -106,7 +113,13 @@
# proxy = env # proxy = env
[ml] [ml]
# enabled = auto # Anomaly detection никто не смотрит, а тренировка k-means по каждому
# измерению каждые 3 часа — основной расход CPU демона (замер: 52 MB
# памяти и заметная доля от 18% ядра). Модели в ml.db тоже перестанут расти.
#| >>> [ml].enabled <<<
#| datatype: yes, no or auto, default value: auto
enabled = no
# training window = 6h # training window = 6h
# min training window = 15m # min training window = 15m
# max training vectors = 1440 # max training vectors = 1440
@@ -233,6 +246,22 @@
#| datatype: yes or no, default value: yes #| datatype: yes or no, default value: yes
statsd = no statsd = no
# Периодически обходит все сокеты хоста ради карты соединений, которой мы
# не пользуемся: ~5 MiB и постоянный расход CPU.
#| >>> [plugins].network-viewer <<<
#| datatype: yes or no, default value: yes
network-viewer = no
# Даёт extfrag и zswap (33 метрики) — не смотрим.
#| >>> [plugins].debugfs <<<
#| datatype: yes or no, default value: yes
debugfs = no
# Latency-пробы диска, требуют явной настройки, у нас не настроены.
#| >>> [plugins].ioping <<<
#| datatype: yes or no, default value: yes
ioping = no
# idlejitter = yes # idlejitter = yes
# netdata pulse = yes # netdata pulse = yes
# profile = no # profile = no
@@ -362,7 +391,13 @@
# command options = # command options =
[plugin:apps] [plugin:apps]
# update every = 10s # 86 групп процессов × 24 контекста = 4039 метрик, четверть всех. Метрики
# оставляем (нужен разрез по хостовым процессам вне контейнеров), но обход
# /proc по всем процессам делаем втрое реже — это и есть основная цена.
#| >>> [plugin:apps].update every <<<
#| datatype: duration (seconds), default value: 10s
update every = 30s
# command options = # command options =
[plugin:systemd-journal] [plugin:systemd-journal]
@@ -383,7 +418,19 @@
[plugin:proc:/proc/net/dev] [plugin:proc:/proc/net/dev]
# compressed packets for all interfaces = no # compressed packets for all interfaces = no
# disable by default interfaces matching = lo fireqos* *-ifb fwpr* fwbr* fwln* ifb4*
# К стоковому списку добавлены veth*, br-* и docker0: это 50 интерфейсов
# × 9 контекстов = 462 графика, из них 43 — безымянные veth докера.
#
# Внимание, побочный эффект: проверка имени в proc_net_dev.c идёт до
# netdev_rename_this_device(), поэтому отфильтрованный veth уже не может
# быть переименован в контейнерный чарт. У нас смаплен ровно один
# (cgroup_caddyproxy.net_eth0), его мы теряем; внешний трафик виден в
# system.net по eth0. Если понадобится разрез по контейнерам — убрать
# veth* из списка и разбираться, почему маппинг не сработал для остальных.
#| >>> [plugin:proc:/proc/net/dev].disable by default interfaces matching <<<
#| datatype: simple pattern, default value: lo fireqos* *-ifb fwpr* fwbr* fwln* ifb4*
disable by default interfaces matching = lo fireqos* *-ifb fwpr* fwbr* fwln* ifb4* veth* br-* docker0
[plugin:proc:/proc/stat] [plugin:proc:/proc/stat]
# cpu utilization = yes # cpu utilization = yes