Linux-操作系统常见性能监控指标

一般我们在进行性能分析、优化或调优之前,必不可少要进行性能监控。一种是操作系统的监控,一种是应用层面的监控,本篇讨论在操作系统层面的监控。

那么操作系统常见的性能指标都有哪些?

  • CPU利用率
  • CPU调度运行队列长度
  • 上下文切换
  • 内存使用率
  • 磁盘IO使用率

CPU利用率

在Linux系统上,CPU利用率主要分成两个部分:用户态利用率、系统态利用率

  • 用户态利用率(us) = 执行应用程序代码的时间 / 总cpu时间
  • 系统态利用率(sy) = 执行操作系统调用的时间 / 总cpu时间

怎么查看?
vmstat -w 1
Linux-操作系统常见性能监控指标_第1张图片

mpstat -P ALL 1
Linux-操作系统常见性能监控指标_第2张图片
top
Linux-操作系统常见性能监控指标_第3张图片

为了尽可能的压榨CPU,使用户利用率达到最大化,我们应尽量使操作系统利用率为0%,也就是说应尽量减少应用程序对操作系统的调用,从而相对相对提升应用程序使用CPU的比例,比如:

  • 减少锁竞争。CPU主要消耗在上下文切换。
  • 减少CPU与IO设备交互:
    – 单写改用批写。减少写网络/磁盘IO发生系统调用的次数
    – 多用缓存。减少读网络/磁盘IO发生系统调用的次数
    – 使用NIO框架。比如netty,减少处理请求、发送响应线程数

CPU调度运行队列长度

啥叫CPU调度运行队列?
比如在Java程序中,线程有一个状态叫做就绪,指明该线程已经准备好了,正在等待可用的CPU。而处于该状态的线程,会先在一个所谓的CPU调度运行队列中等待,直到CPU对它们进行调度并执行。

怎么查看?
vmstat -w 1
Linux-操作系统常见性能监控指标_第4张图片
标红部分是运行队列中线程的实际数量。
top
Linux-操作系统常见性能监控指标_第5张图片
标红部分是队列平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
uptime
在这里插入图片描述
同上。

如果这个队列的长度达到或超过虚拟处理器的个数(一般是物理CPU核数,如果带有超线程技术那么就是物理核数*2)的4倍或更多时,说明机器负载很重,处理不过来,需要调优了。
一般的解决办法是:

  • 增加CPU。这个要看老板是否土豪。
  • 分析应用程序CPU使用率,优化算法或数据结构。做同样的事,花的CPU周期更少。

上下文切换

什么是上下文切换?
CPU 执行指令时需要依赖一定的环境,比如寄存器里的操作值、程序计数器指向哪一条指令等,这个依赖的环境就叫CPU上下文。每个线程依赖的环境不同,当CPU调度不同线程时,就会发生上下文切换。

而上下文切换分为两种:

  • 让步式上下文切换(cswch):线程主动释放CPU
  • 抢占式上下文切换(nvcswch):分配给线程的时间片用尽被迫放弃CPU或被其他更高优先级的线程抢占

Java多线程并发度很高的时候,大概率会发生共享资源的竞争,就会涉及对CPU主动释放。也就是说让步式上下文切换这个指标,可侧面说明Java应用存在锁竞争。

怎么查看?
sar -w 1
主机上总的上下文件切换的情况
Linux-操作系统常见性能监控指标_第6张图片

pidstat -wt -I -p {进程ID} 5
每五秒打印某进程每个子线程上下文切换
Linux-操作系统常见性能监控指标_第7张图片
其中TID指每个子线程

内存使用率

操作系统使用虚拟内存或内存页交换时,Java程序会有明显的性能问题。比如Java堆的一部分被置换出去以后,如果发生GC,就需要把原置换出去的部分置换回来以便JVM扫描存活对象,磁盘IO的速度又比内存慢太太多了,显然会增加GC收集的时间。

怎么查看?
vmstat -a

在这里插入图片描述一般free逐渐减少殆尽时,如果开启了允许内存页交换,可观察到swap中的si、so的数值逐渐增加至稳定状态。

free -m
在这里插入图片描述

磁盘IO使用率

不知道有没有人碰到这种情况:偶尔发现Mysql查询特别慢,很烦躁,最后发现是某个哥们跑个程序疯狂怼磁盘,磁盘利用率飙到接近100%,直接想打屎他。

怎么查看?
iostat -xm 5
Linux-操作系统常见性能监控指标_第8张图片

iotop -o
可以找出使用io高的进程
Linux-操作系统常见性能监控指标_第9张图片
一般优化办法:

  • 换固态盘。有钱人不用担心。
  • 扩展多个磁盘。利用多个磁盘的读写能力。
  • 善用缓存。减少对磁盘的读写。

附录-其他查看命令

  • 物理CPU个数
    cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l

  • 每个物理CPU中core的个数(即物理核数)
    cat /proc/cpuinfo| grep “cpu cores”| uniq

  • 逻辑CPU的个数,就是虚拟处理器个数。如果有超线程技术,那么是虚拟处理器个数 = 物理核数 * 2
    cat /proc/cpuinfo| grep “processor”| wc -l

你可能感兴趣的:(Linux)