使用php命令行脚本的高CPU使用率是php-fpm的解决方案


High CPU usage with php command line scripts, is php-fpm the solution?

更新(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,这相当不错。

我也觉得curl_exec正在消耗很多CPU,但我不确定。

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

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

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


我问这个问题没有真正的希望。

我有一台服务器,用于运行辅助角色来处理一些后台任务。此服务器是具有高 CPU 警报设置的自动扩展组中的 EC2 服务器 (m1.small)。

我有大约 20 个工人(php 脚本实例)等待处理作业。要运行脚本,我正在使用 Symfony 2.3 framework 的控制台组件。

作业中

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

问题是,在 1 或 2 个工作线程运行时,CPU 处于 100%(我不认为它一直处于 100%,但它每秒左右就会飙升),这会导致自动扩展组启动新实例。

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

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

我正在使用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 个待处理的工作岗位上对此进行了测试。