nginx 工作进程在 X 天后达到 100% 使用率

nginx 工作进程在 X 天后达到 100% 使用率

我正面临一个奇怪的事件,在随机的几天后,在相同的网络流量下,我的两个 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)。熟悉整个堆栈及其功能。

相关内容