Linux DHCP服务器性能监控方法
一 核心监控维度与关键指标
- 服务可用性:进程存活、监听端口、系统日志错误与告警。
- 租约与地址池:已分配/可用地址数、租约命中率、租约过期与续租时延。
- 请求处理性能:DHCPDISCOVER/DHCPREQUEST 吞吐、DHCPOFFER/ACK 时延、NAK 比例、包丢失与重传。
- 网络与系统资源:CPU、内存、磁盘 I/O、网络接口利用率与丢包。
- 告警阈值建议:租约使用率超过80%、发现/请求速率异常突增、Offer/ACK 时延明显拉长、服务进程异常退出或端口未监听。
二 命令行快速检查
- 服务状态与日志
- 检查服务:systemctl status isc-dhcp-server 或 systemctl status dhcpd
- 实时日志:journalctl -u dhcpd.service -f 或 tail -f /var/log/syslog | grep dhcpd
- 租约与地址池
- 查看租约文件:cat /var/lib/dhcp/dhcpd.leases(分析已分配/剩余地址、租期分布)
- 查看租约摘要:dhcp-lease-list(Debian 系列可用,直观列出租约)
- 监听端口与网络
- 端口监听:ss -lunpt | egrep ‘:(67|68)’
- 抓包分析:tcpdump -i eth0 -nn port 67 or port 68;dhcpdump -i eth0(解析 DHCP 报文类型与关键字段)
- 系统资源
- 资源总览:glances;或 dool(整合 vmstat/netstat/iostat/ifstat/mpstat)
- 细项统计:sar -n DEV 1(网络)、sar -u 1(CPU)、pidstat -u -p $(pidof dhcpd) 1(进程级 CPU/内存)
- 说明:DHCP 服务器/客户端分别使用UDP 67/68端口
三 日志与租约分析要点
- 日志定位问题
- 服务启动/关闭、配置重载、地址冲突、租约分配与回收、NAK 等都会在系统日志出现,建议以“dhcpd”为关键字持续跟踪:journalctl -u dhcpd -f 或 tail -f /var/log/syslog | grep dhcpd
- 租约文件解读
- 核心字段:lease、starts/ends、binding state(active/released)、hardware ethernet(MAC)、client-hostname
- 分析思路:统计 active 租约数量、按子网/池统计使用率、观察异常频繁续租或短租期
- 辅助脚本与工具
- 租约列表:dhcp-lease-list(快速查看当前租约明细)
- 第三方统计:dhcpd-statistics、dhcpd-monitor(部分发行版仓库提供,可用于更直观的统计/监控)
- 抓包取证:dhcpdump/tcpdump 用于核对 DISCOVER/OFFER/REQUEST/ACK 流程与异常报文
四 可视化与告警方案
- 企业级监控
- Zabbix:通过 UserParameter 执行脚本解析租约文件与日志,采集“租约使用率、发现/请求速率、Offer/ACK 时延”等指标;配置触发器与动作(邮件/企业微信/钉钉/短信)实现告警
- Nagios:自定义检查脚本(服务存活、端口监听、租约阈值、日志关键字告警),设置联系人、通知方式与依赖关系
- 轻量与快速可视化
- Sampler:用 YAML 编排命令输出(如租约统计、日志关键字计数、抓包摘要),在终端实现可视化面板与实时刷新
- 采集思路示例
- 指标采集:dhcp-lease-list/解析 dhcpd.leases、journalctl 计数、tcpdump/dhcpdump 统计报文类型与时延分布
- 数据上报:Zabbix Agent/HTTP API、Nagios 插件返回值、Sampler 本地展示与导出
五 一键巡检脚本示例
#!/usr/bin/env bash
IFACE="${1:-eth0}"
LEASE_FILE="/var/lib/dhcp/dhcpd.leases"
LEASE_SUMMARY="dhcp-lease-list 2>/dev/null || cat $LEASE_FILE | awk '/lease /{c++;} END{print \"active leases: \" c+0}'"
echo "=== $(date) ==="
echo "[Service]"
systemctl is-active --quiet isc-dhcp-server && echo " isc-dhcp-server: active" || echo " isc-dhcp-server: inactive"
echo "[Ports]"
ss -lunpt | egrep ':(67|68)' || echo " No DHCP ports listening"
echo "[Leases]"
eval "$LEASE_SUMMARY"
echo "[Logs]"
journalctl -u dhcpd.service --since "5 minutes ago" | egrep -i 'error|fail|nak' || echo " No recent errors"
echo "[Traffic sample]"
timeout 10 tcpdump -i "$IFACE" -nn port 67 or port 68 -c 20 2>/dev/null | tail -n 20
- 使用方式:保存为 check_dhcp.sh,chmod +x 后执行:./check_dhcp.sh eth0
- 扩展建议:将输出改为 Key-Value 格式,供 Zabbix/Nagios 采集;增加“租约使用率阈值判断”与“异常关键字计数”逻辑以触发告警。