LVS汇歹、Nginx壓測(cè)與性能調(diào)優(yōu)

????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滿造成性能瓶頸蝎宇。如下所示:

cpu軟中斷集中在單個(gè)核上

????多隊(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核,處理能力得到提升昧诱。

做了網(wǎng)卡多隊(duì)列與CPU核綁定后的效果

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

????4. 注意壓測(cè)客戶端也會(huì)遇到性能問(wèn)題,也需要對(duì)其進(jìn)行性能調(diào)優(yōu)田篇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末替废,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斯辰,更是在濱河造成了極大的恐慌舶担,老刑警劉巖坡疼,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彬呻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柄瑰,警方通過(guò)查閱死者的電腦和手機(jī)闸氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)教沾,“玉大人蒲跨,你說(shuō)我怎么就攤上這事∈诜” “怎么了或悲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵孙咪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我巡语,道長(zhǎng)翎蹈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任男公,我火速辦了婚禮荤堪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枢赔。我一直安慰自己澄阳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布踏拜。 她就那樣靜靜地躺著碎赢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪速梗。 梳的紋絲不亂的頭發(fā)上揩抡,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音镀琉,去河邊找鬼峦嗤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屋摔,可吹牛的內(nèi)容都是我干的烁设。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钓试,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼装黑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弓熏,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恋谭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挽鞠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疚颊,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年信认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了材义。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫁赏,死狀恐怖其掂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潦蝇,我是刑警寧澤款熬,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布深寥,位于F島的核電站,受9級(jí)特大地震影響贤牛,放射性物質(zhì)發(fā)生泄漏翩迈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一盔夜、第九天 我趴在偏房一處隱蔽的房頂上張望负饲。 院中可真熱鬧,春花似錦喂链、人聲如沸返十。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洞坑。三九已至,卻和暖如春蝇率,著一層夾襖步出監(jiān)牢的瞬間迟杂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工本慕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排拷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓锅尘,卻偏偏與公主長(zhǎng)得像监氢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藤违,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容