我有一个简单的bash脚本,将一个进程的输出管道传递给另一个进程。即:
dostuff | filterstuff
我在我的Linux系统(如果有影响,是openSUSE,内核2.6.27)上发现这两个进程都运行在同一个核心上。然而,在不同的核心上运行不同的进程是一种默认策略,在这种情况下没有触发。
系统的哪个组件负责此事,我该怎么做才能利用多核功能?
请注意,在2.6.30内核上不存在此问题。
澄清:根据Dennis Williamson的建议,我使用top程序确保管道进程确实始终在同一个处理器上运行。通常表现得很好的Linux调度程序这次没有做到。
我想bash中的某些内容防止操作系统这样做。问题是我需要一个适用于多核和单核机器的可移植解决方案。Dennis Williamson提出的taskset
solution在单核机器上无法工作。目前我正在使用:
dostuff | taskset -c 0 filterstuff
但这似乎是一种不太优雅的解决方案。是否有更好的解决方案?
taskset
,用top
重复运行测试几次。当我这样做时,有时两个进程在同一个CPU上,有时在不同的CPU上。 - Dennis Williamson( dostuff ) | ( filterstuff )
并查看它们出现在哪个核心上。一个区别(如果有影响的话)是你在多核系统上,而我在多处理器(每个单核)系统上。无论如何,为什么要分离这些进程呢?它们是你编写的程序吗?你能否更改它们以便它们自己影响调度程序? - Dennis Williamsonbzcat file.bz2 | gzip >file.gz
来测量的。在原始情况下,dostuff
执行昂贵的计算并产生大量输出,而filterstuff
则实时进行归档。在我的情况下,数据传输不是瓶颈。 - P Shved