對於服務器的監控,主要還是查看CPU、內存以及IO的占用情況,在此做個簡單的了解
一、常用命令
1、top命令
top
命令應該是使用比較多的一個,可以看到CPU和內存的占用情況以及進程的PID,進入top頁面后,大寫的字母P
和M
分別是按照CPU占用和內存占用排序顯示。
2、free命令
free
命令在查看內存使用情況是也是用的比較多。
3、ps命令
ps -aux | sort -k4nr | head -N
head -N
可以指定顯示的行數,默認顯示10行。ps -aux
中參數a指all,即所有的進程;u指userid,即執行該進程的用戶id;x指顯示所有程序,不以終端機來區分。sort -k4nr
中k代表根據哪一個關鍵詞排序,后面的數字4表示按照第四列排序;n代表numberic sort,指根據其數值排序;r代表reverse,指反向比較結果,因為輸出時默認是從小到大,用了反向后就是從大到小。- 上述命令%MEM是第四列,故是按照內存占用情況列舉內存占用最多的N行進程;%CPU是第三列,查看CPU占用情況的話,用k3即可。
4、iostat命令
以磁盤為單位查看io情況,個人常用iostat -xdm 1
來查看
5、pidstat命令
統計進程的狀態,自然也包括進程的IO狀況,個人常用pidstat -urd 1
- -u:CPU使用率
- -r:缺頁及內存信息
- -d:IO信息
- -t:有需要的話也可以以線程為統計單位
- 查看進程IO狀況的還有
iotop
命令
二、如何在發生OOM時自動dump內存快照
1、問題背景
在運維服務器的時候會遇到一些java進程報錯“java.lang.OutOfMemoryError”然后進程死掉的情況,對於Java我了解的不多,但是當問題發生的時候起碼需要知道是什么對象太多導致的OOM,所以在發生OOM時能有一份dump內存快照對於排查問題就很重要了。
2、配置
- 當發生OOM時,進程會死掉,但是並不是說是JVM完全來不及處理然后就突然進程就沒了,也就是說這個機制不是JVM自己觸發的,是受到控制的。那么,如果JVM知道要發生OOM了,完全可以可以讓他在此時做點事情,例如就可以讓他在OOM時dump一份內存快照,事后只要分析這個內存快照,就可以知道是哪些對象占用了所有的內存,並且還無法釋放。
- 具體配置,是在JVM的啟動參數中添加如下的一些參數:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/app/oom
- 第一個參數意思是在OOM的時候自動dump內存快照出來
- 第二個參數是說把內存快照放到哪兒去
三、JAVA進程占用CPU過高問題簡單分析
內存發生OOM時是可以通過內存快照去分析查看問題,CPU占用過高也可以找到對應的進程中的線程來獲取線程快照分析問題。
- 使用
top -p <pid>
命令查看java進程占用cpu情況 - 使用
top -Hp <pid>
命令查看該進程內所有線程的資源占用情況(可以用P或者M排序) - 找到占用CPU過高的線程后,使用
print "%x\n" <tid>
命令將看到的十進制線程ID轉換成十六進制,十六進程以0x開頭,轉換之后對應加上 - 使用jdk自帶的命令
jstack
獲取此時的線程快照並輸出到指定文件中:jstack -l <pid> /u01/app/jstack_result.txt
- 查看上面生成的文件,並結合前面的十六進制線程號來查找相關線程信息,后續分析問題需要對JAVA有一定的了解再結合應用的代碼