V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
palemoky
V2EX  ›  程序员

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

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

    最近在看 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   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:36 · PVG 19:36 · LAX 03:36 · JFK 06:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.