0

更新(2013 年 10 月 1 日):

今天终于知道是什么问题了。在使用 xdebug 调试了几个小时并尝试执行多个脚本后,我注意到脚本的主体不是问题。当以 10-20 秒的睡眠执行测试工作者时,我注意到 CPU 大部分时间都处于空闲状态,因此扣除消耗最多 CPU 的原因是引导 Symfony。

我的脚本被非常迅速地执行并杀死以典当新脚本等。我已经修复了它,添加了一个do{}while()在随机数秒后退出的(以避免所有工作人员同时重新启动)。

我已经将负载从平均 35-45% 减少到平均 0.5-1.5% 这是一个巨大的改进。恢复 Symfony 被引导一次,并且在脚本等待随机超时以杀死自身并启动自身的新实例之后。这是为了避免脚本挂起或数据库连接超时等。

如果您有更好的解决方案,请不要犹豫分享。对于相同的工作量,我很高兴从 100% 的 CPU 使用率(x4 服务器,因为自动缩放)降低到不到 1%(并且只有一台服务器) ,现在它甚至更快。


更新(2013 年 9 月 24 日):

刚刚注意到 Symfony 的控制台组件dev默认使用环境。我已经prod在命令行中指定:./app/console --env=prod my:command:action我将执行时间除以 5,这非常好。

我也有吃大量 CPU 的感觉,curl_exec但我不确定。

我正在尝试使用 xdebug 调试 CPU 使用情况,读取生成的 cachegrind,但是没有参考每个函数、类使用的 CPU 周期......只有花费的时间和使用的内存。

如果你想在 PHP 命令行中使用 xdebug,只需#!/usr/bin/env php -d xdebug.profiler_enable=On在脚本顶部使用

如果有人有使用 xdebug 调试的提示,我会很高兴听到它;)


我在没有真正希望的情况下问这个问题。

我有一台服务器,用于运行工作人员来处理一些后台任务。此服务器是具有高 CPU 警报设置的自动缩放组内的 EC2 服务器 (m1.small)。

我有大约 20 个工人(php 脚本实例)在等待处理工作。要运行脚本,我使用Symfony 2.3 framework.

作业中没有发生太多事情,从 URL 获取数据,循环遍历结果并将其逐行插入(每个作业约 1000 行)到 MySQL(RDS 服务器)中。

问题是,在运行 1 或 2 个工作人员时,CPU 处于 100%(我不认为它一直处于 100%,但它每秒左右都在飙升),这会导致自动缩放组启动新实例.

我想减少根本不合理的 CPU 使用率。我正在查看 php-fpm (fastCGI),但它看起来仅适用于 Web 服务器。PHP客户端不会使用它吗?对?

任何帮助将不胜感激,干杯

4

1 回答 1

0

我正在使用 FPM SAPI 运行 PHP 5.5.3,正如@datasage 在他的评论中指出的那样,这只会影响基于 Web 的事物。您在 CLI 上运行一个php -v命令,您会注意到:

PHP 5.5.3 (cli) (built: Sep 17 2013 19:13:27)

所以 FPM 并不是 CLI 的一部分。

我也在运行与您类似的情况,除了我通过 Zend Framework 2 运行作业。我发现运行循环信息的作业有时可能是资源密集型的,但我也发现它是由顺便说一句,我最初自己开发了那个循环。它通常与 PHP 本身无关。

我不确定您的设置,但在我的一项永远运行的工作中,我发现这效果最好,而且我的服务器负载几乎为零。

[root@router ~]$ w
12:20:45 up  4:41,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0     11:52    5.00s  0.02s  0.00s w

这里只是一个“例子”:

do {
    sleep(2);

    // Do your processing here
} while (1);

// Do your processing here我实际上是在运行多个数据库查询、处理文件并根据作业要求运行服务器命令。

所以简而言之,我不会责怪或认为 PHP-FPM 导致了您的问题,但很可能我会开始研究您如何开发代码以运行并进行必要的更改。

我目前有四个永远运行的作业,并且不断查看我的数据库以查找要处理的作业,并且服务器负载从未飙升。我什至用 1,000 个待处理的工作对此进行了测试。

于 2013-09-22T17:26:25.050 回答