【问题标题】:Apache fcgid php "Working" idle php processesApache fcgid php“工作”空闲 php 进程
【发布时间】:2017-09-20 15:53:42
【问题描述】:

我们遇到了一个问题,即 Apache (2.4.10) FCGID (2.3.9) PHP 进程在 Debian 上陷入“工作”状态。

这些 PHP 进程不占用系统资源(除了它们之前处理先前请求使用的内存占用)并且处于空闲状态。 它们仍然附加到正确的逻辑父进程(处理此 vhost 上的请求的 apache2 进程)

将 strace 连接到它们显示它们处于状态: 接受(0, 我们假设监听接收下一个请求。

在我们的 PHP 处理中添加到 handle_shutdown 函数中的应用程序日志显示所有这些请求都已命中 handle_shutdown 函数(没有错误) - 正如您对任何 PHP 处理的请求所期望的那样(因为您总是点击 handle_shutdown 函数),所以据我们所知,整个请求已“成功” Apache 访问日志中记录了 200 响应。

但是,apachectl fullstatus fcgid 部分显示该进程处于“工作”状态而不是“就绪”状态

更改 Fcgid 设置上的回收因子(最大请求数、生命周期、设置的超时时间更高或更低等)似乎不会影响这些发生的规律性。

一个 apachectl graceful 成功清理了所有空闲的“工作”线程并恢复正常。

但是,当然,如果我们不看就离开,最终,每个进程迟早都会处于这种状态,直到我们最终得到一个完全空闲的服务器,其中我们所有的最大进程 (100) 都是卡在“等待”但闲置。此时内存使用是合理的,当然 CPU、网络等都可以忽略不计,因为服务器将响应的唯一请求是 fullstatus(因为它没有命中 PHP vhost 部分)

【问题讨论】:

  • (哦,我们确实尝试将 apache2.conf 的 Mutex 模式从 file: [sdfds] 更改为 sem...,因为我们发现在 debian 上提到了 apache)
  • 您可能会在serverfault.com 上得到更好的回应,因为 SO 更多的是关于编程

标签: php apache zombie-process fcgid


【解决方案1】:

嗯。

事实证明,第一个建议的响应(将 apache2 Mutex 模式设置为“来自文件:”的“sem”是正确的,但是当它第一次应用时 - 我们的 apache2 服务不是冷启动而是重新启动 所以当然没有实际使用新的 Mutex 模式。

因此,当测试仍然显示错误时,此建议被注销。


发生了什么事?

apache2 fcgid PM 进程保留所有当前子进程的三个列表:“Ready”、“Working”和“Error/Exiting”。

它使用互斥锁(锁)来保护这些列表,只要它向子进程的信息块从“就绪”移动到“等待”,当它向它发出处理请求时 - 并且在子进程完成请求时再次移动,以便将其移回“就绪”状态。

此互斥锁保护从多个线程或进程访问的共享资源不会被一个进程“覆盖”,而另一个进程也在尝试读取或写入一个值(导致该其他进程要么读取值不一致,或者写入丢失)通过一次只允许一个进程访问该重要资源。

Debian 上的默认“file:”互斥锁似乎不能胜任这项工作,这会导致非常偶然(正如网络上其他地方所建议的那样),同时发生两个状态更改请求,因此一个更改成功,而其他(并发)更改“丢失”。

因此,孩子知道它已经完成,但父母认为它没有。

咕噜!


道德:在 Debian 上,如果将 apache2 与 fcgid 一起使用,请更改您的互斥锁模式 - 并确保您在 apache 启动之后执行完整的 apache 停止,不要相信您的服务器管理员只完成了 apache 重启!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多