我正面临一个奇怪的事件,在随机的几天后,在相同的网络流量下,我的两个 nginx 工作程序突然达到 100% 的 CPU 使用率,而在其他日子里它们都表现良好。
它每秒处理 5 个并发请求的轻流量,我的 nginx worker 的配置如下:
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 100000;
pid /run/nginx.pid;
pcre_jit on;
events
{
multi_accept on;
worker_connections 2048;
accept_mutex on;
use epoll;
}
无论我将进程改为自动还是静态量(我试过 1),大约 6 天后我都会得到 100% 的启动速度。这是我当前 htop 的屏幕截图:截屏
如果我重启 nginx 服务,负载就会恢复正常。5-6 天后,负载又会达到 100%。
我尝试过使用像 ngxtop 这样的工具,但我无法确定负载的真正原因,而只能从网站源验证这不是发生的。
我还重新启动了 php7.3-fpm,但 nginx 的 CPU 使用率仍然是 100%,这意味着其他地方出了问题。
我不知道这种情况下是否有任何调试工具,如果您能指导我使用适当的工具来调试它,我将不胜感激。
有用信息:
我在用文字行动现成的堆栈脚本。Nginx 版本为 1.14.2
答案1
在 Linux 上,很容易准确分析 CPU 上的代码。
安装内核和应用程序(nginx)的调试符号,以便您拥有人类可读的函数名称。
运行perf top
即可查看 CPU 上的顶部符号。perf_events 参考
生成火焰图可视化使用 perf 或 bcc。
使用一些有用的工具来检查基本使用情况. 或者看看网络数据对于同一件事。
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
接下来是困难的部分:确定导致问题的原因。可能是应用程序代码(PHP?),可能是 Web 服务器(nginx),可能是操作系统调优(Linux)。熟悉整个堆栈及其功能。