gpt4 book ai didi

linux - 如何在多个内核上运行通过 bash 管道传输的进程?

转载 作者:IT王子 更新时间:2023-10-28 23:59:29 25 4
gpt4 key购买 nike

我有一个简单的 bash 脚本,可以将一个进程的输出通过管道传输到另一个进程。即:.

dostuff | filterstuff

碰巧在我的 Linux 系统(openSUSE,如果重要的话,内核 2.6.27)上,这两个进程都在一个内核上运行。但是,在不同的内核上运行不同的进程是默认策略,在这种情况下不会触发。

系统的哪个组件对此负责,我应该怎么做才能利用多核功能?

注意在2.6.30内核上没有这个问题。

澄清:已关注Dennis Williamson的建议,我确定使用顶级程序,管道进程确实总是在同一个处理器上运行。通常做得很好的 Linux 调度程序,这次却没有做到。

我认为 bash 中的某些内容会阻止操作系统执行此操作。问题是我需要一个适用于多核和单核机器的可移植解决方案。 任务集 solutionDennis Williamson 提出不会在单核机器上工作。目前我正在使用:,

dostuff | taskset -c 0 filterstuff 

但这似乎是一个肮脏的 hack。谁能提供更好的解决方案?

最佳答案

假设 dostuff 在一个 CPU 上运行。它将数据写入管道,该数据将在该 CPU 的缓存中。因为 filterstuff 正在从该管道读取数据,所以调度程序决定在同一个 CPU 上运行它,因此它的输入数据已经在缓存中。

如果您的内核是使用 CONFIG_SCHED_DEBUG=y 构建的,

# echo NO_SYNC_WAKEUPS > /sys/kernel/debug/sched_features

应该禁用此类启发式。 (有关其他调度程序可调参数,请参阅 /usr/src/linux/kernel/sched_features.h/proc/sys/kernel/sched_*。)

如果这有帮助,并且问题仍然发生在较新的内核上,并且在单独的 CPU 上运行确实比在一个 CPU 上运行更快,请将问题报告给 Linux 内核邮件列表,以便他们可以调整他们的启发式。

关于linux - 如何在多个内核上运行通过 bash 管道传输的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com