利用多个进程利用/饱和CPU,以便进程仍然可以正常运行

时间:2012-02-29 13:31:32

标签: linux process cpu-usage

我想要监控大约10k个视频流。将会有一个小型集群(例如:5-10)监控这些流的异构机器。因为没有足够的CPU来完成这一切,所以我必须对流进行洗牌,一次监控其中几个,然后切换到下一组。

现在,我的问题是..我想尽可能多地使用核心,这样我就可以使用发烧设备,这样就可以更频繁地监控每个流。

Streams具有不同的分辨率,因此CPU使用率也不同。

  • 我相对简单的解决方案是测量每台机器上最高比特率流的CPU使用率(不同的CPU,不同的使用情况)。如果它是10%,并且我有4个核心,我可以在该机器上一次安全地运行9 * 4 = 36个进程。但这显然会浪费大量CPU能力,因为其他流的比特率较低。
  • 更好的解决方案是持续监控核心的使用情况,如果利用率低于阈值(例如:95-10 = 85%),则启动新流程。
  • 一个复合体是用nice -n 20启动一个新进程,然后以某种方式检查它是否能够处理数据(xx),如果是,然后将其重新设置为普通优先级并尝试使用下一个过程...(xx:目前我不确定这是否可行..)

你看到这些设计有任何缺陷吗?任何其他想法如何有效地做到这一点?

我的另一个问题是linux调度程序..它是否能够正确分发进程?有taskset为进程设置CPU关联性,手动控制分配是否有意义? (我认为确实如此)

此外,衡量流程CPU使用率的正确方法是什么?有/proc/PID/statgetrusage,但它们都返回使用的CPU时间,但我需要一个百分比。 (注意:此Q具有最低优先级,如果没有响应,我将只检查top的来源)。我知道我可以使用mpstat来监控核心。

1 个答案:

答案 0 :(得分:1)

也许我错过了一些东西,但为什么你需要将视频流分组为固定集?

根据我对问题的理解,您将基本上采样每个流并处理样本。如果我实现这样的东西,我会将所有流放在a work queue中,最好是支持work stealing的流,以最大限度地减少线程饥饿。

每个工作线程都会从队列的头部获取流对象/描述符/ URI /,然后对其进行采样和处理,然后在队列末尾将其移回。

CPU利用率应该不是问题,除非由于实时约束,单个流不能总是使单个核饱和。如果处理每个样本时的延迟不是问题,那么您有一些替代方案:

  • 使用大量处理线程,直到所有核心都在所有情况下都得到充分利用。

  • 使用单独的输入线程接收流块并传递那些进行处理。这应该将网络延迟与实际流处理分离。

我不知道分布式系统的任何工作队列实现(而不仅仅是SMP系统),但如果找不到符合您需求的东西,那么构建自己的一个应该相对容易......