- CPU 性能统计信息
- 运行队列统计
- 上下文切换
- 中断
- CPU 使用率
- CPU性能工具
- vmstat(虚拟内存统计)
- CPU 性能相关的选项
- 用法示列
- top
- CPU 性能相关的选项
- procinfo(从/proc 文件系统显示信息)
- CPU 性能相关的选项
- mpstat(多处理器统计)
- CPU 性能相关选项
- 用法示列
- sar(系统活动报告)
- CPU 性能相关的选项
- 用法示例
工具是追踪性能问题时的第一道防线。它们能展示整个系统的性能情况和哪些部分表现不好。现在我们将学习这些工具可以测量的统计信息,以及如何使用各种工具收集这些统计结果。学习完成后,我们将能够:
- 理解系统级性能的基本指标,包括CPU的使用情况。
- 明白哪些工具可以检索这些系统性能指标。
每一种系统级 Linux 性能工具都提供了不同的方式来提取相似的统计结果。虽然没有工具显示全部的信息,但是有些工具显示的是相同的统计信息。为了不多次(每种工具一次)解释统计信息的含义,在描述所有工具之前对这些信息进行一次性说明。
运行队列统计在 Linux中,一个进程要么是可运行的,要么是阻塞的(正在等待一个事件的完成)。阻塞进程可能在等待的是从I/O 设备来的数据,或者是系统调用的结果。如果进程是可运行的,那就意味着它要和其他也是可运行的进程竞争 CPU 时间。一个可运行的进程不一定会使用 CPU,但是当 Llinux 调度器决定下一个要运行的进程时,它会从可运行进程队列中挑选。如果进程是可运行的,同时又在等待使用处理器,这些进程就构成了运行队列。运行队列越长,处于等待状态的进程就越多。
性能工具通常会给出可运行的进程个数和等待 I/O 的阻塞进程个数。另一种常见的系统统计是平均负载**。系统的负载是指正在运行和可运行的进程总数**。例如,如果正在运行的进程为两个,而可运行的进程为三个,那么系统负载就是5。平均负载是给定时间内的负载量。一般情况下,取平均负载的时间为1分钟、5分钟和15分钟。这能让我们观察到负载是如何随时间变化的。
上下文切换大部分现代处理器一次只能运行一个进程或线程。虽然有些处理器(比如超线程处理器)实际上可以同时运行多个进程,但是Linux 会把它们看作多个单线程处理器。如果要制造出给定单处理器同时运行多个任务的假像,Linux内核就要不断地在不同进程间切换。这种不同进程间的切换称为上下文切换,因为当其发生时,CPU 要保持旧进程的所有上下文信息,并取出新进程的所有上下文信息。上下文中包含了 Linux 跟踪新进程的大量信息,其中包括:进程正在执行的指令,分配给进程的内存,进程打开的文件等。这些上下文切换涉及大量信息的移动,因此上下文切换的开销可以是相当大的。尽量减少上下文切换的次数是个好办法。
要避免上下文切换,重要的一点是了解它们是如何发生的。首先,上下文切换可以是内核调度的结果。为了保证公平地给每个进程分配处理器时间,内核周期性地中断正在运行的进程,在适当的情况下,内核调度器会决定开始另一个进程,而不是让当前进程继续执行。每次这种周期性中断或定时发生时,系统都可能进行上下文切换。每秒定时中断的次数与架构和内核版本有关。一个检查中断频率的简单方式是用/proc/interrupts 文件,它可以确定已知时长内发生的中断次数。如下所示:
[root@webim-service-mq ~]# cat /proc/interrupts | grep timer; sleep 10; cat /proc/interrupts | grep timer 0: 10 0 0 0 IO-APIC 2-edge timer LOC: 1935437764 2030513501 1868254470 2312543510 Local timer interrupts HVS: 0 0 0 0 Hyper-V stimer0 interrupts 0: 10 0 0 0 IO-APIC 2-edge timer LOC: 1935441001 2030516114 1868257784 2312545679 Local timer interrupts HVS: 0 0 0 0 Hyper-V stimer0 interrupts
在上面,我们要求内核给出定时器启动的次数,等待10秒后,再次请求。这就是,在这台机器上定时器启动频率为(19 354 410 01 - 19 354 377 64)中断 / (10 ) 是323次中断/秒。如果上下文的切换明细多于定时器中断(也就是高于19 354 410 01 - 19 354 377 64),那么这些切换极有可能是由 I/O 请求或其他长时间运行的系统调用(如休眠)造成的。当应用请求的 *** 作不能立即完成时,内核启动该 *** 作,保存进程,并尝试切换到另一个已就绪进程。这能让处理器尽量保持忙状态。
中断此外,处理器还周期性地从硬件设备接收中断。当设备有事件需要内核处理时,它通常就会触发这些中断。比如,如果磁盘控制器刚刚完成从驱动器取数据块的 *** 作,并准备好提供给内核,那么磁盘控制器就会触发一个中断。对内核收到的每个中断,如果已经有相应的已注册的中断处理程序,就运行该程序,否则将忽略这个中断。这些中断处理程序在系统中具有很高的运行优先级,并且通常执行速度也很快。有时,中断处理程序有工作要做,但是又不需要高优先级,因此它可以启动 “下半部”(bottom half),也就是所谓的软中断处理程序。如果有很多中断,内核会花大量的世界服务这些中断。查看 /proc/inerrupts文件可以显示出哪些 CPU 上触发了哪些中断。
CPU 使用率CPU 使用率是个简单的概念。在任何给定的时间,CPU 可以执行7件事情中的一个:
-
CPU 可以是空闲的,这意味着处理器实际上没有做任何工作,并且等待有任何可以执行。
-
CPU 可以运行用户代码,即指定的 “用户” 时间。
-
CPU 可以执行 Linux 内核中的应用程序代码,这就是“系统”时间。
-
CPU 可以执行 “比较友好” 的或者优先级被设置为低于一般进程的用户代码。
-
CPU 可以处于 iowait 状态,即系统正在等待 I/O (如磁盘或网络)完成。
-
CPU 可以处于 irq 状态,即它正在用高优先级代码处理硬件中断。
-
CPU 可以处于 siftirq模式,即系统正在执行同样由中断触发的内核代码,只不过其运行于较低优先级(下半部代码).
此情景出现的条件为:发生设备中断时,而内核将其移交给用户空间之前必须对其进行一些处理(比如,处理网络包)大多数性能工具将这些数值表示为占 CPU 总时间的百分比。这些时间的范围从0% 到 100%,但全部这三项加起来等于100%。一个具有高“系统”百分比的系统表明其大部分时间都消耗在了内核上。像 oprofile 一样的工具可以帮助确定时间都消耗在了哪里。具有高“用户”时间的系统则将其大部分时间都用来运行应用程序。
vmstat 是指虚拟内存统计,这个名称表明它能告诉我们系统的内存性能信息。幸运的是,它实际上能完成的工作不止于此。vmstat是一个很有用的命令,它能获取整个系统性能的粗略信息,包括:
- 正在运行的进程个数。
- CPU 的使用情况。
- CPU 接收的中断个数。
- 调度器执行的上下文切换次数。
它是用于获取性能大致信息的极好工具。
CPU 性能相关的选项vmstat 可以被如下命令行调用:
vmstat [-n] [-s] [delay [count]]
vmstat 运行于两种模式:采样模式和平均模式。如果不指定参数,则vmstat 统计运行于平均模式下,vmstat 显示从系统启动以来所有统计数据的均值。但是,如果指定了延迟,那么第一个采样仍然是系统启动以来的均值,但之后 vmstat 按延迟采样系统并显示系统统计数据。下表解释了 vmstat 的选项。
vmstat 命令行选项
vmstat 提供的各种统计输出信息,使我们能跟踪系统的不同方面。下表解释了与 CPU 性能相关的输出。
与 CPU 相关的 vmstat 输出
vmstat 提供了一个低开销的良好系统性能视图。由于所有的性能统计数据都以文本形式呈现,并打印输出,因此,捕捉测试中生成的数据,以及之后对其进行处理和绘图就会很方便。由于vmstat的开销如此之低,因此当我们需要一目了然地监控系统监控状况时,让它在控制台上或窗口中持续运行,甚至是在负载非常重的服务器上很实用的。
用法示列如果vmstat 运行时没有使用命令行参数,显示的将是自动启动后它记录下的统计信息的均值。根据 “CPU 使用率” 列下面的us、sy、wa和id,本例显示出系统从启动开始,基本上处于空闲状态。从启动开始,CPU 有4%(us)的时间用于执行用户应用程序代码,1%(sy)的时间执行系统代码,而其余95%(id)的时间处于空闲状态。
[root@web1 ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 222288 236304 1897140 0 0 4 772 1 1 4 1 95 0 0
尽管 vmstat 从系统启动时开始统计有助于确定系统的负载情况,但是,vmstat 最有用的是运行于采样模式下,如下面命令所示。在采样模式下,vmstat 间隔 delay 参数指定的秒数输出系统统计数据,而采样次数由 count给出。下面第一行的统计数据和上面输出的一样,是系统启动以来的均值,但之后就是定期采样。本例展示出系统的活动非常少。通过查看b列下面的0,我们可以知道在运行时没有阻塞进程。通过 r 列,我们还可以看到在vmstat采样数据时,正在运行的进程数量少于1。
[root@web1 ~]# vmstat 2 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 216916 236804 1901740 0 0 4 772 1 0 4 1 95 0 0 0 0 0 217452 236804 1901780 0 0 0 10 945 1610 0 0 100 0 0 0 0 0 217452 236804 1901996 0 0 0 2 1212 1794 2 1 98 0 0 0 0 0 217252 236804 1902080 0 0 0 6 984 1664 1 0 99 0 0 0 0 0 212912 236808 1902376 0 0 0 10 1333 1946 2 0 98 0 0
vmstat 是一种记录系统在一定负载或测试条件下行为的好方法。可以用 vmstat显示系统的行为,同时利用 Linux 的tee命令将结果输出到文件。如果只传递了参数 delay,vmstat就无限采样。在测试开始前启动 vmstat,测试结束后终止 vmstat。输出文件的形式可以是表格,并能够用于查看系统对负载和各种系统事件是如何反应的。下面给出了按照这个方法得到的输出。在这个例子中,我们可以查看到系统发生的中断和上下文切换。在in列和cs列能分别查看到中断和上下文切换的总数。
[root@web1 ~]# vmstat 1 | tee /home/output procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 1 0 200016 237340 1920316 0 0 4 772 0 0 4 1 95 0 0 0 0 0 199768 237468 1920396 0 0 128 0 987 1667 1 0 99 0 0 0 0 0 199768 237472 1920396 0 0 0 40 844 1551 0 1 99 0 0 0 0 0 200768 237472 1920400 0 0 0 0 890 1578 0 0 99 0 0 0 0 0 201908 237472 1920436 0 0 0 0 1187 1775 2 0 98 0 0 0 0 0 196420 237472 1920556 0 0 0 0 995 1717 1 0 99 0 0 0 0 0 196420 237476 1920596 0 0 0 44 832 1551 1 0 100 0 0 0 0 0 190888 237480 1920740 0 0 0 40 1638 2253 10 5 86 1 0 0 0 0 191648 237480 1920728 0 0 0 0 937 1592 1 0 100 0 0 0 0 0 192124 237480 1920764 0 0 0 0 994 1656 1 0 99 0 0 0 0 0 192652 237480 1920984 0 0 0 0 1237 1808 1 1 99 0 0
vmstat 甚至可以抽取各种统计数据更详细的信息,如下所示,现在来看 CPU 的统计信息。第一组数据,即 “CPU ticks”,显示的是自系统启动的 CPU 时间,这里的 “tick” 是一个时间单位。虽然精简的 vmstat 输出仅显示四个 CPU 状态——us、sy、id和wa,这里则显示了全部CPU ticks的分布情况。此外,我们还可以看到中断和上下文切换的总数。forks,它表示的是从系统启动开始,已经创建的新进程的数量。
[root@web1 ~]# vmstat -s 3733576 K total memory 1379900 K used memory 2038516 K active memory 1134608 K inactive memory 189336 K free memory 237772 K buffer memory 1926568 K swap cache 0 K total swap 0 K used swap 0 K free swap **124454312 non-nice user cpu ticks** **2825253 nice user cpu ticks** **20589294 system cpu ticks** **2837811966 idle cpu ticks** **373677 IO-wait cpu ticks** **0 IRQ cpu ticks** **4637515 softirq cpu ticks** **0 stolen cpu ticks** 119936227 pages paged in 23090840788 pages paged out 0 pages swapped in 0 pages swapped out **774353928 interrupts** **174242040 CPU context switches** 1619503864 boot time **25287224 forks**
vmstat 提供了关于Linux系统性能的众多信息。在调查系统问题时,它是核心工具之一。
toptop 是 Linux 系统监控工具中的利刃。它善于将相当多的系统整体性能信息方在一个屏幕上。显示内容还能以交互的方式进行改变,因此,在系统运行时,如果一个特定的问题不断突显,可以修改top显示的信息。
默认情况下,top表现为一个将占用 CPU 最多的进程按降序排列的列表。这使得我们能够迅速找出哪个程序独占了 CPU。top 根据指定的延迟定期更新这个列表(其初始化值为3秒)。
CPU 性能相关的选项top 用如下命令行调用:
top [-d delay] [-i] [n iter] [-b]
top 实际上有两种模式的选项:命令行选项和运行时选项。命令行选项决定 top 如何显示其信息。下表给出的命令行选项会影响 top 显示的性能统计信息的类型和频率。
top 命令行选项
在允许top时,为了调查特定问题,我们可能想要对我们的观察略作调整。top输出的可定制性很高。下表给出的选项可以在 top 运行期间修改显示的统计信息:
top运行时选项
下表给出的选项打开或关闭各种系统级信息的显示。关闭不需要统计信息有助于在屏幕显示更多进程。
top 运行时输出切换选项
下表对 top 支持的不同排序模式进行了说明。按内存消耗量排序尤其有用,它能找出哪个进程消耗了最多的内存。
top 输出排序 / 显示选项
top 性能统计信息
top 提供了不同的正在运行进程的大量信息,是找出资源消耗大户的好方法。
procinfo(从/proc 文件系统显示信息)就像vmstat一样,procinfo 为系统整体信息提供总览。尽管它提供的有些信息与vmstat相同,但它还会给出 CPU 从每个设备接收的中断数量。其输出格式的易读性比 vmstat 稍微强一点,但却会占用更多的屏幕空间。
CPU 性能相关的选项procinfo 的调用命令行如下:
procinfo [-f] [-d] [-D] [-n sec] [-f file]
下表描述了不同的选项,用于修改procinfo显示样本的输出和评率。
procinfo 命令行选项
procinfo CPU 统计信息
和vmstat已经top一下,procinfo是一个低开销的命令,适合让其自行在控制台或屏幕窗口运行。它能够很好地反映系统的健康和性能。
mpstat(多处理器统计)mpstat 是一个简单的命令,向我们展示随着时间变化的 CPU 行为。mpstat 最大的优势点是在统计信息的旁边显示时间,由此,我们可以找出 CPU 使用率与时间的关系。
如果有多个 CPU 或 超线程 CPU,mpstat 还能够把 CPU 使用率按处理器进行区分,因此我们可以发现与其他处理器相比,是否某个处理器做了更多的工作。可以选择想要监控的单个处理器,也可以要求 mpstat 对所有的处理器都进行监控。
CPU 性能相关选项mpstat 可以用如下命令行调用:
mpstat [-P {cpu | ALL } ] [delay [count]]
和之前一样,delay指定了采样间隔,count指定了采样次数。下表解释了 mpstat 命令行选项的含义。
mpstat 命令行选项
mpstat 提供与其他 CPU 性能工具相似的信息,但是,它允许将信息按照特定系统中的单个处理器进行分类。下表给出了 mpstat 支持的选项。
mpstat CPU 统计信息
mpstat 是一种很好的工具,可以分类提供每个处理器的执行情况。由于 mpstat 给出了每个 CPU 的明细,因此我们可以识别是否有哪个处理器正逐渐出现超负载情况。
用法示列[root@web1 ~]# mpstat -P ALL 1 2 Linux 4.18.0-147.5.1.el8_1.x86_64 (webim-service-mq) 2021年10月19日 _x86_64_ (4 CPU) 19时48分49秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 19时48分50秒 all 0.00 0.00 0.25 0.00 0.00 0.25 0.00 0.00 0.00 99.50 19时48分50秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 19时48分50秒 1 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 99.00 19时48分50秒 2 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 19时48分50秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 19时48分50秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 19时48分51秒 all 0.25 0.00 0.50 0.00 0.00 0.25 0.00 0.00 0.00 99.00 19时48分51秒 0 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 99.01 19时48分51秒 1 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 19时48分51秒 2 0.98 0.00 0.00 0.00 0.00 0.98 0.00 0.00 0.00 98.04 19时48分51秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 平均时间: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 平均时间: all 0.12 0.00 0.37 0.00 0.00 0.25 0.00 0.00 0.00 99.25 平均时间: 0 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.50 平均时间: 1 0.00 0.00 0.50 0.00 0.00 0.50 0.00 0.00 0.00 99.00 平均时间: 2 0.50 0.00 0.50 0.00 0.00 0.50 0.00 0.00 0.00 98.51 平均时间: 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00sar(系统活动报告)
sar 用另一种方法来收集系统数据。sar能有效地收集到的系统性能数据记录到二进制二级,之后,可以重播这些文件。sar是一种低开、记录系统执行情况信息的方法。
sar 命令可以用于记录性能信息,回放之前的记录信息,以及显示当前系统的实时信息。sar命令的输出可以进行格式,使之易于导入数据库,或是输送给其他Linux命令进行处理。
CPU 性能相关的选项sar 可以使用如下命令行调用:
sar [options] [delay [count] ]
尽管 sar 的报告涉及 Linux 多个不同领域,其统计数据有两种不同的形式。一组统计数据是采样时的瞬时值。另一组则是自上一次采样后的变化值。下表解释了 sar 的命令行选项。
sar 命令行选项
sar 提供的系统级 CPU 性能统计数据集与我们在进程工具中看到的类似(名字不同)。
sar CPU 统计信息
sar最显著的优势之一是,它使你能把不同类型时间戳系统数据保存到日志文件,以便日后检索和审查。当试图找出特定机器在特定时间出现故障的原因时,这个特性被证明是非常遍历的。
用法示例下面的命令要求每秒有三个 CPU 采样,其结果保存到二进制文件。该命令没有任何可视化输出,完成即返回。
[root@web1]# sar -o /home/sar_test 1 3
保存到 /home/sar_test 文件后,我们就能以各种格式显示它。默认格式是可读,如下所示,下面显示与其他系统监控命令类似的信息,我们可以看出处理器在特定时间是如何消耗其时间的。
[root@web1]# sar -f /home/sar_test Linux 4.18.0-147.5.1.el8_1.x86_64 (webim-service-mq) 2021年10月20日 _x86_64_ (4 CPU) 09时58分02秒 CPU %user %nice %system %iowait %steal %idle 09时58分03秒 all 0.25 0.00 0.00 0.00 0.00 99.75 09时58分04秒 all 0.25 0.00 0.50 0.00 0.00 99.25 09时58分05秒 all 0.25 0.00 0.25 0.00 0.00 99.50 平均时间: all 0.25 0.00 0.25 0.00 0.00 99.50
sar,还可以将统计数据输出为一种轻松带入关系数据库的格式,如下所示。这有助于保存大量的性能数据。一旦将其导入到关系数据库,就可以用所有的关系数据库工具对这些性能数据进行分析。
[root@web1]# sar -f /home/sar_test -H Linux 4.18.0-147.5.1.el8_1.x86_64 (webim-service-mq) 2021年10月20日 _x86_64_ (4 CPU) 09时58分02秒 kbhugfree kbhugused %hugused 09时58分03秒 0 0 0.00 09时58分04秒 0 0 0.00 09时58分05秒 0 0 0.00 平均时间: 0 0 0.00
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)