使用nginx作為前端代理,在reload nginx的時候,發(fā)現(xiàn)nginx會一直處于shutting狀態(tài),當(dāng)reload nginx次數(shù)多了以后,cup會飆升到100%, gateway的狀態(tài)也會處于busy狀態(tài)。
現(xiàn)象如下:
//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的進程發(fā)現(xiàn),這個進程一直和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的狀態(tài)如下:發(fā)現(xiàn)會有11789這個進程(當(dāng)nginx reload的次數(shù)多的時候,gateway就會處于busy狀態(tài)。)
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鏈接導(dǎo)致的,但是gateway reload后,gateway的進程還是那幾個并沒有重新啟動,這正常嗎?
ps:如果把gateway restart了,gateway的進程id會改變,nginx中的shutting狀態(tài)的進程也會消失,但是gateway restart是不是會斷掉和客戶端的連接呀?
看起來nginx reload后不會斷開連接,然后gateway reload也不會斷開連接(gateway restart會斷開連接)。
然后二者仍然保持著連接。
你好, walkor,是的,現(xiàn)在就是這里遇到問題了,nginx和gateway都reload,那么nginx會產(chǎn)生新的worker進程,但是應(yīng)該shutdown的老進程因為和gateway還有連接,所以也不會銷毀,這樣時間長了會有很多處于shutting狀態(tài)的進程,這些進程都會占用資源。
請問您有什么推薦的解決辦法嗎?
重啟的話就會把客戶端的連接斷開重連,會把連接初始化時給客戶端發(fā)送的消息重新發(fā)一遍,有沒有辦法把shutting狀態(tài)的nginx進程和gateway的連接斷掉呢
理論上說,nginx 的進程不會再接受新的連接,那么也就是說當(dāng)原來連接到nginx的客戶端都斷開后,這個nginx的進程應(yīng)該會和gateway就斷開了,但是為什么還會一直有連接呢,我網(wǎng)絡(luò)方面不太好,這個問題沒搞明白,呵呵
為什么cpu 100%,這個需要 strace 下對應(yīng)的cpu 100%的進程才知道
cpu100%的問題還不確定是不是因為nginx有太多的shutting進程導(dǎo)致的,這個等碰到了再查一下,但是有次是重啟了gateway后就好了,shutting的nginx進程也沒有了,所以懷疑是這里出現(xiàn)了問題