RabbitMQ перестал принимать новые сообщения, и при выполнении запроса — возвращает ошибки вида:
exec(): Unable to forkwrite(): send of 12 bytes failed with errno=104 Connection reset by peerfwrite(): send of 19 bytes failed with errno=32 Broken pipe
Собственно, по сообщениям видно, что проблема с памятью — exec() не может выполнить fork() и выделить место под новый процесс.
Когда начал проверять отжираемую память — внезапно обнаружилось, что Prometheus node_exporter занял почти 60% памяти на сервере.
Используем docker stats:
Вот он:
prometheus-client_node-exporter_1 0.00% 8.925GiB / 15.11GiB 59.06%
Собственно, перезапускаем стек мониторинга — память подчистилась.
Что бы избежать такой проблемы в будущем — добавляем лимиты для контейнеров.
Контейнеры у нас запускаются из Docker Compose файла prometheus-client-compose.yml.
Compose файл версии 2 (для использования с docker-compose) — используем mem_limit, и он будет выглядеть так:
version: '2.4'
networks:
prometheus-client:
services:
prometheus-server:
image: prom/prometheus
network_mode: "host"
volumes:
- /opt/prometheus-client/prometheus-client-conf.yml:/etc/prometheus/prometheus.yml
restart: unless-stopped
node-exporter:
image: prom/node-exporter
network_mode: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- --collector.filesystem.ignored-mount-points
- "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
- --collector.supervisord
- '--collector.supervisord.url=http://supervisoradmin:password@localhost:9001/RPC2'
restart: unless-stopped
# For Compose v2 and docker-compose
mem_limit: 500m
mem_reservation: 100m
...
Версия 3, для Docker Swarm — используем deploy и resources:
version: '3.3'
networks:
prometheus-client:
services:
prometheus-server:
image: prom/prometheus
network_mode: "host"
volumes:
- /opt/prometheus-client/prometheus-client-conf.yml:/etc/prometheus/prometheus.yml
restart: unless-stopped
node-exporter:
image: prom/node-exporter
network_mode: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- --collector.filesystem.ignored-mount-points
- "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
- --collector.supervisord
- '--collector.supervisord.url=http://supervisoradmin:password@localhost:9001/RPC2'
restart: unless-stopped
deploy:
resources:
limits:
memory: 300m
reservations:
memory: 100m
...
Тут:
limits: максимально допустимый объём памятиreservations: минимально требуемый для контейнера (сервиса) объём
Проверяем лимиты, с помощью того же stats:
Готово.






