代码之家  ›  专栏  ›  技术社区  ›  P Shved

如何在多核上运行用bash管道传输的进程?

  •  11
  • P Shved  · 技术社区  · 17 年前

    我有一个简单的bash脚本,它将一个进程的输出传输到另一个进程。即:。

    dostuff | filterstuff
    

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

    系统的哪个组件对此负责,我应该如何利用多核功能?

    笔记 在2.6.30内核上没有这样的问题。

    澄清 :跟随 Dennis Williamson 我提出了他的建议 当然 总是 在同一个处理器上运行。Linux调度程序通常做得很好,但这次不行。

    我认为bash中的某些东西阻止操作系统这么做。问题是我需要一个 多核和单核机器的解决方案。这个 taskset solution 丹尼斯·威廉姆森 不能在单核机器上工作。目前我正在使用:,

    dostuff | taskset -c 0 filterstuff 
    

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

    3 回复  |  直到 9 年前
        1
  •  7
  •   ephemient    17 年前

    认为 dostuff 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内核邮件列表,以便他们可以调整他们的启发式方法。

        2
  •  7
  •   Dennis Williamson    17 年前

    尝试设置CPU(处理器)相关性:

    taskset -c 0 dostuff | taskset -c 1 filterstuff
    

    编辑:

    试试这个实验:

    • chmod +x proctest 以此为内容:

      #!/bin/bash
      while true
      do
        ps
        sleep 2
      done  
      
    • ./proctest | grep bash
      
    • 在另一个终端中,启动top-确保它按%CPU排序
    • 让它稳定几秒钟,然后退出
    • 发出命令 ps u
    • 开始 top -p 从退出程序屏幕上留下的列表中,列出最高几个进程的PID,例如其中的8个进程 top 再加上那些 proctest grep 被列为 ps -全部以逗号分隔,如下所示(顺序无关紧要):

      top -p 1234, 1255, 1211, 1212, 1270, 1275, 1261, 1250, 16521, 16522
      
    • 添加处理器字段-按 然后 J 空间
    • 将排序设置为PID-按 转移 + F A. 然后 空间
    • 可选:按 转移 + 打开“线程视图”的步骤
    • 可选:按 D 和类型 .09 和新闻 设置一个短的延迟时间
    • 现在,当进程从一个处理器移动到另一个处理器时,您应该看到 格雷普 跳转,有时在同一个处理器上,有时在不同的处理器上
        3
  •  1
  •   MarkR    17 年前

    如果您有两个任务都真正准备好在CPU上运行,我希望看到它们被安排在不同的内核上(在某个时候)。

    我的猜测是,dostuff会一直运行到管道缓冲区满为止,此时它无法再运行,因此“filterstuff”进程会运行,但它运行的时间很短,直到filterstuff完成对整个管道缓冲区的过滤之后,dostuff才会重新调度,此时dostuff会再次被调度。