性能優(yōu)化的核心是找出系統(tǒng)的瓶頸點,問題找到了,優(yōu)化的工作也就完成了大半; 這里介紹的性能優(yōu)化主要從兩個層面來介紹:系統(tǒng)層面和程序?qū)用妫?/p>
系統(tǒng)響應(yīng)變慢,首先得定位大致的問題出在哪里,是IO瓶頸、CPU瓶頸、內(nèi)存瓶頸還是程序?qū)е碌南到y(tǒng)問題;
使用top工具能夠比較全面的查看我們關(guān)注的點::
$top
top - 09:14:56 up 264 days, 20:56, 1 user, load average: 0.02, 0.04, 0.00
Tasks: 87 total, 1 running, 86 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 377672k total, 322332k used, 55340k free, 32592k buffers
Swap: 397308k total, 67192k used, 330116k free, 71900k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 2856 656 388 S 0.0 0.2 0:49.40 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 7:15.20 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/
進(jìn)入交互模式后:
top第三行顯示當(dāng)前系統(tǒng)的,其中有兩個值很關(guān)鍵:
查看內(nèi)存是否存在瓶頸,使用top指令看比較麻煩,而free命令更為直觀::
[/home/weber#]free
total used free shared buffers cached
Mem: 501820 452028 49792 37064 5056 136732
-/+ buffers/cache: 310240 191580
Swap: 0 0 0
[/home/weber#]top
top - 17:52:17 up 42 days, 7:10, 1 user, load average: 0.02, 0.02, 0.05
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 501820 total, 452548 used, 49272 free, 5144 buffers
KiB Swap: 0 total, 0 used, 0 free. 136988 cached Mem
top工具顯示了free工具的第一行所有信息,但真實可用的內(nèi)存,還需要自己計算才知道;
系統(tǒng)實際可用的內(nèi)存為free工具輸出第二行的free+buffer+cached;也就是第三行的free值191580;關(guān)于free命令各個值的詳情解讀,請參考這篇文章 :ref:free
;
如果是因為缺少內(nèi)存,系統(tǒng)響應(yīng)變慢很明顯,因為這使得系統(tǒng)不停的做換入換出的工作;
進(jìn)一步的監(jiān)視內(nèi)存使用情況,可使用vmstat工具,實時動態(tài)監(jiān)視操作系統(tǒng)的內(nèi)存和虛擬內(nèi)存的動態(tài)變化。
參考: :ref:vmstat
;
如果IO存在性能瓶頸,top工具中的%wa會偏高;
進(jìn)一步分析使用iostat工具::
/root$iostat -d -x -k 1 1
Linux 2.6.32-279.el6.x86_64 (colin) 07/16/2014 _x86_64_ (4 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.02 7.25 0.04 1.90 0.74 35.47 37.15 0.04 19.13 5.58 1.09
dm-0 0.00 0.00 0.04 3.05 0.28 12.18 8.07 0.65 209.01 1.11 0.34
dm-1 0.00 0.00 0.02 5.82 0.46 23.26 8.13 0.43 74.33 1.30 0.76
dm-2 0.00 0.00 0.00 0.01 0.00 0.02 8.00 0.00 5.41 3.28 0.00
更多參數(shù)說明請參考 :ref:iostat
;
通過top等工具發(fā)現(xiàn)系統(tǒng)性能問題是由某個進(jìn)程導(dǎo)致的之后,接下來我們就需要分析這個進(jìn)程;繼續(xù) 查詢問題在哪;
這里我們有兩個好用的工具: pstack和pstrace
pstack用來跟蹤進(jìn)程棧,這個命令在排查進(jìn)程問題時非常有用,比如我們發(fā)現(xiàn)一個服務(wù)一直處于work狀態(tài)(如假死狀態(tài),好似死循環(huán)),使用這個命令就能輕松定位問題所在;可以在一段時間內(nèi),多執(zhí)行幾次pstack,若發(fā)現(xiàn)代碼??偸峭T谕粋€位置,那個位置就需要重點關(guān)注,很可能就是出問題的地方;
示例:查看bash程序進(jìn)程棧::
/opt/app/tdev1$ps -fe| grep bash
tdev1 7013 7012 0 19:42 pts/1 00:00:00 -bash
tdev1 11402 11401 0 20:31 pts/2 00:00:00 -bash
tdev1 11474 11402 0 20:32 pts/2 00:00:00 grep bash
/opt/app/tdev1$pstack 7013
#0 0x00000039958c5620 in __read_nocancel () from /lib64/libc.so.6
#1 0x000000000047dafe in rl_getc ()
#2 0x000000000047def6 in rl_read_key ()
#3 0x000000000046d0f5 in readline_internal_char ()
#4 0x000000000046d4e5 in readline ()
#5 0x00000000004213cf in ?? ()
#6 0x000000000041d685 in ?? ()
#7 0x000000000041e89e in ?? ()
#8 0x00000000004218dc in yyparse ()
#9 0x000000000041b507 in parse_command ()
#10 0x000000000041b5c6 in read_command ()
#11 0x000000000041b74e in reader_loop ()
#12 0x000000000041b2aa in main ()
而strace用來跟蹤進(jìn)程中的系統(tǒng)調(diào)用;這個工具能夠動態(tài)的跟蹤進(jìn)程執(zhí)行時的系統(tǒng)調(diào)用和所接收的信號。是一個非常有效的檢測、指導(dǎo)和調(diào)試工具。系統(tǒng)管理員可以通過該命令容易地解決程序問題。
參考: ref:strace
優(yōu)化自己開發(fā)的程序,建議采用以下準(zhǔn)則::
關(guān)于gprof的使用案例,請參考 f1;
調(diào)試內(nèi)存泄漏的工具valgrind,感興趣的朋友可以google了解;
OProfile: Linux 平臺上的一個功能強(qiáng)大的性能分析工具,使用參考 f2;
除了上面介紹的工具,還有一些比較全面的性能分析工具,比如sar(Linux系統(tǒng)上默認(rèn)不安裝,需要手動安裝下); 將sar的常駐監(jiān)控工具打開后,能夠收集比較全面的性能分析數(shù)據(jù);
關(guān)于sar的使用,參考 :ref:sar
;