您现在的位置是:首页 >学无止境 >Linux系统运行时参数命令(性能监控、测试)(1)监控工具、CPU上下文切换、CPU性能监控网站首页学无止境

Linux系统运行时参数命令(性能监控、测试)(1)监控工具、CPU上下文切换、CPU性能监控

Polymer to C++ 2024-10-03 00:01:02
简介Linux系统运行时参数命令(性能监控、测试)(1)监控工具、CPU上下文切换、CPU性能监控


主要分为四大块:CPU,内存,磁盘,网络

1. 监控工具

  • free
  • ping
  • vmstat(VirtualMemoryStatistics)虚拟内存统计,是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。
  • iostat 用于报告中央处理器(CPU)的统计信息和整个系统、适配器、tty设备、磁盘和CD-ROM的输入/输出统计信息
  • dstat 显示了cpu的使用情况,磁盘io情况,网络发包情况和换页情况,输出是彩色的,可读性较强,相对于vmstat和iostat的输入更加详细且较为直观
  • pidstat 主要用于监控全部或指定进程占用系统资源的情况,如CPU、内存、设备IO、任务切换、线程等
  • top 汇总区域显示了五个方面的系统信息性能:
  1. 负载:时间,登录用户数,系统平均负载
  2. 进程状态:运行(R),睡眠(S),停止(T),僵尸(Z)
  3. cpu使用率:用户态,内核态,NICE,空闲,等待IO,中断等
  4. 内存使用:总量,已用,空闲(系统角度),缓冲区,缓存
  5. 交换分区:总量,已用,空闲
  • iotop Linux进程实时监控工具,界面风格类似top命令
  • htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses
  • mpstat Report process related statistics. 报告CPU的统计信息
  • netstat 用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况
  1. netstat -npl可以查看你要打开的端口是否已经打开
  2. netstat -rn打印路由表信息
  3. netstat -in提供系统上的接口信息,打印每个接口的MTU,输入分组数,输入错误,输出分组数,输出错误,冲突以及当前的输出队列的长度
  • ps 显示当前进程的状态
  • strace Trace system call and signals。跟踪程序执行过程中产生的系统调用及收到的信号,帮助分析程序或命令执行中遇到的异常情况
  • ltrace A library call tracer 跟踪进程调用库函数的情况
  • uptime 能够打印系统总共运行了多长时间和系统的平均负载,uptime命令最后输出的三个数字的含义分别是1分钟,5分钟,15分钟内系统的平均负荷
  • lsof (list open file)是一个列出当前系统打开文件的工具
  • perf 是Linux kernel自带的系统性能优化工具。优势在于与Linux kernel的紧密结合,它可以最先应用到加入kernel的new feature,用于查看热点函数,查看cache miss的比率,从而帮助开发者来优化程序性能
  • tcpdump能够动态抓取正在进行的网络通讯
  • sar
  • blktrace

(1)Linux observability tools | Linux 性能观测工具
在这里插入图片描述

(2)Linux benchmarking tools | Linux 性能测评工具
在这里插入图片描述
(3)Linux tuning tools | Linux 性能调优工具
在这里插入图片描述
是一款性能调优工具,主要是从linux内核源码层进行的调优

(4)Linux observability sar | linux性能观测工具
在这里插入图片描述
sar(System Activity Reporter系统活动情况报告)是目前LINUX上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等方面。

sar的常归使用方式:sar [options] [-A] [-o file] t [n]
其中:
t为采样间隔,n为采样次数,默认值是1;
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名,options 为命令行选项。

想要更深的了解可以点击 【性能测试】Linux性能监控命令——sar详解

2. CPU性能监控

2.1 平均负载和CPU使用率

2.1.1 平均负载基础

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系。

  • 可运行状态的进程,是指正在使用CPU或者正在等待CPU的进程,也就是我们常用ps命令看到的,处在R状态(Running和Runable)的进程
  • 不可中断状态的进程是正处于内核态关键流程中的进程,并且这些进程是不可打断的,比如最常见的是等待硬件设备的I/O响应,也就是我们在ps命令中看到的D状态(Uninterruptible Sleep,也称为Disk Sleep)

