基本概念
QPS:query per second, 1秒內完成的請求數(shù)
RT:response time, 1個請求完成的時間
Throughput越大靶庙,Latency會越差运怖。因為請求量過大索守,系統(tǒng)太繁忙瞳购,所以響應速度自然會低
Latency越好褪尝,能支持的Throughput就會越高因谎。因為Latency短說明處理速度快基括,于是就可以處理更多的請求
最佳線程數(shù)量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數(shù)量
線程過多,時間消耗長财岔,并不是說代碼執(zhí)行效率下降了风皿,而是資源的競爭,導致線程等待的時間上升了匠璧,線程越多消耗內存越多桐款,過多的線程直接將系統(tǒng)內存消耗殆盡
平均響應時間 = (并發(fā)線程數(shù)/最佳線程數(shù)) * 最佳線程數(shù)的響應時間
總QPS=線程數(shù)*單個線程的QPS
CPU監(jiān)控與調優(yōu)
系統(tǒng)負載
系統(tǒng)負載:可運行(運行中或者等待CPU調度)或不可中斷(等待IO)的進程數(shù)
uptime
load average: 2.03, 20.17, 15.09
表示過去1分鐘、5分鐘夷恍、15分鐘的系統(tǒng)負載情況
多核情況下魔眨,真實的負載是需要除去CPU個數(shù),如load為1酿雪,在1個CPU時遏暴,是滿的,在2個CPU時指黎,是50%
如果Load Average高朋凉,但CPU的us、sy使用率低醋安,這時要看一下磁盤IO或網(wǎng)絡IO的等待時間(等待進程包括等待CPU時間片和等待IO(不可中斷)杂彭,等待IO的進程的狀態(tài)為“D”,可以通過ps aux的state列進行查看吓揪,磁盤的IO等待可以通過iostat -x查看亲怠,主要看await, svctm列)
使用率
使用率分為:us(用戶)、sy(系統(tǒng))磺芭、id(空閑)赁炎、wa(IO等待)、ni(通過nice命令改變過優(yōu)先級)钾腺、hi(硬中斷)、si(軟中斷)讥裤、st(虛擬機)
如果在多核的機器俠放棒,使用率有可能超過100%,也存在多個進程加起來后超過100%的情況
一般us:65%-70%己英,sy:30%-35%间螟,idle:0%-5%,證明CPU被充分使用和均衡
如果wa很高,就需要看一下磁盤I/O
如果wa很低厢破,id很高荣瑟,但系統(tǒng)還是很慢,那就要查一下網(wǎng)絡IO或者遠程服務器的回應是不是很慢摩泪,或者查一下上下文切換和鎖笆焰,看看是否存在大量的鎖爭用和等待的情況
監(jiān)控工具:top, vmstat
查看某個進程的使用率
while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep ‘mysqld’; sleep 1;
找到消耗CPU最多的前10個進程
ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10
找到消耗內存最多的前10個進程
ps -auxf | sort -nr -k 4 | head -10
運行隊列大小
一個進程可以有running,runnable见坑,block(等待IO或者系統(tǒng)調用)
運行隊列是指runnable(等待運行)的進程數(shù)
每個處理器的運行隊列大小不應超過3個嚷掠,少于10倍的CPU個數(shù),否則線程過多或者CPU不夠
監(jiān)控工具:vmstat(procs下的r列)
上下文切換
- 上下文
進程運行時的寄存器和CPU緩存等 - 保存位置
進程描述符和內核堆棧 - 發(fā)生時機
IO操作荞驴、資源同步不皆、優(yōu)先級搶占、時間片到達熊楼、軟硬中斷
時鐘中斷:每隔一段時間就會發(fā)生一次時鐘中斷(切換)霹娄,可以通過以下辦法判斷時鐘中斷的頻率
cat /proc/interrupts | grep timer
...wait 10s...
cat /proc/interrupts | grep timer
將兩個結果值相減然后除以10,則得到每秒因時鐘中斷發(fā)生的切換數(shù)鲫骗,如果系統(tǒng)的上下文切換數(shù)比該值大项棠,則有可能發(fā)生了IO操作或者資源爭用或者sleep等
- 主動切換
鎖爭用、調用系統(tǒng)函數(shù) - 被動切換
除主動切換之外的切換
監(jiān)控工具:vmstat(system下的cs列)
更多描述可參考Context Switching, Some Resources
鎖爭用
主要是監(jiān)控主動切換
監(jiān)控工具:pidstat -w -I -p [pid] seconds的cswch/s列
統(tǒng)計的是全部核的總切換數(shù)挎峦,占用率=count/核數(shù)*80000/CPU時鐘數(shù)香追,通常一次切換消耗80000次時鐘頻率,如假設當前切換數(shù)是3500坦胶,CPU為雙核的3.0GHz透典,那么上下文切換占用的CPU率為:(3500/2)*80000/3000000000=4.7%
如果切換率超過5%,則證明程序存在鎖爭用顿苇;如果在3%-5%之間峭咒,則要注意,可能存在鎖爭用
線程遷移
一個線程最好在同一個CPU中運行纪岁,因為緩存等可以重新利用凑队,如果因為一個CPU忙而無法運行,然后將線程遷移到其他的核幔翰,則要重新加載緩存漩氨,造成性能損耗
快速監(jiān)控
通過vmstat查看整體CPU使用情況
top查看CPU占用高的幾個進程
pidstat查看這幾個進程對應的線程
調優(yōu)
- 確保沒有沒用的進程在運行(ps -ef)
- 檢查可運行隊列,確定每個CPU不超過3個遗增,如果過多叫惊,要不就減少線程數(shù),要不就把應用遷移到其他機器上或者增加CPU
- 確定CPU利用率中user/system的比例維持在70/30做修,當system的利用率比較高時霍狰,要查看是IO中斷還是鎖競爭抡草,同時檢查wa(IO等待)的比例是否過高
- 調高關鍵進程的優(yōu)先級,將非關鍵的蔗坯,但使用CPU較多的進程的優(yōu)先級降低
- 將進程綁定到特定的CPU(CPU親近性)康震,減少CPU緩存的失效
- 將產生大量中斷的進程綁定到一個固定的CPU上
- 修改程序,增加并行性
內存監(jiān)控與調優(yōu)
內存主要看可用內存大小宾濒、SWAP空間大小腿短、頁面換入換出頻率
free -m
total used free shared buffers cached
Mem: 2887 2789 97 0 26 1177
-/+ buffers/cache: 1585 1301
Swap: 0 0 0
- Mem:物理內存統(tǒng)計
字段 | 說明 |
---|---|
total | 物理內存總量 |
used | 已分配的內存(包含buffers與cache),但其中可能部分緩存并未實際使用 |
free | 未被分配的內存 |
shared | 共享內存 |
buffers | 系統(tǒng)分配但未被使用的buffers的數(shù)量鼎兽,針對磁盤塊數(shù)據(jù)的cache答姥,塊設備的讀寫緩沖區(qū) |
cached | 系統(tǒng)分配但未被使用的cache的數(shù)量,針對文件的cache |
- -/+ buffers/cache
字段 | 說明 |
---|---|
used | 實際使用的內存總數(shù)谚咬, 第一行的used - buffers - cached |
free | 實際剩余的內存總數(shù)鹦付, 第一行的free + buffers + cached |
Linux會盡量使用盡可能多的內存,如果存在足夠的內存择卦,Linux會對經常被訪問的文件進行緩存(cached)敲长,同時在進行IO操作時,Linux會使用塊緩存機制(buffers)秉继,加快IO處理
所以一般查看內存還剩余多少祈噪,要查看free的第二行參數(shù)
- swap:交換分區(qū)大小
swap空間的大小并不能表明內存存在瓶頸,因為如果一個進程空閑了尚辑,Linux會把它換出到磁盤
主要是要看頁面換入換出的大屑稹(vmstat的si、so列)
如果可用內存不多杠茬,有大量的頁面交換活動月褥,則要考慮加內存;(每秒有200-300的頁面換入或換出則代表內存存在瓶頸)
如果仍有很多內存瓢喉,但有頁面活動宁赤,則代表系統(tǒng)沒有頁面交換,而可能是正在加載程序
調優(yōu)
- 增大內存
- 使用大頁栓票、大的TLB决左,特別適合于數(shù)據(jù)庫服務器
- 創(chuàng)建一個或多個單獨的swap分區(qū)
- 調整swap寫到硬盤的參數(shù):vm.swappiness, vm.dirty_background_ratio, vm.dirty_ratio
磁盤監(jiān)控與調優(yōu)
只顯示磁盤信息,以M為單位走贪,顯示擴展信息佛猛,n代表多少秒輸出一次
iostat -dmx n
Device: rrqm/s wrqm/sr/s w/s rMB/swMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.11 33.49 0.27 26.820.00 0.24 18.16 0.10 3.68 0.67 1.82
字段 | 描述 |
---|---|
rrqm/s | 隊列中每秒鐘合并的讀請求數(shù)量(當系統(tǒng)調用需要讀取數(shù)據(jù)的時候,VFS將請求發(fā)到各個FS厉斟,如果FS發(fā)現(xiàn)不同的讀取請求讀取的是相同Block的數(shù)據(jù)挚躯,F(xiàn)S會將這個請求合并Merge) |
wrqm/s | 隊列中每秒鐘合并的寫請求數(shù)量 |
r/s | 每秒鐘完成的讀請求數(shù)量 |
w/s | 每秒鐘完成的寫請求數(shù)量 |
rMB/s | 每秒鐘讀取的數(shù)量,讀IOPS=(rMB/s) / (r/s)擦秽,IOPS:一次磁盤的連續(xù)讀或者連續(xù)寫稱為一次磁盤 I/O,隨機讀寫頻繁的應用的關鍵衡量指標,IOPS = 1s/(尋道時間+旋轉延遲+數(shù)據(jù)傳輸時間) |
wMB/s | 每秒鐘寫入的數(shù)量感挥,寫IOPS=(wMB/s) / (w/s) |
avgrq-sz | 平均請求扇區(qū)的大小缩搅,平均每次請求的大小,avgrq-sz < 32K 隨機存取為主触幼。 avgrq-sz > 32K 順序存儲為主 |
avgqu-sz | 平均請求隊列的長度硼瓣,此值越小越好,avgqu-sz > 2 可以認為存在I/O性能問題 |
await | 平均每次請求的等待時間置谦,單位毫秒堂鲤,一般系統(tǒng)IO響應時間應該低于5ms,如果大于10ms就比較大了媒峡。等待時間包括了隊列時間和服務時間瘟栖,await和svctm越接近越好,代表幾乎無需等待谅阿,反之差值越大半哟,隊列的時間越長,應用得到的響應時間變慢签餐, 還可參考vmstat結果b參數(shù)(等待資源的進程數(shù))和wa參數(shù)(IO等待所占用CPU時間百分比) |
svctm | 平均每次請求的服務時間寓涨,即磁盤讀或寫操作執(zhí)行的時間,包括尋道氯檐,旋轉時延戒良,和數(shù)據(jù)傳輸?shù)葧r間。(尋道時間:是指將讀寫磁頭移動至正確的磁道上所需要的時間冠摄。尋道時間越短糯崎,I/O操作越快,目前磁盤的平均尋道時間一般在3-15ms耗拓。旋轉延遲: 是指盤片旋轉將請求數(shù)據(jù)所在扇區(qū)移至讀寫磁頭下方所需要的時間拇颅。旋轉延遲取決于磁盤轉速,通常使用磁盤旋轉一周所需時間的1/2表示乔询。比如樟插,7200 rpm的磁盤平均旋轉延遲大約為60*1000/7200/2 = 4.17ms,而轉速為15000 rpm的磁盤其平均旋轉延遲約為2ms竿刁。數(shù)據(jù)傳輸時間: 是指完成傳輸所請求的數(shù)據(jù)所需要的時間黄锤,它取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率食拜。目前IDE/ATA能達到133MB/s鸵熟,SATA II可達到300MB/s的接口數(shù)據(jù)傳輸率,數(shù)據(jù)傳輸時間通常遠小于前兩部分消耗時間负甸,簡單計算時可忽略流强。) (r/s+w/s)*(svctm/1000)=util痹届,如果util達到100%,那么此時svctm=1000/(r/s+w/s)打月,假設IOPS是1000队腐,那么svctm大概在1毫秒左右,如果長時間大于這個數(shù)值奏篙,說明系統(tǒng)出了問題柴淘。 |
util | 設備的利用率,如果util接近100%秘通,則說明設備的能力趨向于飽和(如果是多磁盤为严,即使%util是100%,因為磁盤的并發(fā)能力肺稀,所以磁盤使用未必就到了瓶頸) |
每個參數(shù)的理解可以參考下面的圖片
上圖的左邊是iostat顯示的各個性能指標第股,每個性能指標都會顯示在一條虛線之上,這表明這個性能指標是從虛線之上的那個讀寫階段開始計量的盹靴,比如說圖中的w/s從Linux IO scheduler開始穿過硬盤控制器(CCIS/3ware)炸茧,這就表明w/s統(tǒng)計的是每秒鐘從Linux IO scheduler通過硬盤控制器的寫IO的數(shù)量。
結合上圖對讀IO操作的過程做一個說明稿静,在從OS Buffer Cache傳入到OS Kernel(Linux IO scheduler)的讀IO操作的個數(shù)實際上是rrqm/s+r/s梭冠,直到讀IO請求到達OS Kernel層之后,有每秒鐘有rrqm/s個讀IO操作被合并改备,最終轉送給磁盤控制器的每秒鐘讀IO的個數(shù)為r/w;在進入到操作系統(tǒng)的設備層(/dev/sda)之后控漠,計數(shù)器開始對IO操作進行計時,最終的計算結果表現(xiàn)是await悬钳,這個值就是我們要的IO響應時間了;svctm是在IO操作進入到磁盤控制器之后直到磁盤控制器返回結果所花費的時間盐捷,這是一個實際IO操作所花的時間,當await與svctm相差很大的時候默勾,我們就要注意磁盤的IO性能了;而avgrq-sz是從OS Kernel往下傳遞請求時單個IO的大小碉渡,avgqu-sz則是在OS Kernel中IO請求隊列的平均大小。
最終得出
平均單次IO大小(IO Chunk Size) = avgrq-sz
平均IO響應時間(IO Response Time) = await
IOPS(IO per Second) = r/s + w/s
吞吐率(Throughtput) = rkB/s + wkB/s
iowait并不能反應磁盤瓶頸
其實際測量的是cpu時間: iowait = (cpu idle time)/(all cpu time)
高速cpu會造成很高的iowait值母剥,但這并不代表磁盤是系統(tǒng)的瓶頸滞诺。唯一能說明磁盤是系統(tǒng)瓶頸的方法,就是很高的read/write時間环疼,一般來說超過20ms习霹,就代表了不太正常的磁盤性能。為什么是20ms呢炫隶?一般來說淋叶,一次讀寫就是一次尋道+一次旋轉延遲+數(shù)據(jù)傳輸?shù)臅r間。由于伪阶,現(xiàn)代硬盤數(shù)據(jù)傳輸就是幾微秒或者幾十微秒的事情煞檩,遠遠小于尋道時間220ms和旋轉延遲48ms处嫌,所以只計算這兩個時間就差不多了,也就是15~20ms形娇。只要大于20ms锰霜,就必須考慮是否交給磁盤讀寫的次數(shù)太多筹误,導致磁盤性能降低了桐早。
在Linux下,可以通過iostat命令查看磁盤性能厨剪。其中的svctm一項哄酝,反應了磁盤的負載情況,如果該項大于15ms祷膳,并且util%接近100%陶衅,那就說明,磁盤現(xiàn)在是整個系統(tǒng)性能的瓶頸了
上述理論也就是說只有磁盤表現(xiàn)出的讀寫能力可以說明磁盤是否有問題直晨,如果磁盤發(fā)揮正常搀军,如達到15ms的要求,那么如果cpu超水平發(fā)水勇皇,iowait還是會出現(xiàn)的罩句。也就說iowait其實是cpu和磁盤的比賽,有一個發(fā)揮不正常都會產生iowait高的現(xiàn)象敛摘,但不能說磁盤的問題门烂,也可能是cpu的問題
同時還可以安裝iotop工具,查看每個進程使用了多少IO流量
例子
vmstat下的b和wa列的值比較大兄淫,iostat下的磁盤利用率高
如果wa超過20%屯远,說明IO等待嚴重,引起IO等待的原因可能是磁盤大量隨機讀寫造成的捕虽,也可能是磁盤或者磁盤控制器的帶寬瓶頸造成的(主要是塊操作)
bi+bo參考值為1000慨丐,如果超過1000,而且wa值較大泄私,則表示系統(tǒng)磁盤IO有問題
調優(yōu)
- 各個磁盤的使用率是否非常高(%util)房揭,確定是哪塊磁盤問題
- 確定應用是順序還是隨機讀取硬盤,順序要看每秒的讀寫量挖滤,隨機要看IOPS(同時計算磁盤所能承受的最大的IOPS)
- 如果磁盤慢崩溪,要比較await和svctm(等待時間、實際操作時間)斩松,如果await遠大于svctm伶唯,則應用將變慢
- 監(jiān)控swap和系統(tǒng)分區(qū),確保虛擬內存不是文件系統(tǒng)IO的瓶頸
- 更換更快的存儲設備
- 使用多個磁盤(RAID)
- 增加系統(tǒng)的文件緩存
- 應用級別則減少讀寫次數(shù)(使用buffered的IO惧盹、整合數(shù)據(jù)乳幸、合并讀寫)
- 選擇正確的IO調度算法:CFQ瞪讼、Deadline、NOOP
- 選擇正確的文件系統(tǒng):Ext2粹断、Ext3符欠、ReiserFS
- 選擇正確的日志模式:journal、ordered瓶埋、writeback
- 選擇正確的塊大小
網(wǎng)絡監(jiān)控與調優(yōu)
- 網(wǎng)絡質量監(jiān)控
netstat -i
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 20403566 0 0 0 7747807 0 0 0 BMRU
lo 16436 0 55899937 0 0 0 55899937 0 0 0 LRU
字段 | 說明 |
---|---|
Iface | 網(wǎng)絡設備的接口名稱 |
MTU | 最大傳輸單元希柿,單位字節(jié) |
RX-OK/TX-OK | 已經準確無誤的接收/發(fā)送了多少數(shù)據(jù)包 |
RX-ERR/TX-ERR | 接收/發(fā)送數(shù)據(jù)包時產生了多少錯誤 |
RX-DRP/TX-DRP | 接收/發(fā)送數(shù)據(jù)包時丟棄了多少數(shù)據(jù)包 |
RX-OVR/TX-OVR | 由于誤差而遺失了多少數(shù)據(jù)包 |
Flg | 接口標記,L:表示該接口是個回環(huán)設備养筒,B:表示設置了廣播地址曾撤,M:表示接收所有數(shù)據(jù)包,R:表示接口正在運行晕粪,U:表示接口處于活動狀態(tài)挤悉,O:表示在該接口上禁用arp,P:表示一個點到點的連接 |
正常情況下巫湘,RX-ERR/TX-ERR装悲、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都應該為0,如果這幾個選項的值不為0尚氛,并且很大诀诊,那么網(wǎng)絡質量肯定有問題,網(wǎng)絡傳輸性能也一定會下降
- 顯示各種連接狀態(tài)的個數(shù)
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
指定某個ip的
netstat -nat |grep {IP-address} | awk '{print $6}' | sort | uniq -c | sort -n
指定某個端口
netstat -nat |grep {port} | awk '{print $6}' | sort | uniq -c | sort -n
- 列出當前端口被哪個進程占用
netstat -nap | grep port
- 安裝iftop工具怠褐,查看各進程的網(wǎng)絡的流量
調優(yōu)
- 增加網(wǎng)絡緩存
/proc/sys/net/ipv4/tcp_mem
/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max
/proc/sys/net/core/wmem_default
/proc/sys/net/core/wmem_max
/proc/sys/net/core/optmem_max - 調整窗口大小
通過讀寫緩存大小進行調整(rmem_max畏梆、wmem_max)
設定的值=網(wǎng)卡速率(bytes/s)*延時(sec),延時通過ping命令可得 - TCP調優(yōu)
接收大量客戶端:sysctl -w net.ipv4.tcp_tw_reuse=1和sysctl -w net.ipv4.tcp_tw_recycle=1 (TIME_WAIT重用)
盡快釋放回收FIN_WAIT_2狀態(tài)的socket:sysctl -w net.ipv4.tcp_fin_timeout=30
盡快釋放回收空閑的連接:sysctl -w net.ipv4.tcp_keepalive_time=1800
增加backlog以便接收更多客戶端:sysctl -w net.ipv4.tcp_max_syn_backlog=4096
性能監(jiān)控工具
性能測試工具
性能優(yōu)化工具
總結
- 調優(yōu)的目的是高效地使用資源奈懒,盡可能地使用最多的資源奠涌,從而提高性能
- 任何資源都要查看是資源使用率滿了,還是沒有高效使用資源
例如CPU使用率高磷杏,是因為算法問題(死循環(huán)溜畅,低效算法),還是因為程序本身就需要這么多CPU极祸。如果CPU使用率低慈格,則查看是因為資源等待還是線性操作。
又如I/O遥金,wa低下浴捆,也有可能I/O的問題(當然不是硬件問題),wa低下代表磁盤的使用率低下稿械。這時要看到底是程序本身不怎么使用磁盤选泻,還是沒有高效使用(大量隨機操作,而不是批量操作,順序寫入页眯,使用緩沖等) - 如果要提升服務器端的響應時間RT
采用減少IO的時間能達到最佳效果梯捕,比如合并多個IO請求
減少IO的調用次數(shù):并發(fā)HTTP請求(無上下文依賴,多個連接窝撵,一個線程)傀顾、HTTP連接池(長連接)
減少CPU的使用時間
使用緩存 - 如果要提升QPS
采用優(yōu)化CPU的時間能達到最佳效果,同時可以加大線程數(shù)
減少CPU的使用時間
增加CPU的數(shù)量
減少同步鎖
如果CPU不能被壓到85%以上碌奉,并且此時的QPS已經達到了峰值短曾,則說明另有瓶頸