Nginx 怎么排查 Nginx 高并发下因为日志文件锁竞争导致的性能下降故障

梦雪君_3943

梦雪君_3943

2026-08-14

819人浏览

原创

答案是日志锁竞争导致高并发下性能下降,表现为worker进程i/o等待高、日志写入延迟大、文件句柄被大量worker持有且未释放,根源常为logrotate触发的usr1信号失效、缓冲未启用、权限不足或文件描述符限制。

nginx 怎么排查 nginx 高并发下因为日志文件锁竞争导致的性能下降故障

直接看日志写入链路是否卡在文件句柄层——高并发下性能下降若由日志锁竞争引发,往往不是 CPU 或内存打满,而是 worker 进程在写日志时频繁阻塞、响应延迟跳升、access.log 写入速率明显低于请求量。

确认是否真为日志锁竞争

先排除其他瓶颈,再聚焦日志层:

  • 查 worker 进程 I/O 等待:用 top -p $(pgrep nginx | head -n1),观察 %wa(I/O wait)是否持续 >20%,高则说明进程在等磁盘或文件系统操作;
  • 看日志写入延迟:对比 request_time 和 upstream_response_time,若 request_time 显著大于后者(比如差 50ms+),且集中在 access.log 轮转前后,大概率是日志缓冲 flush 或 reopen 卡住;
  • 检查内核文件锁状态:运行 lsof -n | grep 'nginx.*log' | awk '{print $2,$9}' | sort | uniq -c | sort -nr,若同一日志文件被数十个 worker 同时持有 fd,且长时间未释放,说明 reopen 未完成或存在竞争残留。

重点排查 USR1 信号执行可靠性

logrotate 触发的 kill -USR1 是最常见锁源,高并发时极易失效:

Nginx Config Linter
Nginx Config Linter

对 Nginx 配置文件进行语法检查、验证和安全、性能审计。

下载
  • 验证信号是否真正落地:发完 USR1 后,轮询检查 lsof -p $MASTER_PID | grep access.log | wc -l,应从 2(旧+新)→ 1(仅新);若卡在 2 且持续数秒,说明部分 worker 未响应;
  • 查 master 是否卡在通知阶段:用 strace -p $(cat /var/log/nginx/nginx.pid) -e trace=kill,write,观察是否反复向某 worker PID 发送 kill 但无 write 日志 reopen 成功日志;
  • 确认 logrotate 是否并发执行:检查 /var/log/nginx/ 下是否有 access.log.1~access.log.3 等多个临时轮转文件,或 lsof +L1 | grep nginx 输出含多个 deleted 日志,表明多次轮转叠加导致 fd 混乱。

检查日志配置与系统级资源约束

缓冲、权限、句柄数三者共同决定锁竞争烈度:

  • 确认 access_log 是否启用 buffer+flush:若仍为 access_log /var/log/nginx/access.log;(无 buffer 参数),高并发下每请求落盘一次,I/O 放大数倍,极易触发锁争抢;
  • 检查日志目录权限与 worker 用户一致:运行 ps aux | grep nginx 看 worker 进程用户(如 www-data),再执行 ls -ld /var/log/nginx,确保该用户有写权限,否则写入失败会静默重试并加剧锁等待;
  • 核实文件描述符上限:cat /proc/$(pgrep nginx | head -n1)/limits | grep "Max open files",若 soft limit ≤ 4096,worker 在万级连接时极易因 fd 不足被迫串行化日志写入,表现即为锁竞争假象。

快速缓解与长期规避

线上优先止损,再固化防护:

  • 立即缓解:临时停用 logrotate,改用 systemd logrotate 的 copytruncate 模式(无需 reopen,fd 不变),或手动执行 kill -USR1 后加 sleep 1; sync 强制刷盘;
  • 脚本加固:所有日志切割脚本必须包裹 flock -x /tmp/nginx-logrotate.lock,并在 postrotate 中加入 stat -c '%s' access.log && [ $size -gt 0 ] || exit 0 跳过空日志;
  • 配置升级:将 access_log 改为 buffer=128k flush=2s,error_log 启用 buffer=64k flush=5s,同时在 nginx.conf 中设 worker_rlimit_nofile 100000; 并同步调大系统 limits。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

nginx nginx 高并发

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

860

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2572

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

876

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

769

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

394

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2336

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4292

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

707

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习