应监控所有worker进程的cpu和内存总和,并结合stub_status连接数、请求量及响应时间分析业务压力,同时用systemd设memorymax、cpuquota等硬限制防失控。

监控 Nginx 对服务器 CPU 和内存的实际占用,关键不是看系统整体水位,而是聚焦 Nginx 自身多进程行为——主进程轻量,worker 进程才是资源消耗主体。必须把所有 worker 进程的 CPU 和内存加总,并结合连接、请求等业务指标判断是否真有压力,否则容易误判或漏判。
只盯 worker 进程的 CPU 和内存总和
Nginx 是多进程模型,主进程几乎不占资源,真正干活的是多个 worker 进程。光看 top 里“nginx”一行或系统整体 CPU 使用率,会严重失真。
- 快速汇总:运行 ps -C nginx -o pid,comm,%cpu,%mem,rss --no-headers | awk '$2 ~ /worker/ {sum_cpu += $3; sum_mem += $4; sum_rss += $5} END {printf "CPU: %.1f%%, MEM: %.1f%%, RSS: %d KB\n", sum_cpu, sum_mem, sum_rss}',直接输出全部 worker 的合计值
- 动态观察:用 htop,按 F4 输入 nginx 过滤,手动区分 master(低占用)和各 worker(可能高占用)
- 持续采样:用 top -b -n 60 -p $(pgrep -f 'nginx: worker') 每秒抓一次,适合排查瞬时毛刺
识别内存异常增长与共享内存占用
Nginx 内存分三块:worker 私有 RSS、共享内存(如 limit_req_zone、ssl_session_cache)、以及磁盘缓存(proxy_cache)。其中 RSS 持续上涨是泄漏强信号;共享内存超配则可能挤占系统资源。
- RSS 总和单位是 KB,若随时间单向爬升且不回落,需检查 open_file_cache 是否过大、模块是否有已知内存泄漏
- 查共享内存声明大小:nginx -T 2>/dev/null | grep -E 'limit_conn|limit_req|ssl_session_cache|proxy_cache_path'
- 估实际占用:cat /proc/$(pgrep nginx | head -1)/maps | awk '/nginx.shm/ {sum += $3} END {print sum/1024 " MB"}'
- 确认是否触发系统级回收:cat /sys/fs/cgroup/system.slice/nginx.service/memory.current(需启用 systemd 资源限制)
用 systemd 设置硬性资源上限防失控
仅靠监控告警是被动响应,必须前置设限。通过 systemd 为 nginx.service 配置 MemoryMax、CPUQuota 等,让资源耗尽前就自动压制或重启,避免拖垮整机。
- 编辑服务单元:sudo systemctl edit nginx.service
- 添加限制项:
[Service] MemoryMax=1G CPUQuota=75% Restart=on-failure RestartSec=10
- 重载并验证:systemctl daemon-reload && systemctl restart nginx && systemctl show nginx.service | grep -E "(MemoryMax|CPUQuota)"
联动 stub_status 实现业务级关联分析
单独看 CPU 或内存数字没意义。要结合 stub_status 暴露的活跃连接数、请求速率、处理请求数,才能知道“它忙什么”。例如:CPU 达 80%,但 active connections 只有几十,大概率是某类高开销请求(如报表导出、图片缩放)在单线程阻塞。
- 启用状态页:location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
- 定时采集:curl -s http://127.0.0.1/nginx_status | awk -F': ' '/Active connections/ {print $2} /Reading:/ {r=$2} /Writing:/ {w=$2} /Waiting:/ {t=$2} END {print r,w,t}'
- 告警逻辑建议:当 worker RSS 总和 > 800MB 且 active connections > 2000 同时成立,才触发“Nginx 内存+连接双高”告警,避免孤立阈值误报











