我想要监控大约10k个视频流。将会有一个小型集群(例如:5-10)监控这些流的异构机器。因为没有足够的CPU来完成这一切,所以我必须对流进行洗牌,一次监控其中几个,然后切换到下一组。
现在,我的问题是..我想尽可能多地使用核心,这样我就可以使用发烧设备,这样就可以更频繁地监控每个流。
Streams具有不同的分辨率,因此CPU使用率也不同。
nice -n 20
启动一个新进程,然后以某种方式检查它是否能够处理数据(xx),如果是,然后将其重新设置为普通优先级并尝试使用下一个过程...(xx:目前我不确定这是否可行..)你看到这些设计有任何缺陷吗?任何其他想法如何有效地做到这一点?
我的另一个问题是linux调度程序..它是否能够正确分发进程?有taskset
为进程设置CPU关联性,手动控制分配是否有意义? (我认为确实如此)
此外,衡量流程CPU使用率的正确方法是什么?有/proc/PID/stat
和getrusage
,但它们都返回使用的CPU时间,但我需要一个百分比。 (注意:此Q具有最低优先级,如果没有响应,我将只检查top
的来源)。我知道我可以使用mpstat
来监控核心。
答案 0 :(得分:1)
也许我错过了一些东西,但为什么你需要将视频流分组为固定集?
根据我对问题的理解,您将基本上采样每个流并处理样本。如果我实现这样的东西,我会将所有流放在a work queue中,最好是支持work stealing的流,以最大限度地减少线程饥饿。
每个工作线程都会从队列的头部获取流对象/描述符/ URI /,然后对其进行采样和处理,然后在队列末尾将其移回。
CPU利用率应该不是问题,除非由于实时约束,单个流不能总是使单个核饱和。如果处理每个样本时的延迟不是问题,那么您有一些替代方案:
使用大量处理线程,直到所有核心都在所有情况下都得到充分利用。
使用单独的输入线程接收流块并传递那些进行处理。这应该将网络延迟与实际流处理分离。
我不知道分布式系统的任何工作队列实现(而不仅仅是SMP系统),但如果找不到符合您需求的东西,那么构建自己的一个应该相对容易......