Linux 如何在进程间分配带宽?

Tho*_*son 6 linux tcp linux-networking

如果我不设置任何流量整形,Linux 如何在进程之间分配(传出)带宽?

我的具体情况是我在一个云 VM 上运行 30 个相同的进程,每个进程基本上都尽可能快地通过网络 (TCP) 发送数据。它们一起似乎达到了我期望的总输出带宽。然而,有些进程比其他进程完成得更快,并且消耗更多的带宽(高达 3 倍)。快速进程完成后,其余进程会加快速度并使用更多带宽。

Linux 如何决定每个进程应该获得多少带宽?

Joh*_*ald 6

像大多数性能问题一样,它很复杂。每个任务获得多少带宽是网络堆栈不同层的许多事物之间的复杂交互。即使没有整形。一份不完整的清单:

  • 任务(和驱动程序中断处理程序)何时可以进入 CPU 的 CPU 调度程序
  • 任务获取数据的速度,可能受到瓶颈或争用的限制
  • 正在使用哪种排队规则,本质上是一个数据包调度程序
  • 驱动程序详细信息,例如硬件 TX 队列的数量以及它们如何选择流
  • TCP 协议行为,如果一个流碰巧遇到拥塞控制,它可能会在带宽有限的情况下保持缓慢
  • 接收流的远程系统的所有上述注意事项
    • 如果您的所有连接都不会到达同一个收件人,则另一端的影响可能比您的一端更大

其中许多不是针对相等带宽“公平性”进行优化,而是针对其他标准进行优化。TCP 拥塞控制宁愿有一点好处也不愿遭受拥塞崩溃。

并且不要忘记,在任何给定时间,您可能不是网络中唯一的一个 - 因此您还需要在“这里”和“那里”之间考虑路由器、交换机等”。


如果这不仅仅是出于好奇,那么尽快的解决方案是获得更多带宽。

或者,进行 QoS、整形或应用程序限制可以设置配额以获得更好的整体行为,无论是什么更好的手段。但这不再是越快越好,您按政策选择赢家和输家。