平均负载其实就是平均活跃进程数。平均活跃进程数,直观上的理解就是单位时间内的活跃进程数。

2.1.2 使用uptime命令分析平均负载

查看机器的启动时间、登录用户、平均负载等情况,通常用于在线上应急 或者技术攻关中,确定操作系统的重启时间。

  1. 负载说明(针对单核情况,不是单核时则乘上核心数)
  • load < 1:没有等待
  • load == 1 :系统已无额外的资源跑更多的进程了
  • load > 1 :进程需要等待资源而阻塞住了
  1. 注意
  • load < 0.7时:系统很闲,要考虑多部署一些服务
  • 0.7 < load < 1.0时:系统状态不错
  • load == 1时:系统马上要处理不过来了,赶紧找一下原因
  • load > 5时,系统已经非常繁忙了
  1. 不同load值说明的问题
  • 1分钟load > 5,5分钟load < 3,15分钟load < 1
    短期内繁忙,中长期空闲,初步判断是一个抖动或者是拥塞前兆
  • 1分钟load > 5,5分钟load > 3,15分钟load < 1
    短期内繁忙,中长期紧张,很可能是一个拥塞的开始
  • 1分钟load > 5,5分钟load > 5,15分钟load > 5
    短中长期都繁忙,系统正在拥塞
  • 1分钟load < 1,5分钟load > 3,15分钟load > 5
    短期内空闲,中长期繁忙,不用紧张,系统拥塞正在好转

举个例子,假设我们在一个单CPU单核的系统上看到平均负载为1.73(1分钟),0.60(5分钟),7.98(15分钟),那么说明在过去的1分钟内,系统有73%的超载;在15分钟内,有698%的超载,从整体趋势来看,系统的负载正在降低。

2.1.3 平均负荷和CPU使用率

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程。
CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定会完全对应。比如:

  • CPU密集型进程,进程大部分时间在使用CPU进行计算,此时这两者是一致的;
  • I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高
  • 大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也比较高。

2.2 CPU上下文切换

2.2.1 什么是CPU上下文切换

所谓的上下文切换,就是把上一个任务的寄存器和计数器信息保存下来,然后加载新任务的寄存器和计数器信息,最后跳转到新任务的位置开始执行新任务。
根据任务的不同,CPU的上下文切换就可以分为几个不同的场景:进程上下文切换、线程上下文切换、中断上下文切换。

2.2.2 有哪些上下文切换

  1. 系统调用上下文切换
  • linux进程既可以在用户空间运行,又可以在内核空间运行
  • 当它在用户空间运行时,被称为进程的用户态;当它进入内核空间运行时,被称为进程的内核态。
  • 用户使用系统调用时,会发生从用户态到内核态的转变
  • CPU寄存器里原本存储的是用户态的指令。但是为了执行内核代码,需要先把用户态指令的执行位置保存起来,然后寄存器更新为内核态指令的新位置。最后跳转到内核态执行内核任务。
  • 当系统调用结束后,CPU寄存器需要恢复原来保存的用户态位置,然后再切换到用户空间,继续执行下面的指令。因此,一次系统掉用产生了两次的CPU上下文切换
  • 系统调用过程中对用户态的资源没有任何影响,也不会切换进程,所以也成为特权模式切换
  1. 进程上下文切换
  • 进程是由内核来管理和调度的,所以进程的切换只发生在内核态。进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态信息
  • 进程的上下文切换在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存、栈等保存下来。
  • 而加载了下一进程的内核态后再刷新进程的虚拟内存映射关系和用户栈,刷新虚拟内存映射就涉及到TLB快表(虚拟地址缓存),因此会影响内存的访问速度
  • 单次进程上下文的CPU切换时间在几十纳秒到数微秒之间。特别是在进程上下文切换次数较多的情况下,很容易导致CPU将大量时间耗费在寄存器、内核栈以及虚拟内存等资源的保存和恢复上,进而影响CPU的实际使用效率。

