Linux中查看CPU、内存和IO的占用情况
对于服务器的监控,主要还是查看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有一定的了解再结合应用的代码