Linux中查看CPU、内存和IO的占用情况
转自:https://www.cnblogs.com/ariesblog/p/13807845.html
对于服务器的监控,主要还是查看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
使用top -Hp
找到占用CPU过高的线程后,使用print "%x\n"
使用jdk自带的命令jstack获取此时的线程快照并输出到指定文件中:jstack -l
查看上面生成的文件,并结合前面的十六进制线程号来查找相关线程信息,后续分析问题需要对JAVA有一定的了解再结合应用的代码