🧠 Tổng quan.
Trong quá trình giám sát hệ thống Linux sử dụng Prometheus và Node Exporter, bạn có thể gặp lỗi sau trong log của node_exporter
:
Jun 19 16:45:16 SOC-DAILYBACKUP-17-16 node_exporter[1987641]: ts=2025-06-19T09:45:16.643Z caller=stdlib.go:105 level=error caller="error encoding and sending metric family: write tcp 10.166.17.16:9100" msg="->10.10.16.16:58878: write: broken pipe"
Đây là một lỗi khá phổ biến nhưng nhiều người chưa hiểu rõ nguyên nhân và cách xử lý dứt điểm. Bài viết này sẽ giúp bạn:
- Hiểu rõ lỗi
broken pipe
là gì. - Xác định nguyên nhân cụ thể trong hệ thống Prometheus + Node Exporter.
- Cách khắc phục và phòng tránh.
- Bonus: Sơ đồ hoạt động và minh họa ASCII.
🧠 Lỗi broken pipe
là gì?
“Broken pipe” là lỗi xảy ra khi một tiến trình cố ghi dữ liệu vào một kết nối (thường là TCP) nhưng đầu bên kia đã đóng kết nối.
🔧 Trong trường hợp này:
node_exporter
(ở10.166.17.16
) đang gửi metrics về cho client (thường là Prometheus ở10.10.16.16
).- Nhưng client đã đóng socket TCP trước khi nhận đủ dữ liệu.
- Kết quả: Node Exporter ghi vào socket → lỗi
broken pipe
.
🕸️ Mô hình hoạt động Node Exporter & Prometheus
+----------------+ Scrape metrics +---------------------+
| | <---------------------------- | |
| Prometheus | | Node Exporter |
| 10.10.16.16 | HTTP over TCP | 10.166.17.16:9100 |
| | ----------------------------> | |
+----------------+ +---------------------+
1. Prometheus mở kết nối HTTP GET
2. Node Exporter phản hồi /metrics
3. Nếu kết nối bị đóng quá sớm → broken pipe
⚠️ Nguyên nhân chính
Nguyên nhân | Mô tả chi tiết |
---|---|
❌ Prometheus đóng kết nối sớm | Do timeout hoặc user bấm hủy query. |
❌ Scrape timeout quá ngắn | Node Exporter chưa phản hồi kịp → Prometheus timeout → đóng socket. |
❌ Quá tải hệ thống | CPU hoặc Disk quá tải khiến Node Exporter phản hồi chậm. |
❌ Mạng bất ổn / firewall | NAT timeout, mất kết nối TCP giữa 2 IP. |
❌ Prometheus query quá nặng | Tốc độ xử lý chậm, không giữ socket lâu. |
🧪 Cách kiểm tra và khắc phục
✅ Kiểm tra cấu hình Prometheus
Trong file prometheus.yml
:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['10.166.17.16:9100']
scrape_interval: 15s
scrape_timeout: 10s # nên để >5s để tránh timeout sớm
👉 Gợi ý: tăng scrape_timeout
từ mặc định (10s) lên 15s hoặc 20s nếu máy yếu.
✅ Kiểm tra tình trạng máy chạy Node Exporter
Trên 10.166.17.16
:
top
iostat -x 1 5
vmstat 1 5
Kiểm tra:
- CPU load có cao không?
- Disk I/O có đang nghẽn?
- RAM còn đủ không?
✅ Kiểm tra mạng và firewall
ping 10.10.16.16
mtr -rwzc 100 10.10.16.16
- Kiểm tra packet loss.
- Kiểm tra session timeout của firewall hoặc NAT (thường chỉ vài giây với HTTP).
- Xem có bị chặn port 9100 TCP hoặc reset kết nối không.
✅ Theo dõi lỗi bằng log hoặc cảnh báo
Nếu bạn có tích hợp node_exporter
với Grafana/Loki hoặc hệ thống log khác:
- Tạo biểu đồ theo dõi số lượng lỗi
broken pipe
theo thời gian. - Cảnh báo nếu xuất hiện liên tục trong 5 phút.
🛠️ Cách xử lý thực tế trong prod.
✔️ Check real-time log:
journalctl -u node_exporter -f
✔️ Thử scrape thủ công:
curl http://10.166.17.16:9100/metrics
→ Nếu bạn thấy phản hồi chậm, hoặc bị treo → có vấn đề từ Node Exporter hoặc hệ thống bên dưới.
📌 Kết luận
Lỗi broken pipe
trong Node Exporter là dấu hiệu cho thấy Prometheus hoặc mạng không giữ được kết nối đủ lâu để lấy dữ liệu.
👉 Tóm lại, bạn nên:
- Tăng
scrape_timeout
- Tối ưu hệ thống máy đích
- Kiểm tra mạng nội bộ và firewall
- Theo dõi log để phát hiện sớm
📚 Tham khảo thêm
- Prometheus Scraping Docs
- Node Exporter GitHub
man 2 write
(Linux syscall reference for broken pipe)
Chúc bạn sớm xử lý dứt điểm lỗi này và giữ hệ thống monitoring luôn ổn định!
Nếu bạn thấy bài viết hữu ích, đừng quên chia sẻ cho đồng nghiệp nhé. 😊