【发布时间】:2010-11-26 18:46:47
【问题描述】:
我有一个简单的 bash 脚本,可以将一个进程的输出通过管道传输到另一个进程。即:。
dostuff | filterstuff
碰巧在我的 Linux 系统(openSUSE,如果重要的话,内核 2.6.27)上,这两个进程都在一个内核上运行。但是,在不同的内核上运行不同的进程是默认策略,在这种情况下不会触发。
系统的哪个组件对此负责,我应该怎么做才能利用多核功能?
注意在2.6.30内核上没有这个问题。
澄清:按照Dennis Williamson 的建议,我确定 使用顶级程序,管道进程确实始终 运行同一个处理器。 Linux 调度程序,通常做得很好,这次不行了。
我认为 bash 中的某些内容会阻止操作系统执行此操作。问题是我需要一个适用于多核和单核机器的便携式 解决方案。 Dennis Williamson 提出的taskset solution 在单核机器上是行不通的。目前我正在使用:,
dostuff | taskset -c 0 filterstuff
但这似乎是一个肮脏的黑客。谁能提供更好的解决方案?
【问题讨论】:
-
尝试多次使用
top重复您的测试(不使用taskset)。当我这样做时,有时这两个进程在同一个 CPU 上,有时在不同的 CPU 上。 -
它们总是在同一个上,只使用了 50% 的系统 :(
-
试试
( dostuff ) | ( filterstuff )看看他们出现在哪个内核上。一个区别(如果重要的话)是您使用的是多核系统,而我使用的是多处理器(每个单核)系统。你为什么要分离这些进程呢?它们是您编写的程序吗?您可以更改它们以影响调度程序本身吗? -
如果它们是串行的(unix 管道的性质),如果它们位于不同的内核上,您真的会获得性能提升吗?
-
@Jeremy:是的,它在不同内核上的运行速度提高了 2-3 倍:我在
bzcat file.bz2 | gzip >file.gz上测量了这个。在原始情况下,dostuff执行昂贵的计算并产生大量输出,filterstuff将其即时存档。就我而言,数据传输不是瓶颈。
标签: linux bash process scheduling multicore