对于服务器的监控,主要还是查看CPU、内存以及IO的占用情况,在此做个简单的了解

一、常用命令

1、top命令

top命令应该是使用比较多的一个,可以看到CPU和内存的占用情况以及进程的PID,进入top页面后,大写的字母PM分别是按照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有一定的了解再结合应用的代码

版权声明:本文为ariesblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ariesblog/p/13807845.html