Nginx php-fpm 在高负载下写连接阻塞
Nginx php-fpm clogs up with writing connections under high load
我们有 nginx/1.6.2 运行 php5-fpm (5.6) debian 8 系统。
过去几天,由于更多用户访问我们的服务器,我们的负载比平时高。大多数游客在下午 6 点到午夜之间的傍晚时段到来。
几天后,运行上述设置的两台不同服务器在几个小时内显示响应速度非常慢。在 Munin 中,我们看到,"writing" 状态 突然出现 数百个 nginx 连接,而以前一次只有大约 20 个。
在尝试访问这些服务器时,除了远程主机上的连接超时外,我们没有收到任何错误。我看到的所有日志都是正常的。
重启php5-fpm即可解决问题。
我的问题现在是:为什么突然有数百个进程声称它们正在写入?是否有一些已知问题或我们错过的配置设置可能导致此问题?
这是我们看到的症状的完整列表:
- 而不是 < 20 个非常快的活动连接/秒,我们在 写入状态 中看到多达 100 到 900 个连接(所有 nginx 连接都命中 php5-fpm,静态这些服务器不提供内容)平均。 php 脚本的脚本运行时间为 80 毫秒。
- 仅当 nginx 请求总量/s 超过 300/s 时才会出现问题,然后从 ~350 下降到 ~250 req/s 但是这 250 显示最多 900 "writing" 连接
- 这些连接中有许多最终会超时并且不会给出正确的结果
- 我们的日志中没有错误
- eth/数据库流量以及 CPU 负载对应于总数下降到的较低级别 250req/s,因此没有 "writing" 发生 afaik。
对于设置:
如上所述。我们使用 Zend 的内置操作码缓存,APCu 用于某些用户变量缓存,其中一台服务器运行一个内存缓存实例(在整个问题中工作正常),另一台是 运行 的 Redis 版本,它也出现问题时运行正常。
任何人都可以阐明问题所在吗?
谢谢!
我们发现了问题:APCu 在 PHP 5.6 中似乎不稳定。
详情:
- debian 8
- nginx/1.6.2
- PHP 5.6.14-0+deb8u1
- APCu 4.0.7(修订版:328290、126M shm_size)
我们使用 xhprof 来分析服务器速度较慢时的请求(参见问题)并注意到,APCu 每个 read/write 操作花费 > 100 毫秒。清除 APCu 变量没有帮助。代码的所有其他部分都具有正常速度。
我们完全禁用了 APCu,此后系统一直稳定。
看来,此 APCu 版本在 PHP 5.6 的负载下不稳定。至少对我们来说。
我们遇到了同样的问题,原因是Redis中的数据比"maxmemory"多,所以redis无法写入更多数据。我可以使用 redis-cli 登录但无法设置值,如果您遇到此问题,您可以使用 redis-cli 登录 redis 并尝试设置一些内容,如果 redis 内存已满,您将收到错误消息。
我们有 nginx/1.6.2 运行 php5-fpm (5.6) debian 8 系统。
过去几天,由于更多用户访问我们的服务器,我们的负载比平时高。大多数游客在下午 6 点到午夜之间的傍晚时段到来。
几天后,运行上述设置的两台不同服务器在几个小时内显示响应速度非常慢。在 Munin 中,我们看到,"writing" 状态 突然出现 数百个 nginx 连接,而以前一次只有大约 20 个。
在尝试访问这些服务器时,除了远程主机上的连接超时外,我们没有收到任何错误。我看到的所有日志都是正常的。
重启php5-fpm即可解决问题。
我的问题现在是:为什么突然有数百个进程声称它们正在写入?是否有一些已知问题或我们错过的配置设置可能导致此问题?
这是我们看到的症状的完整列表:
- 而不是 < 20 个非常快的活动连接/秒,我们在 写入状态 中看到多达 100 到 900 个连接(所有 nginx 连接都命中 php5-fpm,静态这些服务器不提供内容)平均。 php 脚本的脚本运行时间为 80 毫秒。
- 仅当 nginx 请求总量/s 超过 300/s 时才会出现问题,然后从 ~350 下降到 ~250 req/s 但是这 250 显示最多 900 "writing" 连接
- 这些连接中有许多最终会超时并且不会给出正确的结果
- 我们的日志中没有错误
- eth/数据库流量以及 CPU 负载对应于总数下降到的较低级别 250req/s,因此没有 "writing" 发生 afaik。
对于设置: 如上所述。我们使用 Zend 的内置操作码缓存,APCu 用于某些用户变量缓存,其中一台服务器运行一个内存缓存实例(在整个问题中工作正常),另一台是 运行 的 Redis 版本,它也出现问题时运行正常。
任何人都可以阐明问题所在吗?
谢谢!
我们发现了问题:APCu 在 PHP 5.6 中似乎不稳定。
详情:
- debian 8
- nginx/1.6.2
- PHP 5.6.14-0+deb8u1
- APCu 4.0.7(修订版:328290、126M shm_size)
我们使用 xhprof 来分析服务器速度较慢时的请求(参见问题)并注意到,APCu 每个 read/write 操作花费 > 100 毫秒。清除 APCu 变量没有帮助。代码的所有其他部分都具有正常速度。
我们完全禁用了 APCu,此后系统一直稳定。
看来,此 APCu 版本在 PHP 5.6 的负载下不稳定。至少对我们来说。
我们遇到了同样的问题,原因是Redis中的数据比"maxmemory"多,所以redis无法写入更多数据。我可以使用 redis-cli 登录但无法设置值,如果您遇到此问题,您可以使用 redis-cli 登录 redis 并尝试设置一些内容,如果 redis 内存已满,您将收到错误消息。