gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:36:48 30 4
gpt4 key购买 nike

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

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

流的分辨率不同,因此 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 监控内核。

最佳答案

也许我遗漏了什么,但为什么您需要将视频流分组到固定的集合中?

根据我对问题的理解,您基本上是对每个流进行采样并处理样本。如果我正在实现这样的事情,我会将所有流放在 a work queue 中, 最好支持 work stealing以尽量减少线程饥饿。

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

CPU 利用率应该不是问题,除非由于实时限制,单个流不能总是使单个内核饱和。如果处理每个样本时的延迟不是问题,那么您有几个备选方案:

  • 使用更多的处理线程,直到所有内核在所有情况下都得到充分利用。

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

我不知道分布式系统(与单纯的 SMP 系统相对)的任何工作队列实现,但如果您找不到适合您需要的东西,构建您自己的一个应该相对容易...

关于linux - 利用多个进程使 CPU 饱和,以便进程仍然可以正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500073/

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