Nginx 499 排查到docker 中一个进程一直在空转

现象:

Nginx日志在凌晨(2~9点) 中出现了大量499状态码的请求,9点钟以后几乎没有再出现499的状态码

解决:

早上来了业务部门通知让查看系统是否运行正常,查到了凌晨 Nginx 日志中出现了大量 499 的日志信息,上班以后都正常了,一开始没有头绪。就去问了运维,运维说凌晨的时候MySQL 备份磁盘满了,程序报错了,以为找到原因了,接下来就是把丢失的数据补充进去。

结果下午的时候又出现了499 的报错信息,这个时候查看了一下 CPU,几乎快满了,然后运维帮忙看了磁盘读写比例很高,也就是一直在读写磁盘占用了大量的CPU。第一时间分析以为是业务日志信息写入磁盘导致的CPU很高,业务里面是一条条写日志的,自己想可不可以批量写入磁盘,减少io请求,增加吞吐量(ps: 这个时候已经跑偏了)。

下午的时候看到 docker 中有一个进程CPU 占用很高,自己感觉正常就没有在意。

晚上下班了以后,又分析了一波,既然docker的CPU占用这么高,怎么看docker的资源消耗呢?

使用 docker stats

查看了docker 资源的消耗,发现有一个进程占用了 docker 百分之90多的CPU,进行这个容器中查看了一下这个进程的命令,是在读取一个文件,看了一下目录里面这个文件并不存在,自己确认了一下,然后就把这个容器关掉了。关掉以后 CPU占用从 60多 降到了30多,也就是这个空转的进程占用了大量的CPU消耗。

复盘:

Nginx 499 错误码 4xx 开头都是客户端报错

维基百科定义:
499 ClientClosed Request(Nginx):
Used in Nginx logs to indicate when the connection has been closed by client while the server is still processing itsrequest, making server unable to send a status code back。

服务器返回http头之前,客户端就提前关闭了连接,也就是说明是我们服务端处理的速度比较慢

那么下一次如何更好的定位到这个信息呢?

1.要了解top 命令的使用以及参数信息

负载:时间,登录用户数,系统平均负载

进程:运行,睡眠,停止,僵尸

cpu: 用户态、核心态、NICE、空闲、等待IO、中断等

内存: 总量、已用、空闲(系统角度),缓冲,缓存

交换分区:总量、已用、空闲

任务区域默认显示:进程ID、有效用户、进程优先级、NICE值、进程使用的虚拟内存、物理内存和共享内存、进程状态、CPU 占用率、内存占用率、累计CPU时间、进程命令行信息。

在使用top 的时候使用c,查看执行的进程命令信息。

2.补充对基础知识的掌握,操作系统的使用和理解

参考文章:

服务器排障 之 nginx 499 错误的解决 https://blog.51cto.com/yucanghai/1713803

top linux 下的任务管理器 https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/top.html

Linux Performance Observability Tools

原文地址:https://www.cnblogs.com/zhangpengfei5945/p/14437058.html