一、CPU监测:
Windows:
1、Task Manager
显示内核CPU时间: view -> Show Kernel Times
2、Performance Monitor (perfmon)
3、typeperf
typeperf "\Processor(_Total)\% Privileged Time" "\Processor(_Total)\% User Time"
Linux:
1、gnome-system-monitor(图形工具)
2、vmstat
cpu->sy : 系统时间%
cpu->us : 用户时间%
cpu->id : 空闲时间%
cpu->wa : 等待IO时间%
3、mpstat
需要先安装sysstat:
# apt-get install sysstat
4、top
二、CPU 调度队列监测:
Windows :
1、Performance Monitor (perfmon)
System > Processor Queue Length from Add Counters dialog.
2、typeperf
间隔5秒:
typeperf -si 5 "\System\Processor Queue Length"
Linux:
1、vmstat
procs->r :运行队列中的进程数,在一个稳定的工作量下,应该少于5
procs->b:等待队列中的进程数(等待I/O),通常情况下是接近0的
二、Memory监测:
Window:
1、Performance Monitor(perfmon)
Memory->Pages/second : 每秒交换页数
Memory->Available MBytes : 可用内存
每秒交换页数高,可用内存少说明系统内存不足,在做磁盘交换(swap)。
2、typeperf
typeperf -si 5 "\Memory\Available Mbyptes" "\Memory\Pages/sec"
Linux:
1、vmstat
swap->si : 换入页数
swap->so: 换出页数
memory->swapd: 已使用虚拟内存大小
memory->free : 可用内存
memory->buff: 作为buffer cache的内存,对块设备的读写进行缓冲
memory->cache: 作为page cache的内存, 文件系统的cache。如果 cache 的值大的时候,说明cache住的文件数多,如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi 会非常小。
三、Lock Contention(锁竞争)监测
Windows:
1、perfmon,typeperf只能监测总的上下文切换次数,不能区分主动还是被动。
2、区分主动和被动上下文切换次数,需要借助:1、Intel VTune 2、AMD CodeAnalyst
Linux:
1、pidstat
cswch/s:每秒自发的上下文切换次数
nvcswch/s:每秒非自发的上下文切换次数
监测Pid=9391的进程,并每5秒输出一次结果:
$ pidstat -w -I -p 9391 5
Linux 2.6.24-server (payton) 07/10/2008
08:57:19 AM PID cswch/s nvcswch/s Command
08:57:26 AM 9391 3645 322 java
08:57:31 AM 9391 3512 292 java
08:57:36 AM 9391 3499 310 java
为了估算浪费在上下文切换上的时钟周期百分比,上面通过pidstat -w监测的系统,每秒大概发生3500个上下文切换 , 一个3.0GHz 双核Intel CPU. 因此, 3500 除以2,虚拟的进程数 = 1750. 1750 * 80,000 = 140,000,000. 一个 3.0GHz 处理器每秒的时钟周期数是 3,000,000,000. 这样, 浪费在上下文切换上的时钟周期比率是 140,000,000/3,000,000,000 = 4.7%. 通常如果 3% 到 5% 时钟周期发生在主动的上下文切换上,暗示一个Java应用可能存在锁竞争。
高非自发上下文切换暗示有比CPU核数更多的线程需要运行。通常用vmstat监测会发现有高的运行队列长度,高的CPU利用率,高的migrations。Linux可以通过taskset命令,并将应用绑定到指定的taskset。Window系统, 可以通过任务管理器的Process标签,将应用绑定到处理器或者处理器集。
四、Thread Migrations(线程迁移)监测
线程迁移是指准备运行的线程在多核处理器(CPU核心)的核心之前的迁移。如果准备运行的线程在不同CPU核心之间频繁迁移也会引起性能下降。解决高迁移率的办法是,创建处理器集(processor set),并将应用绑定到指定的处理器集。通常经验,如果Java应用有超过每秒500个迁移,绑定到指定处理器集可以改善性能。