最近在看 CSAPP ,看到进程部分,结合之前的 PHP 学习,有一些问题请教下各位 V 友:
pstree 32765 -np
可以看到 fpm 的进程结构如下图,这里的父进程( 32765 )在 fork 了子进程后,还会处理请求吗?还是只负责管理子进程?php-fpm(32765)─┬─php-fpm(508)
├─php-fpm(2527)
└─php-fpm(3344)
pm.max_requests
和 pm.process_idle_timeout
的预设值退出外,还会在什么机制下退出呢? fpm 的一个子进程会在一个请求生命周期结束后处理新的请求吗? 1
julyclyde 2021-11-15 12:41:40 +08:00
3 常说的不对
4 要看 limit ,达到了就不能正常工作了 5 回去学网络吧,这是一个常见错误理解 |
2
mahone3297 2021-11-15 12:46:41 +08:00
|
3
julyclyde 2021-11-15 12:53:48 +08:00
@mahone3297
1 php-fpm 是提前 fork 好的 |
4
mkfs 2021-11-15 15:03:45 +08:00
FPM 有好几种进程管理模式的,不同策略,用不同的参数。
PHP 是多进程模式的,一个请求一个进程。 max_requests 参数,是对于那种,要保留一定空闲进程的情况来说的,因为 PHP 是进程模式,有新的请求,就需要 fork 新进程,fork 成本比较高,为了提高响应速度,就预先 fork 一些进程,这样有请求过来,就直接用这些进程好了。因为 FPM 要一直保证存有一定数量的进程,所以可能会有一部分进程,一直没机会退出。那为什么要有 max_requests 参数呢?因为怕内存泄漏呗,超过一定数量的请求后,退出进程重新创建,可以解决这个问题。 process_idle_timeout ,是为了复用“那些 fork 出来,但又不准备长期保留的进程”的(有控制空闲进程数量的参数,超过设定数量的时候,会有进程退出),因为一个请求处理完毕后,可以先不退出这个进程,让后序到来的请求复用这个进程,如果超过这个时间没能复用,就退出这个进程。 Nginx 是事件驱动模式,有新的请求,不会创建新进程,但是他会调用 FPM ,FPM 会创建新进程。 文件描述符问题,超了,再发起相关创建描述符的调用,会报错:"too many open files",一般来说,你一个进程不需要打开这么多文件吧,况且 PHP 是多进程模式。 端口 9000 这个问题,其实就是 TCP 四元组的问题了,服务器 IP:端口+客户端 IP:端口。 |
5
mkfs 2021-11-15 15:05:07 +08:00
服务器 IP:服务器端口+客户端 IP:客户端端口
|