关于进程和 PHP -fpm 的一些疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
palemoky
V2EX    程序员

关于进程和 PHP -fpm 的一些疑惑

  •  
  •   palemoky 2021-11-15 12:22:41 +08:00 1818 次点击
    这是一个创建于 1431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 CSAPP ,看到进程部分,结合之前的 PHP 学习,有一些问题请教下各位 V 友:

    1. 通过 pstree 32765 -np 可以看到 fpm 的进程结构如下图,这里的父进程( 32765 )在 fork 了子进程后,还会处理请求吗?还是只负责管理子进程?
      php-fpm(32765)─┬─php-fpm(508) ├─php-fpm(2527) └─php-fpm(3344) 
    2. 子进程在处理完一个请求后会退出吗? fpm 除了在达到 pm.max_requestspm.process_idle_timeout 的预设值退出外,还会在什么机制下退出呢? fpm 的一个子进程会在一个请求生命周期结束后处理新的请求吗?
    3. 常说一个应用程序就是一个进程,像 Nginx 或 php-fpm 又会 fork 多个子进程,那此时的 Nginx 和 PHP 是有几个进程呢? 1 个吗?因为子进程都由父进程管理?
    4. 每个进程都有独立的文件描述符表, 我看默认大小是 1024 ,如果一个请求依赖打开超过 1024 个资源,那是不是这个请求就无法正常处理了呢?
    5. 当 fpm 通过 tcp 的方式与 Nginx 通信时,默认的 fpm 端口是 9000 ,不同的子进程是如何都通过 9000 和 Nginx 通信的呢?还是子进程有不同的端口呢?
    5 条回复    2021-11-15 15:05:07 +08:00
    julyclyde
        1
    julyclyde  
       2021-11-15 12:41:40 +08:00
    3 常说的不对
    4 要看 limit ,达到了就不能正常工作了
    5 回去学网络吧,这是一个常见错误理解
    mahone3297
        2
    mahone3297  
       2021-11-15 12:46:41 +08:00
    1. 应该是要 accept 请求,然后 fork 其他子进程
    2. 应该不会退出,等待处理新请求。除了达到你说的 pm.max_requests 和 pm.process_idle_timeout 等设置
    3. 很多个进程
    4. 应该会报错 too many open files
    5. 可能 @julyclyde 的意思是子进程有不同的端口?请教下 @julyclyde 这里,子进程是直接跟 nginx 通信的是吧?
    julyclyde
        3
    julyclyde  
       2021-11-15 12:53:48 +08:00
    @mahone3297
    1 php-fpm 是提前 fork 好的
    mkfs
        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:端口。
    mkfs
        5
    mkfs  
       2021-11-15 15:05:07 +08:00
    服务器 IP:服务器端口+客户端 IP:客户端端口
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6197 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:59 PVG 09:59 LAX 18:59 JFK 21:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86