性能监测

一、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个迁移,绑定到指定处理器集可以改善性能。

猜你喜欢

转载自fengbaoxp.iteye.com/blog/1905846