一些通用性的haproxy調優tips


一、硬件和系統
haproxy是單線程,非阻塞,事件驅動,所以會最大化利用單個CPU內核,選擇haproxy的硬件時要關注如下:
 
1.選擇CPU的時候,選擇 高主頻,大緩存的型號,比內核數更重要
2.選擇 支持多隊列的網卡將網卡中斷做"CPU親和"(推薦Intel 服務器網卡,例如I350AM4,4端口千兆,每個端口8條RX,8條TX隊列;CPU親和可使用Intel驅動源碼中的set_irq_affinity.sh腳本)
3.根據haproxy官方文檔, 將Haproxy和網卡中斷綁定在同一個cpu,不同的core上能獲得最佳性能,例如: 網卡綁定在CPU0的core0,則haproxy進程綁定在CPU0的core1上效果最佳。因為他們可以盡可能的利用CPU cycle,同時可以共享CPU L3內存。可以使用如下方法確認同在一個物理CPU的內核:
]# cat /sys/bus/cpu/devices/cpu0/topology/core_siblings_list 
0-3,8-11
本例中,core0-3,8-11在同一個物理CPU上,共享CPU L3內存。
4. 請務必禁用或刪除IRQ Balance
5. 如果連接頻率非常高(> 5K/s),避免使用虛擬機運行haproxy
6. 盡量避免使用iptables conntrack,會影響性能
7. 盡量避免將比較占用cpu的進程與haproxy或者網卡中斷綁定在同一個core上運行,尤其是在SSL Offload這種場景下,例如如下一些:
backup clients
munin client
nagios plugins or clients
snmpd / net-snmp
syslog / rsyslogd / syslog-ng
zabbix clients
可以使用 taskset來將上述進程綁定到不同的core上去。
8. 如果使用SSL Offload功能,請選擇openssl的1.0.2的分支,這個分支對於Intel xeon的avx2, ADCX, ADOX, MULX等指令進行過優化,可以最大化利用CPU的特性。
 
二、針對短連接的系統調整(紅色部分比較重要)
用來建立連接的本地端口范圍,越大越好,默認"32768 61000",推薦"1024 65024"   
net.ipv4.ip_local_port_range  = 1025 65534
 
支持高連接率,默認"1024",推薦"100000"
net.ipv4.tcp_max_syn_backlog = 100000
net.core.netdev_max_backlog = 100000
 
對於向外建立的連接,允許重復使用同一個本地源端口,默認"0",推薦"1"
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
 
每個socket所能允許的尚未被haproxy接受或處理的未完成連接請求數量,默認"128",推薦"65534"
net.core.somaxconn = 65534
 
增大文件句柄數
# cat /proc/sys/fs/file-nr
fs.file-max = 65535
 
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_syncookies = 0
 
三、針對長連接的系統調整
用來建立連接的本地端口范圍,越大越好,默認"32768 61000",推薦"1025 65534"   
net.ipv4.ip_local_port_range  = 1025 65534
 
每個TCP連接分配的接收和發送緩沖
# 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 = 11960320
net.core.wmem_max = 11960320
net.core.rmem_default = 11960320
net.core.wmem_default = 11960320
net.core.optmem_max = 11960320
net.core.netdev_max_backlog = 300000
 
# turn off selective ACK and timestamps
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
 
#默認情況下,此參數為1,將大幅削減空閑連接時的CWnd,對長連接如SSL產生負面影響。將其設置為0,可以顯著提高性能。
net.ipv4.tcp_slow_start_after_idle = 0
 
四、haproxy的多進程
 
haproxy可以運行多進程,但是官方不太推薦。
 
多進程的好處: 
  • 專核專用:  每個進程綁定一個內核,每個進程可以專用於一種任務(或者應用,或者協議),例如: 1個進程專門處理HTTP,另一個進程專門處理MySQL
  • 向上擴展:  可以通過增加CPU核數,增加計算容量
  • SSL offload:  SSL生成key的能力與進程數線性相關,但TLS session resumption 超過3個進程則收益甚微。
多進程的缺點:
  • 每個進程有自己的內存區域,意味着:
  • debug模式不能在multi-process模式下工作
  • frontend和相關的backend必須運行在同一進程內
  • stick-table同步不能兼容,即peers指令不可用
  • 存儲在每個進程本地的內存信息不能共享: stick-table和tracked counter,stats狀態信息,server的maxconn,connection rate
  • 每個haproxy進程都會做health check: 后端的backend會被每個haproxy進程探測死活,一個service在不同進程內可能會有短暫的不同狀態
  • 配置文件會更復雜
如果對stats嚴重需要,可以針對每個haproxy進程做一個stats。
 
global
    nbproc 4
    cpu-map 1 0     # 前一個數字是進程號,后一個數字是CPU內核的號
    cpu-map 2 1
    cpu-map 3 2
    cpu-map 4 3
 
可以將不同任務綁定到不同的內核上獨立執行
frontend access_http
   bind 0.0.0.0:80
    bind-process 1
frontend access_https
   bind 0.0.0.0:443 ssl crt /etc/yourdomain.pem
    bind-process 2 3 4
 
五、網卡驅動方面
 
[chloe@biru ~]$ lspci
  07:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)
 
[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        ixgbe
 
[chloe@biru ~]$  setpci -v -d 8086:10fb e6.b=2e
 
 
關閉Intel 網卡的LRO功能
]# ethtool -K eth0 lro off
]#ethtool -K eth1 lro off
 
參考文檔:
1.https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Tuning_and_Optimizing_Red_Hat_Enterprise_Linux_for_Oracle_9i_and_10g_Databases/chap-Oracle_9i_and_10g_Tuning_Guide-Setting_File_Handles.html
2.http://dak1n1.com/blog/7-performance-tuning-intel-10gbe/
3.http://fibrevillage.com/sysadmin/91-tcp-performance-tuning-10g-nic-with-high-rtt-in-linux
4.http://nguyendangquockhanh.blogspot.hk/2013/12/tcp-tuning-10gb-network-cards-on-linux.html
5.http://www.intel.co.uk/content/dam/doc/application-note/82575-82576-82598-82599-ethernet-controllers-interrupts-appl-note.pdf
6.http://blog.yufeng.info/archives/2037
7.http://ju.outofmemory.cn/entry/94177
8.https://greenhost.nl/2013/04/10/multi-queue-network-interfaces-with-smp-on-linux/
9.http://support.citrix.com/article/CTX12
10.http://www.slideshare.net/Severalnines/haproxy-mysql-slides
11.http://blog.onefellow.com/post/82478335338/haproxy-mapping-process-to-cpu-core-for-maximum
12.http://www.jdon.com/performance/mobile-linux.html
13.http://www.cagataygurturk.com/using-haproxy-in-multicore-environments/
14.http://www.lognormal.com/blog/2012/09/27/linux-tcpip-tuning/
15.https://www.haproxy.com/doc/hapee/1.5/system/tunning.html
16.https://software.intel.com/zh-cn/articles/improving-openssl-performance
17.http://blog.haproxy.com/2011/09/16/benchmarking_ssl_performance/
18.https://software.intel.com/zh-cn/articles/accelerating-ssl-load-balancers-with-intel-xeon-v3-processors
19.https://software.intel.com/en-us/articles/accelerating-ssl-load-balancers-with-intel-xeon-e5-v4-processors

閱讀原文 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM