使用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是不是会断掉和客户端的连接呀?
看起来nginx reload后不会断开连接,然后gateway reload也不会断开连接(gateway restart会断开连接)。
然后二者仍然保持着连接。
你好, walkor,是的,现在就是这里遇到问题了,nginx和gateway都reload,那么nginx会产生新的worker进程,但是应该shutdown的老进程因为和gateway还有连接,所以也不会销毁,这样时间长了会有很多处于shutting状态的进程,这些进程都会占用资源。
请问您有什么推荐的解决办法吗?
如果你想连接断开,直接重启nginx或者gateway就行了
重启的话就会把客户端的连接断开重连,会把连接初始化时给客户端发送的消息重新发一遍,有没有办法把shutting状态的nginx进程和gateway的连接断掉呢
理论上说,nginx 的进程不会再接受新的连接,那么也就是说当原来连接到nginx的客户端都断开后,这个nginx的进程应该会和gateway就断开了,但是为什么还会一直有连接呢,我网络方面不太好,这个问题没搞明白,呵呵
为什么cpu 100%,这个需要 strace 下对应的cpu 100%的进程才知道
cpu100%的问题还不确定是不是因为nginx有太多的shutting进程导致的,这个等碰到了再查一下,但是有次是重启了gateway后就好了,shutting的nginx进程也没有了,所以怀疑是这里出现了问题