Linux
Linux如何在程序之間分配頻寬?
如果我沒有設置任何流量整形,Linux 如何在程序之間分配(傳出)頻寬?
我的具體情況是,我在雲虛擬機上執行 30 個相同的程序,每個程序基本上都在盡可能快地通過網路 (TCP) 發送數據。它們似乎一起達到了我期望的總傳出頻寬。然而,一些程序比其他程序完成得更快,並且消耗更多的頻寬(高達 3 倍以上)。快速程序完成後,其餘程序會加速並使用更多頻寬。
Linux 如何決定每個程序應該獲得多少頻寬?
像大多數性能問題一樣,它很複雜。每個任務獲得多少頻寬是網路堆棧不同層的許多事物之間的複雜互動。即使沒有整形。不完整的列表:
CPU 調度程序,用於任務(和驅動程序中斷處理程序)何時可以進入 CPU
任務獲取數據的速度,可能受到瓶頸或爭用的限制
使用哪個隊列規則,本質上是一個數據包調度器
驅動程序詳細資訊,例如硬體 TX 隊列的數量以及它們如何選擇流
TCP 協議行為,如果一個流碰巧遇到擁塞控制,它可能會在頻寬有限的情況下保持緩慢
接收流的遠端系統的所有上述注意事項
- 如果您的所有連接都不會發送到同一個收件人,那麼另一端可能比您的一端更具影響力
其中許多不是針對相同頻寬“公平”進行優化,而是針對其他標准進行優化。TCP 擁塞控制寧願有一點吞吐量也不願遭受擁塞崩潰。
並且不要忘記,在任何給定時間,您可能都不是網路中唯一的一個 - 所以您還需要考慮“這裡”和“那裡”之間的路由器、交換機等”。
如果這不僅僅是一種好奇心,一個盡可能快的解決方案是獲得更多的頻寬。
或者,進行 QoS、整形或應用程序節流可以設置配額以獲得更好的整體行為,無論是什麼更好的方法。但這不再是越快越好,你通過政策來選擇贏家和輸家。