2011-04-28 52 views
3

我有一些长期运行的CLI PHP脚本通过cron定期运行。我希望他们尽快完成,但不会严重影响其他进程(例如Web服务器响应)。有没有更好的方法来让CPU在PHP中的其他进程?

目前,我与

nice -n 19 

运行脚本,也有将很短usleep()函式呼叫,例如50微秒在我的主循环试验。尽管如此,这并不总是像单核虚拟机那样快速产生。顺便说一句,我不饱和内存,所以没有分页发生。

我读过usleep()是一个系统调用,它允许调度程序在比没有任何系统调用的情况下更快地分配其他进程的优先级。

我想知道的是,如果有更好的方法在PHP中这样做。比如一个不睡觉但立即产生优先权的呼叫。

另外,我知道其他语言比PHP更高效,但这是用Symfony + Doctrine编写的更大应用程序的一部分。我不想分裂成多种语言,并失去了应用程序模型的业务逻辑优势。

+0

为什么不好够好? – 2011-04-28 19:46:46

回答

2

如果nice不适合你,可以考虑为你的内核选择一个不同的调度器。这是您的操作系统优先化进程的问题。这不是你可以在应用程序内轻松解决的问题(不管它是用PHP还是其他语言编写的)。

哦,请记住,nice级别不会真正启动,除非您需要CPU周期。如果你的CPU大部分处于空闲状态,那么即使是19级的进程也被允许吃掉它想要的所有CPU周期。

编辑:事实上,请确保您在沿着这条路径进行CPU限制之前。如果你是I/O绑定,那么CPU优先级不会有太大影响。

+0

是的,这绝对是CPU限制的。它在这个过程中花费了99-100%的时间。我意识到好的不会踢,直到别的东西想跑,而且它确实有效,尽管比想要的慢。 – ybull 2011-04-28 22:29:09

+0

在这种情况下,我肯定会首先尝试各种调度程序和选项。 – 2011-04-28 22:47:13

1

一般来说Linux非常保守。但你可以尝试schedtool和libmlock。后者是在公羊锁定php以避免交换。你也可以尝试交换,因为它大部分都很高。您也可以尝试使用积极的cflags或者使用英特尔C编译器(我有销售许可证)来自己编译php。国际海事组织schedtool是一样好,但有一些更多的变数。

+0

你的主要评论是无关的(我已经指定它不是内存限制的,也没有做任何分页)。但是你是唯一专门提到schedtool命令的人。我已经安装了它,发现它可以在SCHED_BATCH模式下运行。所以我给你+1的具体参考。 Thx – ybull 2011-05-14 14:14:01

+0

非常感谢您的回复。你有没有试过用ICC编译php?这会非常影响性能。您可以将其作为试用版下载进行测试。我还有我的执照。 – Bytemain 2011-05-14 14:20:00

1

“睡0次”通常是最好的,可以做到“立即控制”。其他方法通常需要在内核模式下运行(甚至内核模式可能会被硬件中断抢占,具体取决于)。

在“0睡眠时间”过程(或线程)将被安排为“再次在[将来的]未来的某个点”执行 - 确切的保证是系统特定的。实际睡眠的最低分辨率取决于环境和系统配置(一般来说,它不会是真正的“0时间”)。在非实时系统(例如Linux或Windows)上,确切的时间通常不能保证 - 调度程序将执行它想要的操作。

快乐编码。

0

也许您可以在PHP之外重写部分应用程序以使用命令行工具(不需要您的应用程序逻辑)。

例如,假设您有一个大的XML文件要导入。您可以尝试使用CLI工具xsltproc将您的XML文件转换为CSV格式,而不是使用PHP完成所有操作,这会为您提供一个轻量级的PHP文件。

+0

感谢您的建议。如果我确定脚本的某个部分可以使用更高效的外部工具,那么这很有意义。否则,进行系统调用和启动新的shell进程的成本将远远大于usleep()。 – ybull 2011-04-28 22:31:34

+0

是的,当然,好处必须超过这种方法的缺点。我在处理这些繁重的任务方面没有太多经验,但我经常看到像awk或sed这样的工具可以真正帮助PHP脚本,因为它们经过完全设计和优化以处理他们自己的具体部分。 – dandelionmood 2011-04-29 08:02:56

相关问题