????LVS和Nginx作為一個(gè)常用的負(fù)載均衡軟件,充當(dāng)集群流量入口的角色偿凭,需要承載的業(yè)務(wù)流量一般都比較大产弹,這個(gè)時(shí)候?qū)VS/Nginx節(jié)點(diǎn)進(jìn)行一些參數(shù)調(diào)優(yōu),對(duì)于發(fā)揮它們的性能有很大的幫助弯囊。
一痰哨、 可能會(huì)負(fù)載均衡器性能的因素
1. 硬件方面
????CPU、內(nèi)存匾嘱、網(wǎng)卡斤斧。
????其中最主要的是CPU和網(wǎng)卡,短連接業(yè)務(wù)場(chǎng)景下cpu軟中斷si可能成為性能瓶頸奄毡;網(wǎng)卡的最大流量值也可能限制負(fù)載均衡器性能的發(fā)揮,如常見(jiàn)的千兆網(wǎng)卡贝或,理論最大數(shù)據(jù)傳輸速率為1000Mb/s吼过,即125MB/S。LVS對(duì)于內(nèi)存消耗并不多咪奖,Nginx相對(duì)會(huì)消耗內(nèi)存一些盗忱,不過(guò)內(nèi)存一般不會(huì)成為瓶頸。
2. 系統(tǒng)方面
????Linux系統(tǒng)默認(rèn)有許多限制羊赵,對(duì)于在業(yè)務(wù)流量較大的情況下發(fā)揮負(fù)載均衡器的性能有很大影響趟佃。常見(jiàn)的如: 服務(wù)端可接受的最大連接數(shù)、可接受的最大半連接數(shù)昧捷、本地可用端口范圍闲昭、time-wait連接數(shù)、可打開(kāi)的最大文件句柄數(shù)靡挥、網(wǎng)卡等待隊(duì)列大小等序矩。
3.? 軟件方面
????LVS的hash table值,Nginx的nginx.conf調(diào)優(yōu)等跋破。
4. 網(wǎng)絡(luò)方面
????負(fù)載均衡器和真實(shí)服務(wù)器都是通過(guò)網(wǎng)絡(luò)進(jìn)行通信簸淀,如果條件允許,最好將它們置于同機(jī)房毒返、同網(wǎng)段下租幕,減小網(wǎng)絡(luò)時(shí)延帶來(lái)的影響。
二拧簸、性能調(diào)優(yōu)介紹
1. 系統(tǒng)參數(shù)調(diào)優(yōu)
1.1 網(wǎng)卡多隊(duì)列與CPU核綁定
????網(wǎng)卡多隊(duì)列是一種硬件技術(shù)劲绪,即一個(gè)物理網(wǎng)卡可以有多個(gè)隊(duì)列通道,需要多隊(duì)列網(wǎng)卡驅(qū)動(dòng)支持。默認(rèn)情況下各個(gè)隊(duì)列的請(qǐng)求都是由cpu0核處理珠叔,所以很容易因?yàn)閏pu0核si滿造成性能瓶頸蝎宇。如下所示:
????多隊(duì)列網(wǎng)卡在系統(tǒng)中有多個(gè)中斷號(hào),通過(guò)CPU核綁定祷安,將各個(gè)中斷號(hào)對(duì)應(yīng)的網(wǎng)卡隊(duì)列綁定到指定的CPU核處理姥芥,這樣可以發(fā)揮多核CPU的優(yōu)勢(shì),將中斷請(qǐng)求分?jǐn)偟蕉鄠€(gè)cpu核上汇鞭,提升cpu處理性能凉唐。
????配置方法:
????a. 檢查系統(tǒng)是否已開(kāi)啟irqbanlance服務(wù),如果有霍骄,則關(guān)閉該服務(wù)台囱,手動(dòng)進(jìn)行cpu核綁定。
????# ps -ef | grep irqbalance
????b. 檢查網(wǎng)卡是否支持多隊(duì)列
????#lspci -vvv | grep -A 30 "Ethernet controller"
????檢查是否存在 MSI-X: Enable+ Count >0读整,如果存在簿训,說(shuō)明網(wǎng)卡支持多隊(duì)列。
????c. 查詢網(wǎng)卡各隊(duì)列對(duì)應(yīng)的中斷號(hào)
????# cat /proc/interrupts | grep em3
????如下圖米间,可以看到em3網(wǎng)卡有8個(gè)隊(duì)列强品,分別對(duì)應(yīng)中斷號(hào)187~194。
????d. 將各隊(duì)列綁定到指定的CPU核
????# echo 1 > /proc/irq/187/smp_affinity
????# echo 2 > /proc/irq/188/smp_affinity
????# echo 4 > /proc/irq/189/smp_affinity
????# echo 8 > /proc/irq/190/smp_affinity
????# echo 10 > /proc/irq/191/smp_affinity
????# echo 20 > /proc/irq/192/smp_affinity
????# echo 40 > /proc/irq/193/smp_affinity
????# echo 80 > /proc/irq/194/smp_affinity
????PS: 這里傳入的值為16進(jìn)制屈糊。轉(zhuǎn)換為2進(jìn)制后對(duì)應(yīng)綁定的cpu核的榛。
? ? 如: echo 80 >? cat /proc/irq/194/smp_affinity
? ? 16進(jìn)制80轉(zhuǎn)換為2進(jìn)制為1000 0000,表示將中斷號(hào)194綁定到cpu7核上面逻锐。
????從下圖可以看到做了網(wǎng)卡多隊(duì)列與CPU核綁定后夫晌,中斷處理分?jǐn)偟搅薱pu0~7核,處理能力得到提升昧诱。
1.2 關(guān)注系統(tǒng)鏈接跟蹤表大小
????系統(tǒng)鏈接跟蹤表記錄了經(jīng)過(guò)系統(tǒng)轉(zhuǎn)發(fā)的連接信息晓淀,通過(guò)加載nf_conntrack模塊啟用, 對(duì)于iptables盏档、SNAT/DNAT等功能是必須啟用鏈接跟蹤表的要糊。
????但是如果鏈接跟蹤表的值設(shè)置的太小,容易造成鏈接跟蹤表滿導(dǎo)致丟包的問(wèn)題妆丘。所以需要關(guān)注系統(tǒng)的鏈接跟蹤表最大值和當(dāng)前值的大小锄俄,當(dāng)二者相等時(shí),說(shuō)明表滿勺拣,系統(tǒng)會(huì)drop新的連接請(qǐng)求奶赠。
????# sysctl -a | grep nf_conntrack_max? ? (查詢系統(tǒng)鏈接跟蹤表最大值)
????# sysctl -a | grep nf_conntrack_count? (查詢系統(tǒng)鏈接跟蹤表當(dāng)前值)
????如下圖中的鏈接跟蹤表最大值為65536就太小了,很容易造成丟包药有。
????ps: 鏈接跟蹤表設(shè)置大一些雖然不會(huì)造成丟包毅戈,但是在業(yè)務(wù)量很大的情況下苹丸,如果表過(guò)大(上百萬(wàn)的級(jí)別),系統(tǒng)查詢鏈接跟蹤表會(huì)消耗大量的cpu資源苇经,可能會(huì)導(dǎo)致系統(tǒng)掛死赘理。
1.3 關(guān)閉網(wǎng)卡LRO、GRO特性
????現(xiàn)在大多數(shù)網(wǎng)卡都具有LRO/GRO功能扇单,即 網(wǎng)卡收包時(shí)將同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的數(shù)據(jù)包)交給 內(nèi)核協(xié)議棧商模;LVS內(nèi)核模塊在處理>MTU的數(shù)據(jù)包時(shí),會(huì)丟棄蜘澜;
????因此施流,如果我們用LVS來(lái)傳輸大文件,很容易出現(xiàn)丟包鄙信,傳輸速度慢瞪醋;
????解決方法,關(guān)閉LRO/GRO功能装诡,命令:(注意查看命令是小k银受,修改命令是大K)
????ethtool -k eth0 查看LRO/GRO當(dāng)前是否打開(kāi)
????ethtool -K eth0 lro off 關(guān)閉GRO
????ethtool -K eth0 gro off 關(guān)閉GRO
1.4 增大網(wǎng)卡的ring buffer值。
????# ethtool -G em4 rx 4096
????# ethtool -G em4 tx 4096
1.5 增大網(wǎng)卡等待隊(duì)列大小
????netdev_max_backlog參數(shù)表示每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí)鸦采,允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目宾巍。當(dāng)網(wǎng)卡流量很大時(shí),可以調(diào)大這個(gè)參數(shù)值赖淤。
????# sysctl -w net.core.netdev_max_backlog=262144
1.6 增大服務(wù)端全連接隊(duì)列大小
????somaxconn參數(shù)表示服務(wù)端已完成3次握手連接的隊(duì)列大小蜀漆,即單個(gè)服務(wù)可建立的tcp連接最大值谅河。當(dāng)需要增大服務(wù)端處理并發(fā)連接的能力時(shí)咱旱,需要調(diào)大該參數(shù)值。
????# sysctl -w net.core.somaxconn=262144
1.7 增大服務(wù)端半連接隊(duì)列大小
????tcp_max_syn_backlog參數(shù)表示服務(wù)端接收syn消息隊(duì)列的大小绷耍。如果該隊(duì)列未滿吐限,則響應(yīng)(syn,ack)消息;否則將丟棄客戶端的syn包褂始。
????# sysctl -w net.ipv4.tcp_max_syn_backlog=262144
1.8 增大系統(tǒng)可用的本地端口范圍
????# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
1.9 增大系統(tǒng)time_wait狀態(tài)連接數(shù)限制
????tcp_max_tw_buckets表示系統(tǒng)允許存在的time_wait狀態(tài)連接數(shù)诸典。Time wait狀態(tài)是tcp斷連中一個(gè)正常的狀態(tài),它存在的作用主要包括:確保tcp連接可靠的斷開(kāi)和舊連接的報(bào)文在網(wǎng)絡(luò)中徹底消失崎苗。如果這個(gè)值過(guò)小狐粱,則客戶端不會(huì)進(jìn)入time_wait狀態(tài),而是直接從FIN_WAIT狀態(tài)結(jié)束胆数。這時(shí)候服務(wù)端最后一次揮手的FIN消息會(huì)以收到RST結(jié)束肌蜻,可能會(huì)導(dǎo)致服務(wù)端斷連異常。
????# sysctl -w net.ipv4.tcp_max_tw_buckets=262144
1.10 啟用time_wait狀態(tài)連接復(fù)用
????增大tcp_max_tw_buckets值有一個(gè)負(fù)面影響必尼,就是系統(tǒng)time_wait狀態(tài)連接過(guò)多蒋搜,將可用端口耗盡篡撵,導(dǎo)致沒(méi)有足夠的可用端口新建連接。這時(shí)候可以啟用time_wait狀態(tài)連接復(fù)用豆挽。注意需要同時(shí)啟用時(shí)間戳tcp_timestamps育谬。(注意開(kāi)啟tcp_timestamps后要確認(rèn)關(guān)閉tcp_tw_recycle)
????# sysctl -w net.ipv4.tcp_timestamps=1
????# sysctl -w net.ipv4.tcp_tw_reuse=1
1.11 增大系統(tǒng)最大文件句柄數(shù)
????fs.file-max表示系統(tǒng)整體允許打開(kāi)的最大文件句柄數(shù)。這個(gè)值一般只需關(guān)注一下帮哈,如果配置過(guò)小膛檀,可以增大。
????# sysctl -a | grep fs.file-max
1.12 增大系統(tǒng)進(jìn)程最大文件句柄數(shù)
????ulimit -n查詢的結(jié)果表示單個(gè)進(jìn)程允許打開(kāi)的最大文件句柄數(shù)但汞,可用ulimit -n xxx調(diào)大該參數(shù)值宿刮。
????# ulimit -n
????# ulimit -n xxx
? ??注意這只是在當(dāng)前shell下生效的,系統(tǒng)重啟后會(huì)丟失私蕾,需要同時(shí)修改/etc/security/limits.conf中的nofile值僵缺。其中,* 這行的配置表示對(duì)非root用戶生效踩叭。
????*? soft nofile 1024000
????*? hard nofile 1024000
????root soft nofile 1024000
????root hard nofile 1024000
2. LVS參數(shù)調(diào)優(yōu)
2.1 增大ipvs模塊hash table的大小
????ipvs模塊hash table默認(rèn)值為2^12=4096裤园,改為2^20=1048576。
????可以用ipvsadm -l命令查詢當(dāng)前hash table的大小韧拒。
????修改方法:
????在/etc/modprobe.d/目錄下添加文件ip_vs.conf楼眷,內(nèi)容為:
????options ip_vs conn_tab_bits=20
????重新加載ipvs模塊。
3.Nginx參數(shù)調(diào)優(yōu)
????Nginx的參數(shù)配置都在nginx.conf文件中斤富。
????3.1 配置worker進(jìn)程數(shù)等于系統(tǒng)cpu核數(shù)膏潮,并配置cpu核綁定。
????worker_processes auto;
????worker_cpu_affinity auto;
????這里比較方便的是配置為auto满力,但是根據(jù)實(shí)際的系統(tǒng)情況指定worker進(jìn)程數(shù)和手動(dòng)綁定cpu核可能性能會(huì)更高一些焕参,比如避開(kāi)中斷irq處理的cpu核,將worker進(jìn)程綁定到其它空閑的cpu核上油额。
????3.2 使用epoll模型
????use epoll;
????3.3 關(guān)閉TCP的Nagle算法
????tcp_nodelay on;
????Nagle算法規(guī)定了一個(gè)TCP連接中最多只能存在一個(gè)未被確認(rèn)的小包叠纷,這可能會(huì)和系統(tǒng)的延遲ACK機(jī)制產(chǎn)生沖突,造成較為嚴(yán)重的時(shí)延潦嘶。
????3.4 增大單個(gè)worker進(jìn)程的文件句柄數(shù)限制
????worker_rlimit_nofile 1024000;
????3.5 增大單個(gè)worker進(jìn)程的最大并發(fā)連接數(shù)限制
????worker_connections 1024000;
????這里的最大并發(fā)連接包括前后端的連接涩嚣,且該參數(shù)值不能大于worker_rlimit_nofile。
4. 硬件與網(wǎng)絡(luò)配置調(diào)優(yōu)
????4.1 對(duì)物理網(wǎng)卡做多網(wǎng)卡綁定
????采用mode 0或mode 4對(duì)多塊物理網(wǎng)卡做綁定掂僵,提升網(wǎng)卡整體的傳輸速率航厚。如將兩塊傳輸速率為1000MB/S的網(wǎng)卡做mode0綁定,則理論上bond網(wǎng)卡的傳輸速率為2000MB/S锰蓬。
????4.2 將負(fù)載均衡器和真實(shí)服務(wù)器放在一個(gè)局域網(wǎng)內(nèi)
負(fù)載均衡器和真實(shí)服務(wù)器靠網(wǎng)絡(luò)傳輸數(shù)據(jù)幔睬,如果條件允許,將它們放在一個(gè)局域網(wǎng)內(nèi)互妓,避免數(shù)據(jù)傳輸走路由器傳輸溪窒。
三坤塞、性能分析工具
????1. 分析cpu性能
????top:按1可以看到每個(gè)cpu核的cpu使用情況,同時(shí)還能看到各個(gè)進(jìn)程的情況澈蚌。
????sar -u 1:每隔1秒打印出當(dāng)前cpu的整體使用情況摹芙。
????mpstat -P ALL 1 :每隔1秒打印出所有cpu核的使用情況。
????ps:sar和mastat需要安裝sysstat工具包宛瞄。
????2. 分析網(wǎng)卡流量
????sar -n DEV 1:每隔1秒打印出所有網(wǎng)卡的流量傳輸情況浮禾。
????3. 查看網(wǎng)卡配置
????# ethtool xxx
????下圖em3為千兆網(wǎng)卡,注意這里的單位是小b份汗。
????4. 查看bond網(wǎng)卡綁定模式
????# cat /proc/net/bonding/xxx
????下面的bond0網(wǎng)卡的綁定模式為mode0盈电,輪詢。
四杯活、 性能壓測(cè)工具
????這里介紹一個(gè)很好用的http壓測(cè)工具:wrk匆帚。
????1. 安裝方法
????#git clone https://github.com/wg/wrk
????# make
? ? # ln -s xxx/wrk /usr/sbin/wrk
????2. 使用方法
????使用方法: wrk <選項(xiàng)> <被測(cè)HTTP服務(wù)的URL>? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
????Options:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? -c, --connections ? 跟服務(wù)器建立并保持的TCP連接數(shù)量?
? ? -d, --duration? ? ? 壓測(cè)時(shí)間? ? ? ? ?
? ? -t, --threads? ? ? 使用多少個(gè)線程進(jìn)行壓測(cè)?
? ? -s, --script? ? ? ? 指定Lua腳本路徑? ? ?
? ? -H, --header? ? ? ? 為每一個(gè)HTTP請(qǐng)求添加HTTP頭? ? ?
? ? --latency? ? ? ? ? 在壓測(cè)結(jié)束后,打印延遲統(tǒng)計(jì)信息?
? ? --timeout? ? ? 超時(shí)時(shí)間? ?
? ? -v, --version? ? ? ? ? 打印正在使用的wrk的詳細(xì)版本信息
? 代表數(shù)字參數(shù)旁钧,支持國(guó)際單位 (1k, 1M, 1G)
? 代表時(shí)間參數(shù)吸重,支持時(shí)間單位 (2s, 2m, 2h)
????3. 示例
????wrk默認(rèn)為http長(zhǎng)連接。
????使用10個(gè)線程歪今、1000個(gè)長(zhǎng)連接對(duì)指定URL壓測(cè)60s嚎幸,并打印時(shí)延信息。
????# wrk -t10 -c1000 -d60s --latency "http://xxx/test.html"
????Requests/sec: 149863.60? # 每秒的請(qǐng)求數(shù)寄猩,即QPS
????Transfer/sec: 67.02MB # 每秒傳輸?shù)淖止?jié)數(shù)
????指定頭域?qū)崿F(xiàn)http短連接測(cè)試嫉晶。
????# wrk -t10 -c1000 -d60s -H "Connection: Close" --latency “http://xxx/test.html”