进程上下文切换的原因:

  • 其一,为了保证所有进程可以得到公平的调度,CPU时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其他就绪的进程运行。(被动切换
  • 其二,进程在系统资源不足的时候,也会被挂起,并由系统调度其他进程继续运行。(主动切换
  • 其三,当进程通过睡眠函数sleep这样的方式将自己主动挂起时,也会重新调度其他的进程继续运行。
  • 其四,当有优先级更高的进程需要运行时,为了保证高优先级进程先执行,当前进程会被挂起,由高优先级进程先运行。
  • 其五,当发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序。
  1. 线程上下文切换
    线程与进程的区别在于:线程是调度的基本单位,而进程是系统分配资源的基本单位。内核中的任务调度,实际调度的是线程(执行流);而进程只是给线程提供了虚拟地址空间、全局变量等资源。
  • 当一个进程只有一个线程时,可以认为进程就等于线程
  • 当一个进程拥有多个线程时,共享虚拟地址空间和全局变量等资源。这些资源在同一进程内的线程切换时不需要修改,在不同进程的线程间进行切换时,因为资源不共享,所以切换过程和进程上下文切换是一样的
  • 线程也有自己的私有数据,比如线程私有栈和寄存器等,这些在切换时需要保存起来
  1. 中断上下文切换
    为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而转向中断处理程序,响应设备事件。在中断结束后,进程通过保存的上下文信息和程序计数器,又可以恢复先前的执行状态。
    跟进程的上下文不同,中断上下文并不涉及到用户态。中断上下文只包括内核态中中断服务程序执行所必需的状态,包括CPU寄存器、内核堆栈、硬件中断参数等。

2.2.3 怎么查看上下文切换

vmstat

查询系统的上下文切换情况。此命令显示关于内核线程、虚拟内存、磁盘I/O和CPU占用率的统计信息
vmstat的常规用法:vmstat [interval] [times],每隔interval秒采样一次,共采样times次,如果省略times,则一直采集数据,直到用户手动停止(ctrl+c)为止。
第一行显示了系统自启动以来的平均值,第二行开始显示现在正在发生的情况,接下来的行会显示每5秒间隔发生了什么,每一列的含义在头部,如下所示:
在这里插入图片描述

  1. procsr列 (Running or Runable)是就绪队列的长度,显示了有多少进程在等待cpu,b列(blocked)显示多少进程正处于不可中断的休眠状态(等待IO)。
  2. memoryswpd列显示了多少块被换出了磁盘(页面交换),free列显示了多少块是空闲的(未被使用),buff列是I/O系统存储的磁盘块文件的元数据的统计信息,cache列是操作系统用来缓存磁盘数据的,操作系统会自动调节这一参数,在内存紧张时会减少cache的占用空间来保证其他进程对内存的使用。
  3. swap:显示交换活动:每秒有多少块正在被换入(从磁盘)和换出(到磁盘)。si和so较大时,说明系统频繁使用交换区,应该查看操作系统的内存是否够用
  4. io:显示了多少块从块设备读取(bi)写出(bo),通常反映了硬盘I/O。
  5. system:显示每秒中断(in)上下文切换(cs) 的数量。
  6. cpu:显示所有的cpu时间花费在各类操作的百分比,包括执行用户代码(us),执行系统代码(sy),空闲(id)以及等待IO(wa)。
  7. 内存不足的表现:free memory急剧减少,回收buffer和cacher也无济于事,大量使用交换分区(swpd),页面交换(swap)频繁,读写磁盘数量(io)增多,缺页中断(in)增多,上下文切换(cs)次数增多,等待IO的进程数(b)增多,大量CPU时间用于等待IO(wa)

2.3 遇到CPU使用率高该如何排查

遇到CPU使用率高时,首先确认CPU消耗是在哪一块,如果是内核态占用CPU较高:

  1. %iowait高,这是要重点关注磁盘IO的相关操作,是否存在不合理的写日志操作,数据库操作等;
  2. %soft或%cs高,观察CPU负载是否较高、网卡流量是否较大,可不可以精简数据、代码是否在多线程操作上存在不合理的中断等;
  3. %steal高,这种情况一般发生在虚拟机上,这时要查看宿主机是否资源超限;

如果是用户态占用CPU较高,且没有达到预期的性能,说明应用程序需要优化。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。