最大化多隊列 NIC 上的 Linux 網路性能
根據https://lwn.net/Articles/629155/ Linux 核心的說法,“每個核心每秒只能轉發 1M 到 2M 的數據包”——但是 Linux 在擴展數十個核心方面有多好呢?
假設我在多核 CPU 上有一個多隊列(128 個 rx+tx 對)100gbps NIC - Linux 是否能夠使 100gbps NIC 飽和,即跨幾十個核心擴展“每秒每核心 1M 到 2M 數據包”而無需太多回歸來實現類似10..20M 數據包/秒的整體吞吐量?
我還在某處讀到 Linux 很難將網路性能擴展到 4 核以上——最新的核心版本也是如此嗎?
意識到主機上的 10 Mpps 正在推動可擴展性,並且需要調整才能正常執行。RHEL 網路性能調整指南深入探討了其中的一些內容,從 NIC 解除安裝到 NUMA 效果。
即使很小的 1000 字節數據包也意味著需要 100 Gb NIC。
10 Mpps 可能是每個數據包 90 ns。不是很多,只有幾百個 CPU 週期。
為了簡單地降低 10 Mpps,Cloudflare 嘗試完全繞過 netfilter,並使用 XDP。如果您的標準主機安全模型假定帶有 conntrack 的 netfilter,這有點奇怪。還在頻寬上作弊,10 Gb NIC 假設通過小數據包拒絕服務。
ESnet 已經通過每個人最喜歡的無操作基準 iperf 和 nuttcp 實現了 78 Gbps 的單流。值得注意的是,他們使用了 9000 字節的數據包,因此這“僅”是 100 萬 PPS。仍然需要進行一些調整,就像您為高端數據庫所做的那樣:
- 使用正確的 PCI-E 插槽,至少版本 3 x16。
- 將 CPU 設置為性能而不是節能。
- CPU 綁定到與 NIC 相同的 NUMA 節點。套接字互連速度很重要
- 最大 Linux TCP 緩衝區。
- 更新 NIC 驅動程序和韌體。
還不錯,考慮到舊核心需要進一步調整。
Cloudflare 和 ESnet 都沒有在這些數據包流基準測試中進行大量計算。做有用的工作將是可擴展性的另一個變數。也許橫向擴展:對十幾個後端主機進行 haproxy,每台主機都更容易達到 1 Mpps。也許這仍然會達到 LWN 提到的一些轉發可擴展性限制,很難說。
關於最新的核心,那篇 LWN 文章是 5 年前的,不會是最新的。在最新的 NIC 上獲取更新的核心來調整您自己的基準。特別是如果您想編寫自己的“如何降低 20 Mpps”文章。