服務(wù)器問題排查步驟
線上故障主要會(huì)包括cpu嚣鄙、磁盤、內(nèi)存以及網(wǎng)絡(luò)問題串结,而大多數(shù)故障可能會(huì)包含不止一個(gè)層面的問題哑子,所以進(jìn)行排查時(shí)候盡量四個(gè)方面依次排查一遍。同時(shí)例如jstack肌割、jmap等工具也是不被局限在一個(gè)方面的問題的卧蜓,基本上出問題就是df、free把敞、top 三連弥奸,然后依次jstack、jmap伺候奋早,具體問題具體分析即可盛霎。
一 、cpu使用情況
- top查看總體的系統(tǒng)硬件使用情況
[root@VM_132_3_centos temp]# top
1伸蚯、load average 查看一分鐘 十分鐘 半個(gè)小時(shí)內(nèi)的平均負(fù)載狀態(tài)
2摩渺、多次按鍵盤1 可查看每個(gè)CPU內(nèi)核的使用情況
3、各個(gè)進(jìn)程的內(nèi)存和CPU使用情況
ps -mp PID -o THREAD,tid,time 查看這個(gè)進(jìn)程的具體線程的使用cpu情況
- m 顯示所有的線程
- p pid 進(jìn)程使用cpu的時(shí)間
- 0 該參數(shù)后是用戶自定義格式
[root@VM_132_3_centos nginx]# ps -mp 14669 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 0.2 - - - - - - 03:11:33
root 0.0 19 - futex_ - - 14669 00:00:00
當(dāng)然也可以用 top -H -p pid來找到cpu使用率比較高的一些線程
[root@VM_132_3_centos nginx]# top -H -p 14669
printf ‘%x\n’ pid 然后將占用最高的pid轉(zhuǎn)換為16進(jìn)制得到nid
[root@VM_132_3_centos nginx]# printf "%x\n" 14818
接著直接在jstack中找到相應(yīng)的堆棧信息jstack pid |grep ‘nid’ -A50剂邮,找到自己寫的代碼行數(shù)摇幻,就定位到了出問題的代碼位置
參數(shù)說明
- pid 進(jìn)程id
- nid 線程id 小寫的16進(jìn)制編號(hào)
- A50 查看匹配到行后的50行 或者用C20查看前后20行
[root@VM_132_3_centos nginx]# jstack 14669 |grep 39e2
2. vmstat 查看cpu
一般vmstat工具的使用是通過兩個(gè)數(shù)字參數(shù)來完成的,第一個(gè)參數(shù)是采樣的時(shí)間間隔數(shù)單位是秒挥萌,第二個(gè)參數(shù)是采樣的次數(shù)
[root@VM_132_3_centos temp]# vmstat -n 2 3
參數(shù)解釋
[1]. procs
– r: 運(yùn)行和等待CPU時(shí)間片的進(jìn)程數(shù)绰姻,原則上1核的CPU的運(yùn)行隊(duì)列不要超過2,整個(gè)系統(tǒng)的運(yùn)行隊(duì)列不能超過總核數(shù)的2倍引瀑,
否則代表系統(tǒng)壓力過大
– b: 等待資源的進(jìn)程數(shù)狂芋,比如正在等待磁盤I/0、網(wǎng)絡(luò)I/0等憨栽。
[2]. cpu
– us: 用戶進(jìn)程消耗CPU時(shí)間百分比帜矾,us值高,用戶進(jìn)程消耗CPU時(shí)間多屑柔,如果長期大于50%屡萤,優(yōu)化程序;
– sy:內(nèi)核進(jìn)程消耗的CPU時(shí)間百分比掸宛;
– us + sy:參考值為80%死陆,如果us + sy大于80%,說明可能存在CPU不足唧瘾;
– id:處于空閑的CPU百分比.措译;
– wa:系統(tǒng)等待IO的CPU時(shí)間百分比别凤;
– st:來自于一個(gè)虛擬機(jī)偷取的CPU時(shí)間的百分比。
-[3]. system
– cs(context switch):一列則代表了上下文切換的次數(shù)
3. jstat分析頻繁gc
當(dāng)然我們還是會(huì)使用jstack來分析問題领虹,但有時(shí)候我們可以先確定下gc是不是太頻繁规哪,使用jstat -gc pid 1000命令來對(duì)gc分代變化情況進(jìn)行觀察,1000表示采樣間隔(ms)掠械,S0C/S1C由缆、S0U/S1U注祖、EC/EU猾蒂、OC/OU、MC/MU分別代表兩個(gè)Survivor區(qū)是晨、Eden區(qū)肚菠、老年代、元數(shù)據(jù)區(qū)的容量和使用量罩缴。YGC/YGT蚊逢、FGC/FGCT、GCT則代表YoungGc箫章、FullGc的耗時(shí)和次數(shù)以及總耗時(shí)烙荷。如果看到gc比較頻繁,再針對(duì)gc方面做進(jìn)一步分析檬寂。
二终抽、 內(nèi)存使用情況
1. free 查看內(nèi)存使用情況
[root@VM_132_3_centos nginx]# free -m
2 .使用JMAP定位代碼內(nèi)存泄漏
上述關(guān)于OOM和StackOverflow的代碼排查方面,我們一般使用JMAPjmap -dump:format=b,file=filename pid來導(dǎo)出dump文件
通過mat(Eclipse Memory Analysis Tools)導(dǎo)入dump文件進(jìn)行分析桶至,內(nèi)存泄漏問題一般我們直接選Leak Suspects即可昼伴,mat給出了內(nèi)存泄漏的建議。另外也可以選擇Top Consumers來查看最大對(duì)象報(bào)告镣屹。和線程相關(guān)的問題可以選擇thread overview進(jìn)行分析圃郊。除此之外就是選擇Histogram類概覽來自己慢慢分析,大家可以搜搜mat的相關(guān)教程女蜈。
日常開發(fā)中持舆,代碼產(chǎn)生內(nèi)存泄漏是比較常見的事,并且比較隱蔽伪窖,需要開發(fā)者更加關(guān)注細(xì)節(jié)逸寓。比如說每次請(qǐng)求都new對(duì)象,導(dǎo)致大量重復(fù)創(chuàng)建對(duì)象惰许;進(jìn)行文件流操作但未正確關(guān)閉席覆;手動(dòng)不當(dāng)觸發(fā)gc;ByteBuffer緩存分配不合理等都會(huì)造成代碼OOM汹买。
三佩伤、 硬盤空間使用情況
1. df -lh 查看磁盤的使用情況
[root@VM_132_3_centos temp]# df -lh
2. du -h --max-depth=1 查看當(dāng)前目錄中文件和文件夾的大小
[root@VM_132_3_centos nginx]# du -h --max-depth=1
3.iostat 查看磁盤io情況
最后一列%util可以看到每塊磁盤寫入的程度聊倔,而rrqpm/s以及wrqm/s分別表示讀寫速度,一般就能幫助定位到具體哪塊磁盤出現(xiàn)問題了生巡。
磁盤塊設(shè)備分布
- rkB/s每秒讀取數(shù)據(jù)量kB;
- wkB/s每秒寫入數(shù)據(jù)量kB;
- svctm I/O請(qǐng)求的平均服務(wù)時(shí)間耙蔑,單位毫秒;
- await I/O請(qǐng)求的平均等待時(shí)間,單位毫秒;值越小孤荣,性能越好;
- util一秒中有百分幾的時(shí)間用于I/O操作甸陌。接近100%時(shí),表示磁盤帶寬跑滿盐股,需要優(yōu)化程序或者增加磁盤;
4. lsof -p pid查看文件讀取情況
輸出各列信息的意義如下:
COMMAND: 進(jìn)程的名稱
PID: 進(jìn)程標(biāo)識(shí)符
USER: 進(jìn)程所有者
FD: 文件描述符钱豁,應(yīng)用程序通過文件描述符識(shí)別該文件。每個(gè)進(jìn)程都有自己的文件描述符表疯汁,因此FD可能會(huì)重名
TYPE: 文件類型
DEVICE: 指定磁盤的名稱
SIZE: 文件的大小
NODE: 索引節(jié)點(diǎn)(文件在磁盤上的標(biāo)識(shí))
NAME: 打開文件的確切名稱
四牲尺、網(wǎng)絡(luò)使用情況
1. netstat 查看tcp等連接情況
tcp隊(duì)列溢出
netstat命令,執(zhí)行netstat -s | egrep “l(fā)isten|LISTEN”
如上圖所示幌蚊,overflowed表示全連接隊(duì)列溢出的次數(shù)谤碳,sockets dropped表示半連接隊(duì)列溢出的次數(shù)。
查看各狀態(tài)的連接數(shù)量 netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
[root@VM_132_3_centos nginx]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}
2. telnet查看端口是否連通
出現(xiàn)下面這個(gè)connected就是說明端口是通的
[root@VM_132_3_centos nginx]# telnet www.baidu.com 80