去年試用了一下淘寶內核,發現它對LVS性能有質的提高。敬佩之心倍上心頭,興奮之餘開始瞭解淘寶內核。 html
簡單公佈一下測試結果:在一臺普通的4核服務器上,使用LVS的DR模式,後端7臺RealServer。在CentOS原生內核上,每秒最高轉發約6萬個HTTP請求,而使用淘寶內核後可高達約14萬次請求每秒(瓶頸在測試機,沒法模擬更大壓力)。而在這臺服務器上直接測試Nginx狀態頁,最高每秒處理約4萬次請求。 python
當下,咱們很是迫切須要解決的就是LVS的性能問題。在獲得驗證的同時,更但願把問題弄清楚。淘寶內核到底對LVS作了什麼,讓它的性能獲得如此提高? linux
在淘寶內核目錄下,在各類Patch「patches.driver」、「patches.taobao」、等,數量多到讓人望而生畏…… 後端
好吧,我仍是想把問題弄清楚! 性能優化
全部Patch中,與LVS相關的只有 patches.taobao/ip_vs_conn_locking_granularity.patch 文件。內容也很簡單,僅將 CT_LOCKARRAY_BITS 由4改成8。並且是文嵩大神親自打上的: 服務器
這個大小從上下文來看,彷佛是一個併發鎖的數量。 併發鎖多了, 能夠同時進行的轉發鏈接就多了, CPU不用等待任務完成。批註中註明了是針對16核作的調整,雖然個人測試裏纔有4核 ^_^|| 併發
幸好淘寶內核能夠自由的選擇開啓或關閉指定的Patch(執行打包以前修改series.conf註釋掉不想要的Patch),因而我關閉了LVS的Patch。再測試,又一次喜劇發生了:即便不打ip_vs_conn_locking_granularity.patch,淘寶內核的LVS轉發功能依然很強勁! dom
而後,我關閉了淘寶全部Patch。喜劇仍然存在:凡是自行定製的內核,LVS性能很平庸;凡是使用淘寶內核,不管怎樣調整Patch,性能都會很強勁。那一刻,個人心你懂的…… 性能
諮詢了一下佳明和炳天,我感受我找到緣由了:淘寶對內核的配置也進行了大量的優化。針對LVS的優化就是將CONFIG_IP_VS_TAB_BITS由12調整到20「sed -i 's/CONFIG_IP_VS_TAB_BITS=12/CONFIG_IP_VS_TAB_BITS=20/g' SOURCES/config-generic」: 測試
1
2
3
4
5
6
7
8
9
|
yum -y install kernel-devel rpm-build redhat-rpm-config asciidoc hmaccalc binutils-devel elfutils-libelf-devel newt-devel zlib-devel xmlto python-devel perl-ExtUtils-Embed fedora-packager @development-tools
rpmdev-setuptree
rpm -ivh kernel-2.6.32-279.19.1.el6.src.rpm
cd ~/rpmbuild/
cp patches.taobao/ip_vs_conn_locking_granularity.patch SOURCES/
sed -i 's/CONFIG_IP_VS_TAB_BITS=12/CONFIG_IP_VS_TAB_BITS=20/g' SOURCES/config-generic
rpmbuild -bb --with baseonly --with firmware --without debuginfo SPECS/kernel.spec
# waiting for lock on `./random_seed'...
rngd -r /dev/urandom
|
OK,果真很強大,應用到生產環境後效果也很滿意。真心感謝淘寶、感謝開源!因而我也對此打了一個Patch,並上傳了編譯結果:kernel-firmware,kernel。
怎樣驗證咱們的優化是否生效呢,查看`ipvsadm -Ln`的size便可:
固然,淘寶對LVS的優化不只文章介紹的2處了。還有針對網卡和系統參數的調整好比:
1
2
3
4
5
6
7
8
9
10
|
# 關閉網卡LRO和GRO
ethtool -K em1 gro off
ethtool -K em1 lro off
# 禁用ARP,增大backlog併發數
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.core.netdev_max_backlog = 500000
# 調整內核的時鐘機制
kernel nohz=off
# 手動調整網卡中斷分佈,等……
|