在PHP中,有没有更好的方法将CPU分配给其他进程?

在PHP中,有没有更好的方法将CPU分配给其他进程?,php,php-5.3,cpu-usage,Php,Php 5.3,Cpu Usage,我有一些通过cron定期运行的长时间运行的cliphp脚本。我希望它们尽快完成,但不会严重影响其他流程(如web服务器响应) 目前,我正在使用运行脚本 nice -n 19 还尝试了插入非常短的usleep()调用,例如在我的主循环中插入50微秒。不过,这并不总是像我在单核虚拟机上希望的那样快速地实现。顺便说一句,我没有使RAM饱和,所以没有分页发生 我已经了解到usleep()是一个系统调用,它允许调度器在需要时比没有任何系统调用时更快地为其他进程分配优先级 我想知道的是,是否有更好的方法在

我有一些通过cron定期运行的长时间运行的cliphp脚本。我希望它们尽快完成,但不会严重影响其他流程(如web服务器响应)

目前,我正在使用运行脚本

nice -n 19
还尝试了插入非常短的usleep()调用,例如在我的主循环中插入50微秒。不过,这并不总是像我在单核虚拟机上希望的那样快速地实现。顺便说一句,我没有使RAM饱和,所以没有分页发生

我已经了解到usleep()是一个系统调用,它允许调度器在需要时比没有任何系统调用时更快地为其他进程分配优先级

我想知道的是,是否有更好的方法在PHP中实现这一点。例如,一个不睡觉但立即产生优先级的呼叫


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

一般来说,Linux非常保守。但您可以尝试schedtool和libmlock。后者是将php锁定在ram中以避免交换。你也可以尝试游泳,因为游泳的速度通常很高。您也可以尝试自己使用积极的cflag编译php,甚至使用intelc编译器(我有销售许可证)。IMO schedtool与nice相同,但有更多的变量。

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

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


快乐编码。

如果<代码> Grime不为您裁剪,请考虑为内核选择不同的调度器。这是操作系统优先处理流程的问题。这不是您可以在应用程序内部轻松解决的问题(无论它是用PHP还是任何其他语言编写的)

哦,记住,
nice
levels并不会真正起作用,除非你渴望CPU周期。如果您的CPU大部分是空闲的,那么即使是一个级别为19的进程也可以占用它想要的所有CPU周期


编辑:事实上,在走这条路之前,请确保您的CPU已绑定。如果您受I/O限制,那么CPU优先级将不会有太大影响。

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


例如,假设您要导入一个大的XML文件。您可以尝试使用CLI工具
xsltproc
将XML文件转换为CSV格式,而不是在PHP中进行任何操作,这样您就可以轻松地使用PHP了。

我知道这不是主要目的,但是,没有参数的yield关键字不会有效地导致处理器向其他进程屈服吗?我一直认为这就是为什么它被称为收益率。

是的,它肯定是CPU受限的。它在这一过程中花费了99-100%的时间。我意识到nice在其他东西想要运行之前是不会启动的,它确实起作用了,尽管比预期的慢。在这种情况下,我肯定会首先尝试各种调度程序和选项。谢谢你的建议。如果我确定脚本的某个部分可以使用更高效的外部工具,这是有意义的。否则,进行系统调用和启动新shell进程的成本将远远大于usleep()。我在处理如此繁重的任务方面没有太多经验,但我经常看到像
awk
sed
这样的工具确实可以帮助PHP脚本,例如,因为它们经过了充分的设计和优化,可以处理它们自己的特定部分。您的主要评论与此无关(我已经指定它不受内存限制,也不进行任何分页)。但是你是唯一一个特别提到schedtool命令的人。我安装了它,发现它可以在SCHED_批处理模式下运行。因此我给你+1作为具体参考。谢谢你的回复。你是否尝试过用ICC编译php?这会对性能产生很大影响。你可以作为试用版下载它我的驾照还在。