原来有文章提到过,Centos7上多个进程可以同时listen同一个端口,起到负载均衡的效果,也方便实现服务的无缝升级; 但是Centos6上多个进程同时listen同一个端口的情况怎么理解呢?
首先,这事儿并不新鲜,正常情况下php-fpm的每个子进程都在listen中父进程集成下来的9000端口的,这个并不冲突;但是下图有显示ssh和fpm同时listen 9000端口:
何故?会有问题吗?
进程说明: web server通过fpm提供了一个命令执行的功能,通过shell_exec()执行的,命令执行的是一个ssh命令,执行时间比较长;该ssh进程继承了父进程的文件描述符 *:9000 就被listen了,显然,该ssh进程其实是不会去accept该 *:9000 端口的,所以正常请求不会被ssh意外处理的。
似乎没啥问题,但是确实有问题:
fpm master派生新的子进程后,新的子进程不能正常accept该文件描述符,strace跟踪部分输出如下:
我们发现,fpm子进程accept(0,…) 报“资源临时不可用”,然后直接退出,然后fpm-master继续派生新的子进程,然后再退出,迅速重复该过程,结果:
- 机器负载飙升
- fpm-master几乎无法立即给每个退出的子进程收尸,于是出现大量fpm子进程处于 僵尸状态
问题:
- web shell曾经也做过,为啥没见过这个问题?
- 为啥会出现这种情况?
附:
服务器版本信息: