第二章 操作系统性能监控

本章目标:

  • 了解找到性能极限需要监控哪些数据
  • 了解找到性能极限需要监控软件栈的哪些部分
  • 找到性能极限需要使用哪些工具
  • 学习性能相关的概念
  • 学习操作系统监控的相关工具使用

应用的性能极限是干系人在服务等级协议中关注的重点。

服务等级协议(Service Level Agreement SLA):提供服务的企业与客户之间就服务的品类、水准、性能等方面所达成的双方共同认可的协议或契约。

 

2.1 概念定义

  • 性能监控:以非侵入方式收集或查看应用运行性能数据的活动。目的是在出现性能问题时可以根据监控数据进行性能分析和性能调优
  • 性能分析:性能分析是一种以侵入方式收集运行性能数据的活动。主要在质量评估、测试或开发环境进行。
  • 性能调优:为改善应用响应性或吞吐量而更改参数(Tune-able)、源代码或属性配置的活动

2.2 CPU使用率

  • 用户态CPU使用率:指执行应用程序代码的时间占总CPU时间的百分比
  • 系统态CPU使用率:指应用执行操作系统调用的时间占总CPU时间的百分比

系统态CPU使用率高意味着资源有竞争或者I/O设备之间有大量的交互,提高应用性能和扩展性的一个目标是尽可能的降低系统态CPU使用率

对于计算密集型应用来说,还要监控一下两个指标:

  • 每时钟指令数(Instructions Per Clock,IPC) :一个CPU时钟周期内执行的指令数
  • 每指令时钟周期(Cycles Per Instruction,CPI):一个指令的执行消耗的时钟周期数

I/O bound(IO密集型) 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运行大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Load 不高。

CPU bound (CPU密集型)指的是系统的硬盘/内存的效能相对CPU的效能要好很多,此时,系统运行的大部分状况是 CPU Loading 100%,CPU 要读/写 I/O (硬盘/内存),I/O在很短的时间就可以完成,而 CPU 还有许多运算要处理,CPU Load 很高。

优化计算密集型应用的策略就是减少停滞,改善CPU高速缓存命中或提高IO效率 

CPU停滞(Stall):即使没有执行CPU指令,CPU在等待内存中的数据,操作系统工具仍然会报告CPU繁忙,这种情况就被称为停滞。当CPU执行指令时,所需的操作数据不在寄存器或者缓存中,就会发生停滞,等待数据从内存载入CPU寄存器。一旦发生停滞,就会浪费CPU时钟周期。

2.2.1 监控CPU使用率

  • MAC OS 活动监控器

225858_ihit_3432393.png

  • linux 系统监视器 (centOS)

230143_ZniS_3432393.png

2.2.5 命令行监控CPU使用率(以linux操作系统为例)

vmstat: 通过命令行查看资源使用率

231351_LNL0_3432393.png

  • cpu:cpu的使用情况
    • us:用户CPU时间
    • sy:系统CPU时间,如果太高,表示系统调用时间长,例如IO操作频繁。
    • id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
    • wa:等待io cpu时间,Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。
 top:linux下的top命令

231935_Oo8Z_3432393.png

2.3 cpu调度程序运行队列

vmstat监控的结果中proces列显示了cpu调度程序运行队列的情况。运行队列中的轻量级进程数越大,系统负载就会越高。超过系统硬件线程数时,系统的响应就会变得非常迟缓。

通过Java API Runtime.availableProcessors() 方法可以活的硬件线程数

 解决运行队列长度的方案:

  1. 增加CPU以分担负载或减少处理器的负载量
  2. 优化应用,改进CPU使用率、优化算法、优化数据结构以减小CPU执行周期

2.4 内存使用率

监控内存的主要指标:内存基本使用情况、页面交换、锁、线程迁移中的让步式和抢占式上下文切换。

2.4.3 监控内存使用率:Linux

页面交换:当应用程序需要的内存超过物理内存就会发生页面交换,即操作系统会按照某个模式将数据从内存换出到虚拟内存或从虚拟内存换入到物理内存中。虚拟内存又称作交换分区,一般以一个单独的分区形式存在。

换出:从物理内存到虚拟内存

换入:从虚拟内存到物理内存

发生页面交换对JVM垃圾回收的影响:

JVM垃圾回收是为了回收不可达对象占用的内存空间,需要访问大量的内存空间,如果Java堆的一部分被置换出去,就必须先置换进内存以便垃圾收集器扫描存活对象。这会增加垃圾收集器的持续时间。有时候垃圾收集器的收集操作是Stop-the-world(时空停滞)操作,即停止所有正在运行应用线程,如果这时系统正在进行页面交换,则会引起JVM长时间的停顿。

2.4.4 监控锁竞争:Solaris

Java5之前主要依赖操作系统原语实现锁机制,Java5之后则以用户代码的方式实现了多种加锁方式,减少了锁竞争。

操作系统锁原语(Lock Primitive):待补充

互斥量上的自旋 smtx(Spin on Mutex):待补充

忙循环自旋(Tight Loop Spin):待补充

  • 让步式上下文切换(Voluntary Context Switch):线程通过忙循环自旋尝试获得锁,如果多次之后仍然失败,则系统会挂起该线程,线程主动释放CPU,等待被唤醒再次尝试获取该锁。挂起和唤起线程都会造成操作系统的让步式上下文切换。因此会浪费大量的cpu时钟周期。
  • 抢占式上下文切换icsw(Involuntary Context Switch):指线程因为分配的CPU时间片段用尽而被迫放弃CPU或被其他优先级更高的线程抢占。抢占式上下文切换数量较多时,一般伴随着较多的运行队列、较高的CPU使用率以及较多的线程迁移数等。解决方法可以通过分配特定的处理器组或减少线程数。

上下文切换浪费的时钟周期的计算方式:

让步式上下文切换时钟周期=(csw-icsw)*80000/CPU频率

一般上下文切换的时钟周期代价为80000

2.4.5 监控锁竞争:Linux

使用pidstat命令监控锁竞争,每5秒输出一次上下文切换信息

001250_jimP_3432393.png

结果说明:

cswch/s 每秒的让步式上下文切换

pidsat -w 输出的是所有虚拟处理器的让步式上下切换

计算浪费的时钟周期=53*80000/3300000000=0.12%

通过计算说明当前这个线程的锁竞争情况较少。

 

2.4.7 隔离锁竞争

想要隔离锁竞争,首先要查找竞争锁,Java中通常通过定期转储线程,查找哪些线程因共享锁而被阻塞。

相关工具:Oracle Solaris Studio Performance Analysis、Intel VTune、AMD CodeAnalysis

2.4.9 监控线程迁移

线程迁移:通常CPU调度程序会将线程分配到上次执行它的虚拟处理器上,当被分配的处理器忙时,调度程序会将该线程迁移到其他可用的虚拟处理器。迁移会影响程序性能,主要是因为被分配的虚拟处理器缓存中可能没有线程执行所需要的数据和状态信息

2.5 网络I/O使用率

2.5.2 监控网络I/O使用率:Linux

nicstat 命令的使用

每5秒输出一次所有网络接口io情况

nicstat 5

175812_gDXD_3432393.png

输出制定网络接口设备的I/O情况

nicstat -i enp3s0 1

180034_bqiH_3432393.png

输出结果解释

  • Int:网络接口设备名
  • rKB/s:每秒读取的kb数
  • wKB/s:每秒写入的kb数
  • rPk/s:每秒读取的包数
  • wPk/s:每秒写入的包数
  • rAvs:每秒读取的平均字节
  • wAvs:每秒写入的平均字节数
  • %Util:网络接口使用率
  • Sat:饱和度

linux 上更多网络工具介绍

分类名称简介
监控总体带宽使用nload 
 bmon 
 slurm 
 bwm-ng 
 cbm 
 speedometer 
 netload 
监控总体带宽使用(批量式输出)vnstat 
 ifstat 
 dstat 
 collectl 
每个套接字连接的带宽使用iftopiftop可测量通过每一个套接字连接传输的数据;它采用的工作方式有别于nload。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。
 iptraf 
 tcptrack 
 pktstat 
 netwatch 
 trafshow 
