gateway reload后没有变化,导致reload nginx后nginx进程会处于shutting状态

linggang668

使用nginx作为前端代理,在reload nginx的时候,发现nginx会一直处于shutting状态,当reload nginx次数多了以后,cup会飙升到100%, gateway的状态也会处于busy状态。

现象如下:

//nginx进程
$ ps aux | grep nginx
**www      12384  0.6  0.2 110752 37424 ?        SN   Jan20  12:51 nginx: worker process is shutting down**
www      12385  0.1  0.1 102508 29260 ?        SN   Jan20   3:18 nginx: worker process is shutting down
www      12386  0.5  0.2 112744 39616 ?        SN   Jan20  12:45 nginx: worker process is shutting down
www      12387  0.2  0.1 104556 31228 ?        SN   Jan20   5:56 nginx: worker process is shutting down
www      27928  1.0  0.1 102508 28252 ?        SN   11:25   0:08 nginx: worker process
www      27929  0.5  0.1 102508 27932 ?        SN   11:25   0:04 nginx: worker process
www      27930  1.2  0.1 102508 28512 ?        SN   11:25   0:10 nginx: worker process
www      27931  0.2  0.1 102508 27900 ?        SN   11:25   0:02 nginx: worker process
www      29369  0.1  0.1 102508 27712 ?        SN   Jan21   0:52 nginx: worker process is shutting down
www      29370  0.5  0.1 102804 29400 ?        SN   Jan21   3:42 nginx: worker process is shutting down
www      29371  0.2  0.1 102508 28460 ?        SN   Jan21   1:39 nginx: worker process is shutting down
www      29372  0.4  0.1 102804 29360 ?        SN   Jan21   3:23 nginx: worker process is shutting down

再查id为12384的进程发现,这个进程一直和gateway在连接

$ lsof -i :60877     //60877是从lsof的最后一行取的
COMMAND   PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
php     11789 root   65u  IPv4 2550865341      0t0  TCP mt-web1:8282->mt-web1:60877 (ESTABLISHED)
nginx   12384  www 1184u  IPv4 2550863681      0t0  TCP mt-web1:60877->mt-web1:8282 (ESTABLISHED)

gateway的状态如下:发现会有11789这个进程(当nginx reload的次数多的时候,gateway就会处于busy状态。)

Workerman version:3.5.1          PHP version:7.1.6
start time:2017-12-07 09:03:05   run 46 days 4 hours   
load average: 0.14, 0, 0         event-loop:\Workerman\Events\Select
1 workers       4 processes
worker_name     exit_status      exit_count
zhibo-gateway-1 0                0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid     memory  listening                      worker_name     connections total_request send_fail timers   status
11785   8M      websocket://ip:8282 zhibo-gateway-1 436         32233007      579       3         
11786   8M      websocket://ip:8282 zhibo-gateway-1 431         36117127      644       3         
11788   8M      websocket://ip:8282 zhibo-gateway-1 432         36397854      592       3         
11789   8M      websocket://ip:8282 zhibo-gateway-1 447         33917464      642       3         

因为我们上线新功能后,一般只会reload nginx, 所以怀疑是gateway和nginx链接导致的,但是gateway reload后,gateway的进程还是那几个并没有重新启动,这正常吗?

ps:如果把gateway restart了,gateway的进程id会改变,nginx中的shutting状态的进程也会消失,但是gateway restart是不是会断掉和客户端的连接呀?

9153 2 0
2个回答

walkor

看起来nginx reload后不会断开连接,然后gateway reload也不会断开连接(gateway restart会断开连接)。
然后二者仍然保持着连接。

  • linggang668 2018-01-22

    你好, walkor,是的,现在就是这里遇到问题了,nginx和gateway都reload,那么nginx会产生新的worker进程,但是应该shutdown的老进程因为和gateway还有连接,所以也不会销毁,这样时间长了会有很多处于shutting状态的进程,这些进程都会占用资源。

    请问您有什么推荐的解决办法吗?

  • walkor 2018-01-22

    如果你想连接断开,直接重启nginx或者gateway就行了

  • linggang668 2018-01-22

    重启的话就会把客户端的连接断开重连,会把连接初始化时给客户端发送的消息重新发一遍,有没有办法把shutting状态的nginx进程和gateway的连接断掉呢

  • linggang668 2018-01-22

    理论上说,nginx 的进程不会再接受新的连接,那么也就是说当原来连接到nginx的客户端都断开后,这个nginx的进程应该会和gateway就断开了,但是为什么还会一直有连接呢,我网络方面不太好,这个问题没搞明白,呵呵

walkor

为什么cpu 100%,这个需要 strace 下对应的cpu 100%的进程才知道

  • linggang668 2018-01-22

    cpu100%的问题还不确定是不是因为nginx有太多的shutting进程导致的,这个等碰到了再查一下,但是有次是重启了gateway后就好了,shutting的nginx进程也没有了,所以怀疑是这里出现了问题

年代过于久远,无法发表回答
🔝