gpt4 book ai didi

linux - 为什么我程序中的这个线程会挨饿?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:25 24 4
gpt4 key购买 nike

我有一个大约有 80 个线程的程序。它在 Linux 3.36 上的 ~50ish 核心机器上运行。最多同时运行这些程序中的 2 个,并且它们是相同的。机器上没有其他任何东西在运行。

线程本身是具有 SCHED_RR(循环)策略的实时 linux pthreads。

  • 10 是最高优先级(是的,我将 ulimit 设置为 99)并将 cpu affinity 设置为 10 个核心。换句话说,它们都固定在自己的核心上。
  • 大约 60 个是中等优先级。
  • 大约 10 个是低优先级。

优先级最高的 10 个线程一直在使用 cpu。

其余的在做网络IO的同时也在CPU上做一些工作。这就是问题所在:我看到低优先级线程之一被饿死,有时一次超过 15 秒。此特定线程正在等待 TCP 套接字以获取某些数据。我知道数据已完全发送,因为我可以看到连接另一端的服务器已发送数据(即,它在发送数据后记录时间戳)。通常线程需要毫秒来接收和处理它,但偶尔会在对方服务器成功发送数据后需要 15 秒。请注意,增加线程的优先级并将其固定到 CPU 已经消除了这个问题,但这不是一个长期的解决方案。我一开始就没想到会出现这种行为 - 15 秒是很长的时间。

有人知道为什么会这样吗?我们已经排除了它是程序/线程中的任何逻辑。另请注意,该程序是用 C 语言编写的。

最佳答案

I would not expect this behavior in the first place - 15 seconds is a very long time.

如果您的 60 个中等优先级线程都可以运行,那么这正是您所期望的:使用实时线程时,低优先级线程根本不会运行,而存在高优先级线程仍然可以运行。

您或许可以使用 perf timechart 来准确分析正在发生的事情。

关于linux - 为什么我程序中的这个线程会挨饿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40121635/

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