每个进程的带宽使用nethogs 

 

2.5.4 应用性能改进的考虑

问题1:单次读写数据量小而网络读写量大的应用会消耗大量的系统态CPU,产生大量的系统调用。

  • 减少网络读写的系统调用
  • 使用非阻塞的Java NIO
  • 减少处理请求和发送响应的线程数
  • 不建议使用原生的JavaNIO接口,而是使用Java NIO 框架,例如 netty

 

2.6 磁盘I/O使用率

使用iostat 查看每个磁盘的磁盘使用率和cpu情况

iostat -xc 

184843_NJyz_3432393.png

每5秒报告一次磁盘使用情况和cpu情况

iostat -xc 5

每2秒报告一次磁盘使用情况和cpu情况

iostat -xm 2

185345_U7pD_3432393.png

监控结果详解

r/s 每秒读请求次数

w/s 每秒写请求次数

rkB/s 这个指标跟vmstat的bi值通常应该是很接近的

wkB/s 这个指标跟vmstat的bo值通常应该是很接近的

avgrq-sz 每个请求平均大小,单位是扇区数,一般在200~400之间算是正常和理想的状态,如果这个值比较小,比方说只在100左右,说明太多的IO请求没有被合并,或者大的IO请求被“打散”,在写操作时,过多小的请求会造成磁盘磁头的频繁移动,降低IO性能。

avgqu-sz 平均请求队列长度,这个值在正常的系统中不应超过113太多,如果在200左右,甚至上千那说明发生了IO拥塞,而系统还在向IO请求队列中放请求(有一个例外是在执行sync,fsync操作时,该值到达最大值8192是正常的)

await 单位是毫秒,不应超过两位数,几百甚至上千都是不可接受的。

%util 尽可能的让该值达到100%,否则说明IO能力没有完全被利用。

 

linux使用iotop查看i/o情况

190043_HUL1_3432393.png

iotop命令在较低版本内核的linux上没有安装,需要单独安装

 

改进系统I/O的策略

  • 更换更快的设备
  • 文件系统扩展到多个磁盘
  • 操作系统调优使得可以缓存大量的文件系统数据结构
  • 使用带缓存的输入输出流操作文件,减少磁盘交互,减少操作系统调用次数
  • 开启磁盘缓存(意外的电源故障可能造成数据损坏)

 

 

附件1:vmstat 监控结果详解

231351_LNL0_3432393.png

  • proces:第一列显示的是运行队列中轻量级进程的实际数量。
    • r:表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
    • b:表示阻塞的进程数量
  • memeory:内存使用情况
    • swpd:虚拟内存使用情况,如果大于0,则表示机器物理内存不足,需要升级物理内存,内存溢出的情况例外
    • free:表示当前的空闲内存
    • buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
    • cache:cache直接用来记忆我们打开的文件,给文件做缓冲,这样可以提高程序执行的性能
  • swap:交换空间(虚拟内存)使用情况
    • si:每秒从交换分区写入内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程。单位是字节。
    • so:表示每秒从内存写入交换分区的大小,单位是字节
  • io:块设备io情况
    • bi:表示块设备每秒接收的块数量,这里的块设备可以是磁盘也可以是其他块设备,默认块大小是1024byte
    • bo:表示每发送的块数量,如读取文件
  • system:系统状态
    • in:每秒CPU的中断次数,包括时间中断
    • cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
  • cpu:cpu的使用情况
    • us:用户CPU时间
    • sy:系统CPU时间,如果太高,表示系统调用时间长,例如IO操作频繁。
    • id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
    • wa:等待io cpu时间,Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

附件2:5状态进程模型

184612_LsJY_3432393.png

184646_8pkW_3432393.png

参考文章:

深入理解内存(3):内存交换技术,虚拟内存:http://blog.csdn.net/weiwenhp/article/details/8507207

 

操作系统核心原理-1.操作系统导论:http://www.cnblogs.com/edisonchou/p/4996163.html

操作系统核心原理-2.一些基本概念:http://www.cnblogs.com/edisonchou/p/4999362.html

转载于:https://my.oschina.net/u/3432393/blog/880902

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值