线上nginx错误日志追查

问题描述

线上机器有一台机器报警,说摸个url请求失败率达到25%,等到线上机器查看nginx错误日志,发现下面的滚屏;

2017/04/10 18:00:28 [alert] 2378#0: *35137710183 socket() failed (24: Too many open files) while connecting to upstream, client: 202.69.12.16, server: api.mobojoy.baidu.com, request: "GET /index.php?r=adfb/list&al=847dd82e152ec6ddeb104ba8439a684d&l=06e298ac92c301027067eea9a540dff4&p=48cfe1bbaabf62b82e4f979f4cbeb44f&hp=com.dianxinos.dxbs&lc=xiaobu_yz_gl_PRE_FREE&sdk=49 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000",
host: "----"
2017/04/10 18:00:29 [crit] 2378#0: accept4() failed (24: Too many open files)

并且查看各个进程占用fd的情况:

$ lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
10259 2378
7520 16505
4273 5091
2661 5098
2508 5093
2201 5084
2183 5089
2001 5117
1934 5095
1927 5105
1911 5108
1906 5104
1809 5100
1713 5082
1631 5106
1336 5102

第一列为占用fd数,第二列为进程id,第一行就是nginx进程.

解决

看到,nginx进程占用的fd偏多,socket句柄不不够用导致的,当时为了解决这个问题,选择重启Nginx,重启nginx对于我们的对外服务没有影响,因为线上是部署多台的。最好不要重启服务器。

其实可以,修改系统配置和nginx配置, 我们的线上机器sockets最大个数10w,够用,所以只需要修改nginx配置:

worker_rlimit_nofile 40000;
Syntax: worker_rlimit_nofile number;
Default:    —
Context:    main

参考

nginx core module configuration