操作系统性能监控
服务端程序除了应用本身性能外,依赖与服务器本身的性能.服务器性能指标包括:CPU,内存,网络 IO 和磁盘使用率.
今天学习了内存监控的部分.
为什么要监测内存
当应用运行所需内存超过可用物理内存时,就会发生页面交换.通常会在硬盘上分配一个 swap 空间.当应用耗尽可用内存时,就会把不常用的内容放到 swap 空间里. 当访问被置换到 swap 空间的内容时,就需要把 swap 空间的内容加载到物理内存中,这种置换操作会大大影响应用的吞吐量和响应性.
JVM 垃圾收集器在进行置换操作时,性能也很差.垃圾收集器为了回收不可达对象,需要大量访问内存.如果 java 堆的一部分被置换出去,就必须先置换进来,在扫描存活对象,这会增加 GC 的时间.GC 会造成 jvm 停顿.
监测内存使用率
[root@Hwseeker-Adx02 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 4030152 1427780 1159168 87874912 0 0 1 15 0 0 4 1 94 0 0
其中 si,so 可以看到 swap 操作,free 代表可用内存数.如果 si 和 so 很大,就代表发生了内存置换.
监控锁竞争
定义几个概念
让步试上下文切换: 是指线程主动释放 CPU
抢占式上下文切换: 线程因为分配的时间片用尽被迫放弃 CPU 或被优先级更高的线程抢占,而失去执行机会
Java HotSpot VM 从 1.5 开始,增加了锁机制优化.线程通过忙循环自旋尝试获得锁,如果若干次自旋后,没有获取成功,则挂起线程,等待唤醒后再次尝试获取.挂起和唤醒线程会导致让步试上线文切换.
让步试上下文切换耗费 CPU 时钟非常严重,通常高达 80000 个时钟周期
主频为 3GHz 的处理器每秒钟可用时钟周期为 3,000,000,000
抢占式上下文切换监控
[root@dmp002 ~]# pidstat -w -I -p 29064
Linux 2.6.32-573.el6.x86_64 (dmp002.tiger.local) 2018年01月25日 _x86_64_ (24 CPU)
18时34分45秒 PID cswch/s nvcswch/s Command
18时34分45秒 29064 3500 0.02 java
可以用 top 命令,获取 pid
pidstat -w 显示系统每秒发生 3500 个上下文切换.处理器为 3Ghz 双核 Intel CPU.因此虚拟处理器上下文切换为 3500/2=1750, 耗费的始终周期为 1750*8000=140,000,000.3Ghz 每秒钟周期数为 3,000,000,000.浪费的始终周期为 140,000,000/3,000,000,000=4.7%.
让步时钟周期占用超过 3%,表明 Java 应用正面临锁竞争
来源: http://www.bubuko.com/infodetail-2474849.html