Intel 10-GbE 網絡卡效能優化[翻譯]
這是一篇翻譯文件,原文請見:ofollow,noindex" target="_blank">http://dak1n1.com/blog/7-performance-tuning-intel-10gbe
預設情況下,Linux網路被配置成最佳可用性狀態,但不是最佳效能狀態。對於一個10GbE的網絡卡來講,這是尤其明顯的。核心的 send/recv 緩衝區,tcp堆疊的記憶體分配策略和 資料包的佇列都設定的太小,以至於它們不能工作在最佳的效能狀態。下面所做的一些測試和優化,希望能夠給你的網絡卡帶來一定的效能提升。
在Intel ixgb的驅動文件中,描述了三個可以優化的策略。從效能優化的提升能力上進行排序如下:
1.在伺服器和交換機之間允許大幀傳輸
2.用sysctl來優化核心配置
3.用setpci來優化網絡卡的PCI配置
需要明確的是,上述優化列表僅僅是一些建議。大多數優化工作是調整一些(個)配置,然後進行壓力測試來檢查優化是否生效。因此,大家得到的結果可能是多種多樣的。
在開始任何壓力測試前,我們往往需要禁止掉 irqbanlace 和 cpuspeed。這樣做可以讓我們獲得最大的網路吞吐量以得到最好的壓力測試結果。
service irqbalance stop
service cpuspeed stop
chkconfig irqbalance off
chkconfig cpuspeed off
(一)允許大幀資料傳輸
在linux系統中,配置大幀資料傳輸僅僅需要一條命令,或是在網絡卡的配置檔案增加一行。
ifconfig eth2 mtu 9000 txqueuelen 1000 up
如果要讓這個配置持久化,可以在網絡卡的配置檔案中增加MTU的新值,將“eth2”換成你自己的網絡卡名字:
vim /etc/sysconfig/network-scripts/ifcfg-eth2
MTU=”9000″
(二)Linux核心 sysctl 配置
在linux系統中有很多重要的配置會影響網路的效能。下面的這些配置項來源於 2008 Red Hat峰會 Mark Wagner的精彩的演講 (http://www.redhat.com/promo/summit/2008/downloads/pdf/Thursday/Mark_Wagner.pdf )
核心的記憶體配置:
net.core.rmem_max - max size of rx socket buffer
net.core.wmem_max - max size of tx socket buffer
net.core.rmem_default - default rx size of socket buffer
net.core.wmem_default - default tx size of socket buffer
net.core.optmem_max - maximum amount of option memory
net.core.netdev_max_backlog - how many unprocessed rx packets before kernel starts to drop them
下面是我修改後的 /etc/sysctl.conf 檔案,可以把它新增到預設的配置後面:
# - tuning - #
# Increase system file descriptor limit
fs.file-max = 65535
# Increase system IP port range to allow for more concurrent connections
net.ipv4.ip_local_port_range = 1024 65000
# - 10gbe tuning from Intel ixgb driver README - #
# turn off selective ACK and timestamps
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
# memory allocation min/pressure/max.
# read buffer, write buffer, and buffer space
net.ipv4.tcp_rmem = 10000000 10000000 10000000
net.ipv4.tcp_wmem = 10000000 10000000 10000000
net.ipv4.tcp_mem = 10000000 10000000 10000000
net.core.rmem_max = 524287
net.core.wmem_max = 524287
net.core.rmem_default = 524287
net.core.wmem_default = 524287
net.core.optmem_max = 524287
net.core.netdev_max_backlog = 300000
(三)PCI 匯流排優化
如果你考慮讓你的優化工作進一步深入,還可以針對該網絡卡插入的PCI匯流排進行調整。首先,需要找到要調整的PCI匯流排地址,通過lspci命令獲取:
[chloe@biru ~]$ lspci
07:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)
這裡的07:00.0 就是PCI匯流排的地址。現在我們可以在 /proc/bus/pci/devices裡面找到更多的資訊:
[chloe@biru ~]$ grep 0700 /proc/bus/pci/devices
0700 808610fb 28 d590000c 0 ecc1 0 d58f800c 0 0 80000 0 20 0 4000 0 0 ixgbehttp://dak1n1.com/blog/7-performance-tuning-intel-10gbe
正如我們看到的這樣,各種PCI裝置的資訊就顯示出來了。不過,我們最關注的資料在第二列,808610fb。這是裝置的供應商ID和裝置ID的組合。供應商ID:8086,裝置ID:10fb。我們可以使用這些值來優化PCI匯流排的MMRBC(Maximum Memory Read Byte Count)。
下面的命令可以提升MMRBC到 4k 的讀,提升總線上對爆發增長的處理能力。
setpci -v -d 8086:10fb e6.b=2e
關於這條命令:
-d 選項指明網絡卡在PCI-X匯流排結構上的位置
e6.b 是 PCI-X 命令的暫存器地址
2e是要配置值
下面是這個暫存器的其他可用值(儘管上面已經列出了一個,2e,是Intel ixgbe文件中推薦的配置值)
MM value in bytes
22 512 (default)
26 1024
2a 2048
2e 4096
測試:
測試往往是在每一項配置調整的時候都要進行的,不過,我這裡為了簡潔僅僅展示一下優化前和優化後的結果對比。使用的壓力測試工具是 “iperf”和 “netperf”
下面是 10GbE 網絡卡在優化前可能的效能狀態:
[ 3] 0.0-100.0 sec 54.7 GBytes 4.70 Gbits/sec
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.00 5012.24
優化後:
[ 3] 0.0-100.0 sec 115 GBytes 9.90 Gbits/sec
bytes bytes bytes secs. 10^6bits/sec
10000000 10000000 10000000 30.01 9908.08
哇!優化後帶來非常巨大的變化。這是我花了幾個小時候在我的HDFS叢集中所看到的最好的結論。無論你的應用程式是怎樣的,這些優化都應該很適合你。