凌晨两点,监控手机响了。监控不是监控闹钟,是监控PagerDuty的告警——一台Nginx服务器的响应时间从平均80ms飙到了3.2秒。爬起来打开笔记本,监控SSH上去敲了top,监控发现是监控某个上游服务拖垮了连接池。这种场景,监控做过运维的监控人都懂。web服务器监控不是监控装个Zabbix就完事了,它更像是监控一套持续运转的感官系统,你得让它真正"感知"到服务器在说什么。监控
很多人第一次搭监控,监控上来就盯着CPU和内存看。监控这没错,监控但远远不够。我见过一台机器CPU常年12%,内存用了不到三成,可用户端就是打不开页面。问题出在磁盘I/O的await值上——每次读写要等400多毫秒,请求全堵在队列里。CPU在等I/O,当然不忙。所以监控的第一层,至少要把CPU、内存、磁盘、网络这四样拆开看,而且不能只看平均值。95分位、99分位这些数字比均值诚实得多,均值80ms可能意味着有1%的请求在挣扎。
再往上走一层,是web服务器自己的指标。Nginx的stub_status模块能给你active connections、reading、writing、waiting这几个数。Apache有mod_status。别小看这些数字。waiting连接数突然涨起来,通常意味着keepalive连接堆积,可能是客户端行为异常,也可能是后端处理太慢导致连接释放不掉。我习惯把active和waiting的比值做成趋势图,比单看绝对值有用。有一回这个比值从正常的1:3跳到1:8,查下来是某台后端Tomcat的线程池被打满了,请求全卡在Nginx这一侧等回源。
应用层的监控才是真正区分水平的地方。HTTP状态码的分布要盯紧,但别只看5xx。4xx的突增往往更值得警惕——可能是接口被爬、鉴权逻辑出bug,或者前端发版后请求路径写错了。响应时间的分位数也要按URL维度拆开。整体P99是200ms,但某个查询接口的P99是5秒,用户照样骂娘。Prometheus配合Grafana做这套东西比较顺手,但别把dashboard堆成圣诞树,关键指标控制在两屏以内,否则真出事的时候你根本找不到该看哪。
日志监控容易被忽略。Nginx的error_log里出现"upstream timed out"的频率,比任何仪表盘都直接。我一般用Filebeat把日志推到Elasticsearch,然后设几个简单的告警规则:error_log里"no live upstreams"一分钟出现超过3次就打电话,access_log里某个IP的请求量突然翻十倍就发Slack。日志是服务器的日记,它不会撒谎。
告警阈值怎么定?别抄网上的模板。你的业务高峰在晚上八点,他的在早上十点,阈值能一样吗?我通常先裸跑一周收集基线数据,然后按P95的1.5倍设warning,P99的2倍设critical。告警要分级,能自愈的写脚本自动处理,比如重启某个僵死的worker进程;需要人介入的才发通知。否则狼来了喊多了,真出事的时候大家都在睡觉。
最后说个反直觉的事:监控系统本身也会成为故障源。曾经有个同事写了个采集脚本,每5秒跑一次ps aux,结果在连接数上万的机器上,这个脚本自己把CPU吃满了。监控的采集频率、采集方式、数据存储的保留策略,都得跟服务器规模匹配。别让看病的医生自己先倒下了。
说到底,web服务器监控的目标不是画漂亮的曲线,而是在用户骂你之前先知道哪里疼。工具换来换去,这个判断标准不会变。