1.CPU消耗率分析
当CPU消耗严重时,主要体现在us、sy、wa或hi的值变高,wa的值是IO等待造成的,hi变高主要为硬件中断造成(例如网卡数据频繁),对于Java应用而言,CPU消耗严重主要体现在us、sy两个值上。
当us值过高时,表示运行的应用消耗了大部分的CPU。Java应用造成us高的原因主要是线程一直处于可运行(Runnable)状态,通常是这些线程在执行无阻塞、循环、正则或纯粹的计算等动作造成;另外一个可能造成us高的原因是频繁的GC。
当sy值高时,表示linux花费了更多的时间在进行线程切换,Java应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数都处于不断的阻塞(例如锁等待、IO等待状态)和执行状态的变化过程中,这导致了操作系统要不断地切换执行的线程, 产生大量的上下文切换。
查询基本步骤:
+-top 或 vmstat 找到消耗CPU严重的线程及其ID,将此线程ID换算成十六进制的值
+-kill -3 pid 或 jstack [-l] pid | [grep 'nid=Ox6849'] 的方式dump出应用的java线程信息
2.文件IO消耗分析
在使用iostat查看IO的消耗情况时,首先要关注的是CPU中的iowait%,当iowait占据了主要的百分比时,就表示要关注IO方面的消耗了,这时可以用过iostat -x来详细地查看具体状况。
iostat - 安装 yum install sysstat(centos) 或 aptitude install sysstate(ubuntu,debian)
iostat -dx 1 每隔一秒显示IO信息
iostat -x sda 3 每隔3秒显示sda磁盘IO信息
参数解析:
-r/s 每秒读的请求数
-w/s 每秒写得请求数
-await 平均每次IO操作的等待时间,单位为毫秒
-avgqu-sz 等待请求的队列的平均长度
-svctm 平均每次设备执行IO操作的时间
-util 一秒之中有百分之几用于IO操作
3.内存消耗分析
在正是环境,多数Java应用都会将-Xms和-Xmx设为相同的值,避免运行期要不断申请内存。
对于Java应用,内存消耗主要分为JVM内存消耗和JVM堆外内存消耗。
JVM内存消耗过多会导致GC执行频繁,CPU消耗增加,应用线程的执行速度严重下降,甚至造成OutOfMemoryError,最终导致Java进程退出。
JVM堆外内存消耗,最值得关注的是swap的消耗及物理内存的消耗。
vmstat 其中信息和内存相关的主要是memory下的swpd, free, buff, cache及swap下的si和so
参数解析
-swpd 已使用的虚拟内存,单位为Kb
-free 空闲虚拟内存
-buff 用于缓冲的内存
-cache 用户缓存的内存
-si 每秒从disk读至内存的数据量
-so 每秒从内存写至disk的数据量
频繁的swapIO会导致swpd过高
由于Java应用是单进程应用,因此只要JVM的内存设置不是过大,是不会操作到swap区域的。
物理内存消耗过高可能是由于JVM内存设置过大、创建的Java线程过多或通过Direct ByteBuffer往物理内存中放置了过多的对象造成的。
sar -r 1 10 通过sar命令查看内存消耗(每1秒刷新一次共10次)
top 查看进程所消耗的内存量 其中 Java进程消耗内存 =(JVM-Xmx值)+ JVM外的内存值
pidstat -r -p [pid] [interval] [times] 查看进程所占虚拟内存大小
参数解析
-minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
-majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,
这样的page fault为major page fault,一般在内存使用紧张时产生
-VSZ: 该进程使用的虚拟内存(以kB为单位)
-RSS: 该进程使用的物理内存(以kB为单位)
-%MEM: 该进程使用内存的百分比
-Command: 拉起进程对应的命令
当CPU消耗严重时,主要体现在us、sy、wa或hi的值变高,wa的值是IO等待造成的,hi变高主要为硬件中断造成(例如网卡数据频繁),对于Java应用而言,CPU消耗严重主要体现在us、sy两个值上。
当us值过高时,表示运行的应用消耗了大部分的CPU。Java应用造成us高的原因主要是线程一直处于可运行(Runnable)状态,通常是这些线程在执行无阻塞、循环、正则或纯粹的计算等动作造成;另外一个可能造成us高的原因是频繁的GC。
当sy值高时,表示linux花费了更多的时间在进行线程切换,Java应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数都处于不断的阻塞(例如锁等待、IO等待状态)和执行状态的变化过程中,这导致了操作系统要不断地切换执行的线程, 产生大量的上下文切换。
查询基本步骤:
+-top 或 vmstat 找到消耗CPU严重的线程及其ID,将此线程ID换算成十六进制的值
+-kill -3 pid 或 jstack [-l] pid | [grep 'nid=Ox6849'] 的方式dump出应用的java线程信息
2.文件IO消耗分析
在使用iostat查看IO的消耗情况时,首先要关注的是CPU中的iowait%,当iowait占据了主要的百分比时,就表示要关注IO方面的消耗了,这时可以用过iostat -x来详细地查看具体状况。
iostat - 安装 yum install sysstat(centos) 或 aptitude install sysstate(ubuntu,debian)
iostat -dx 1 每隔一秒显示IO信息
iostat -x sda 3 每隔3秒显示sda磁盘IO信息
参数解析:
-r/s 每秒读的请求数
-w/s 每秒写得请求数
-await 平均每次IO操作的等待时间,单位为毫秒
-avgqu-sz 等待请求的队列的平均长度
-svctm 平均每次设备执行IO操作的时间
-util 一秒之中有百分之几用于IO操作
3.内存消耗分析
在正是环境,多数Java应用都会将-Xms和-Xmx设为相同的值,避免运行期要不断申请内存。
对于Java应用,内存消耗主要分为JVM内存消耗和JVM堆外内存消耗。
JVM内存消耗过多会导致GC执行频繁,CPU消耗增加,应用线程的执行速度严重下降,甚至造成OutOfMemoryError,最终导致Java进程退出。
JVM堆外内存消耗,最值得关注的是swap的消耗及物理内存的消耗。
vmstat 其中信息和内存相关的主要是memory下的swpd, free, buff, cache及swap下的si和so
参数解析
-swpd 已使用的虚拟内存,单位为Kb
-free 空闲虚拟内存
-buff 用于缓冲的内存
-cache 用户缓存的内存
-si 每秒从disk读至内存的数据量
-so 每秒从内存写至disk的数据量
频繁的swapIO会导致swpd过高
由于Java应用是单进程应用,因此只要JVM的内存设置不是过大,是不会操作到swap区域的。
物理内存消耗过高可能是由于JVM内存设置过大、创建的Java线程过多或通过Direct ByteBuffer往物理内存中放置了过多的对象造成的。
sar -r 1 10 通过sar命令查看内存消耗(每1秒刷新一次共10次)
top 查看进程所消耗的内存量 其中 Java进程消耗内存 =(JVM-Xmx值)+ JVM外的内存值
pidstat -r -p [pid] [interval] [times] 查看进程所占虚拟内存大小
参数解析
-minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
-majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,
这样的page fault为major page fault,一般在内存使用紧张时产生
-VSZ: 该进程使用的虚拟内存(以kB为单位)
-RSS: 该进程使用的物理内存(以kB为单位)
-%MEM: 该进程使用内存的百分比
-Command: 拉起进程对应的命令