0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何评估CPU、内存以及I/O它们性能的命令

dyquk4xk2p3d 来源:小姐姐味道 作者:小姐姐养的狗 2022-10-24 09:09 次阅读

操作系统作为所有程序的载体,对应用的性能影响是非常重要的。然而计算机各个组件之间的速度,是非常不均衡的。拿CPU和硬盘的速度来说,比兔子和乌龟的速度差别还要大。

下面将简单的介绍CPU、内存、I/O的一些基本知识,以及一些如何评估它们性能的命令。

1.CPU

首先介绍计算机中最重要的计算组件:中央处理器。一般我们可以通过top命令来观测它的性能。

1.1 top命令

top命令可用于观测CPU的一些运行指标。如图,进入top命令之后,按1键即可看到每核CPU的详细状况。

dceef79c-532b-11ed-a3b6-dac502259ad0.png

CPU的使用有多个维度的指标,以下分别说明一下:

us用户态所占用的CPU百分比。

sy内核态所占用的CPU百分比。如果这个值过高,需要配合vmstat命令,查看是否是上下文切换是否频繁。

ni高优先级应用所占用的CPU百分比。

wa等待I/O设备所占用的CPU百分比。如果这个值非常高,输入输出设备可能存在非常明显的瓶颈。

hi硬件中断所占用的CPU百分比。

si软中断所占用的CPU百分比。

st这个一般发生在虚拟机上,指的是虚拟CPU等待实际CPU时间的百分比。如果这个值过大,则你的宿主机压力可能过大。如果你是云主机,则你的服务商可能存在超卖。

id空闲CPU百分比。

一般的,我们比较关注空闲CPU的百分比,它可以从整体上体现CPU的利用情况。

1.2 什么是负载

我们还要评估CPU任务执行的排队情况,这些值就是负载(load)。top命令,显示的CPU负载,分别是最近1分钟、5分钟、15分钟的数值。

dd0b53d8-532b-11ed-a3b6-dac502259ad0.png

如图,以单核操作系统为例,将CPU资源抽象成一条单向行驶的马路。则会发生三种情况:

马路上的车只有4辆,车辆畅通无阻,load大约是0.5。

马路上的车有8辆,正好能首尾相接安全通过,此时load大约为1。

马路上的车有12辆,除了在马路上的8辆车,还有4辆等在马路外面,需要排队。此时load大约为1.5。

那load为1代表的是啥?针对这个问题,误解还是比较多的。

很多同学认为,load达到1,系统就到了瓶颈,这不完全正确。load的值和cpu核数息息相关。举例如下:

单核的负载达到1,总load的值约1。

双核的每核负载都达到1,总load约2。

四核的每核负载都达到1,总load约为4。

所以,对于一个load到了10,却是16核的机器,你的系统还远没有达到负载极限。通过uptime命令,同样能够看到负载情况。

1.3 vmstat

要看CPU的繁忙程度,还可以通过vmstat命令。下面是vmstat命令的一些输出信息

dd3096e8-532b-11ed-a3b6-dac502259ad0.gif

我们比较关注的有下面几列:

b存在于等待队列的内核线程数目,比如等待I/O等。数字过大则cpu太忙。

cs代表上下文切换的数量。如果频繁的进行上下文切换,就需要考虑是否是线程数开的过多。

si/so显示了交换分区的一些使用情况,交换分区对性能的影响比较大,需要格外关注。

$vmstat1
procs---------memory-------------swap-------io-----system--------cpu-----
rbswpdfreebuffcachesisobiboincsussyidwast
3400200889792737085918280005610961300
320020088992073708591860000592132844282981100
320020089011273708591860000095012154991000
32002008895687371259185600048119002459990000
3200200890208737125918600000158984840981100
^C

2.内存

2.1 观测命令

dd3fe8f0-532b-11ed-a3b6-dac502259ad0.png

要想了解内存对性能的一些影响,就需要从操作系统层面来看一下内存的分布。

我们在平常写完代码后,比如写了一个C++程序,如果去查看它的汇编,可以看到其中的内存地址,并不是实际的物理内存地址。

那么应用程序所使用的,就是逻辑内存,这个学过计算机组成结构的同学都有了解。

逻辑地址可以映射到物理内存和虚拟内存上。比如你的物理内存是8GB,分配了16GB的SWAP分区,那么应用可用的总内存就是24GB。

从top命令可以看到几列数据,注意方块括起来的三个区域,解释如下:

dd49e0b2-532b-11ed-a3b6-dac502259ad0.png

VIRT这里就是虚拟内存,一般比较大,不用做过多关注。

RES我们平常关注的就是这一列的数值,它代表了进程实际占用的内存。平常在做监控时,也主要是监控这个数值。

SHR指的是共享内存,比如可以复用的一些so文件等。

2.2 CPU缓存

由于CPU核内存之间的速度差异是非常大的,解决方式就是加入高速缓存。其实,这些高速缓存,往往会有多层,如下图。

dd5c1a3e-532b-11ed-a3b6-dac502259ad0.png

Java有大部分知识点是围绕多线程的,那是因为,如果一个线程的时间片跨越了多个CPU,那么就会存在同步问题。

在Java中,最典型的和CPU缓存相关的知识点,就是并发编程中,针对Cache line的伪共享(false sharing)问题。

伪共享是指:在这些高速缓存中,是以缓存行为单位进行存储的。哪怕你修改了缓存行中一个很小很小的数据,它都会整个的刷新。所以,当多线程修改一些变量的值时,如果这些变量在同一个缓存行里,就会造成频繁刷新,无意中影响彼此的性能。

通过以下命令即可看到当前操作系统的缓存行大小。

cat/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size

通过以下命令可以看到不同层次的缓存大小。

[root@localhost~]#cat/sys/devices/system/cpu/cpu0/cache/index1/size
32K
[root@localhost~]#cat/sys/devices/system/cpu/cpu0/cache/index2/size
256K
[root@localhost~]#cat/sys/devices/system/cpu/cpu0/cache/index3/size
20480K

在JDK8以上的版本,通过开启参数-XX:-RestrictContended,就可以使用注解@sun.misc.Contended进行补齐,来避免伪共享的问题。在并发优化中,我们再详细讲解。

2.3 HugePage

回头看我们最长的那副图,上面有一个叫做TLB的组件,它的速度虽然高,但容量也是有限的。这就意味着,如果物理内存很大,那么映射表的条目将会非常多,会影响CPU的检索效率。

默认内存是以4K的page来管理的。如图,为了减少映射表的条目,可采取的办法只有增加页的尺寸。像这种将Page Size加大的技术,就是Huge Page。

dd69828c-532b-11ed-a3b6-dac502259ad0.png

HugePage有一些副作用,比如竞争加剧,Redis还有专门的研究(https://redis.io/topics/latency) ,但在一些大内存的机器上,开启后会一定程度上增加性能。

2.4 预先加载

另外,一些程序的默认行为,也会对性能有所影响。比如JVM的-XX:+AlwaysPreTouch参数。默认情况下,JVM虽然配置了Xmx、Xms等参数,但它的内存在真正用到时,才会分配。

但如果加上这个参数,JVM就会在启动的时候,把所有的内存预先分配。这样,启动时虽然慢了些,但运行时的性能会增加。

3.I/O

3.1 观测命令

I/O设备可能是计算机里速度最差的组件了。它指的不仅仅是硬盘,还包括外围的所有设备。

硬盘有多慢呢?我们不去探究不同设备的实现细节,直接看它的写入速度(数据未经过严格测试,仅作参考)。

dd760b6a-532b-11ed-a3b6-dac502259ad0.png

可以看到普通磁盘的随机写和顺序写相差是非常大的。而随机写完全和cpu内存不在一个数量级。

缓冲区依然是解决速度差异的唯一工具,在极端情况比如断电等,就产生了太多的不确定性。这些缓冲区,都容易丢。

最能体现I/O繁忙程度的,就是top命令和vmstat命令中的wa%。如果你的应用,写了大量的日志,I/O wait就可能非常的高。

dd7f3bf4-532b-11ed-a3b6-dac502259ad0.png

对于硬盘来说,可以使用iostat命令来查看具体的硬件使用情况。只要%util超过了80%,你的系统基本上就跑不动了。

dd904fa2-532b-11ed-a3b6-dac502259ad0.png

详细介绍如下:

%util最重要的判断参数。一般地,如果该参数是100%表示设备已经接近满负荷运行了

Device表示发生在哪块硬盘。如果你有多快,则会显示多行

avgqu-sz这个值是请求队列的饱和度,也就是平均请求队列的长度。毫无疑问,队列长度越短越好。

await响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间

svctm 表示平均每次设备I/O操作的服务时间。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。

3.2 零拷贝

kafka比较快的一个原因就是使用了zero copy。所谓的Zero copy,就是在操作数据时, 不需要将数据buffer从一个内存区域拷贝到另一个内存区域。因为少了一次内存的拷贝, CPU的效率就得到提升。

我们来看一下它们之间的区别:

dda4dd46-532b-11ed-a3b6-dac502259ad0.png

要想将一个文件的内容通过socket发送出去,传统的方式需要经过以下步骤:

将文件内容拷贝到内核空间。

将内核空间的内容拷贝到用户空间内存,比如Java应用。

用户空间将内容写入到内核空间的缓存中。

socket读取内核缓存中的内容,发送出去。

ddb45618-532b-11ed-a3b6-dac502259ad0.png

零拷贝又多种模式,我们拿sendfile来说明。如上图,在内核的支持下,零拷贝少了一个步骤,那就是内核缓存向用户空间的拷贝。即节省了内存,也节省了CPU的调度时间,效率很高。

4.网络

除了iotop、iostat这些命令外,sar命令可以方便的看到网络运行状况,下面是一个简单的示例,用于描述入网流量和出网流量。

$sar-nDEV1
Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)

1248AMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s%ifutil
1249AMeth018763.005032.0020686.42478.300.000.000.000.00
1249AMlo14.0014.001.361.360.000.000.000.00
1249AMdocker00.000.000.000.000.000.000.000.00

1249AMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s%ifutil
1250AMeth019763.005101.0021999.10482.560.000.000.000.00
1250AMlo20.0020.003.253.250.000.000.000.00
1250AMdocker00.000.000.000.000.000.000.000.00
^C

当然,我们可以选择性的只看TCP的一些状态。

$sar-nTCP,ETCP1
Linux3.13.0-49-generic(titanclusters-xxxxx)07/14/2015_x86_64_(32CPU)

1219AMactive/spassive/siseg/soseg/s
1220AM1.000.0010233.0018846.00

1219AMatmptf/sestres/sretrans/sisegerr/sorsts/s
1220AM0.000.000.000.000.00

1220AMactive/spassive/siseg/soseg/s
1221AM1.000.008359.006039.00

1220AMatmptf/sestres/sretrans/sisegerr/sorsts/s
1221AM0.000.000.000.000.00
^C

5.End

不要寄希望于这些指标,能够立刻帮助我们定位性能问题。这些工具,只能够帮我们大体猜测发生问题的地方,它对性能问题的定位,只是起到辅助作用。想要分析这些bottleneck,需要收集更多的信息。

想要获取更多的性能数据,就不得不借助更加专业的工具,比如基于eBPF的BCC工具,这些牛x的工具我们将在其他文章里展开。读完本文,希望你能够快速的了解Linux的运行状态,对你的系统多一些掌控。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10850

    浏览量

    211514
  • Linux
    +关注

    关注

    87

    文章

    11273

    浏览量

    209263
  • 操作系统
    +关注

    关注

    37

    文章

    6792

    浏览量

    123272

原文标题:61秒,摸透Linux的健康状态!

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    virtio I/O通信流程及设备框架的实现

    virtio 是一种通用的半虚拟化的 I/O 通信协议,提供了一套前后端 I/O 通信的的框架协议和编程接口。根据该协议实现的设备通过前后端的配合,相比全模拟设备可以大幅减少陷入陷出
    的头像 发表于 03-10 13:37 6488次阅读

    UBIFS损耗均衡对系统I/O性能的影响

    分析flash 文件系统的损耗均衡问题,指出损耗均衡的触发条件对系统I/O 性能的影响。在最新UBIFS 文件系统上运行测试程序,结果证明在不同损耗均衡触发条件下,系统I/
    发表于 03-30 10:10 24次下载

    Linux系统中网络I/O性能改进方法的研究

    选择并设计高效的网络I/O模型是改善服务器性能的关键。该文通过对Linux系统中几种网络I/O模型的分析和研究,提出3种改善网络
    发表于 04-09 09:41 28次下载

    基于Linux下的/O端口和I/O内存详解

    端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器
    发表于 06-14 16:42 1218次阅读
    基于Linux下的/<b class='flag-5'>O</b>端口和<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>内存</b>详解

    超全的SPDK性能评估指南

    SPDK采用异步I/O(Asynchronous I/O)加轮询(Polling)的工作模式,通常与Kernel的异步I/
    的头像 发表于 11-26 09:58 8985次阅读

    Linux驱动技术之一:访问I/O内存

    ARM是对内存空间和IO空间统一编址的,所以,通过读写SFR来控制硬件也就变成了通过读写相应的SFR地址来控制硬件。这部分地址也被称为I/O内存
    发表于 05-08 14:33 557次阅读
    Linux驱动技术之一:访问<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>内存</b>

    Linux查看资源使用情况和性能调优常用的命令

    目录 前言 top命令 htop命令 ps命令 free命令 vmstat命令 iosat命令
    的头像 发表于 11-12 17:54 4195次阅读

    • AD5590 – 16路输入/16路输出模拟I/O端口评估工具

    • AD5590 – 16路输入/16路输出模拟I/O端口评估工具
    发表于 03-21 15:41 2次下载
    •	AD5590 – 16路输入/16路输出模拟<b class='flag-5'>I</b>/<b class='flag-5'>O</b>端口<b class='flag-5'>评估</b>工具

    EVAL-ADP5588:ADP5588键盘I/O扩展器评估

    EVAL-ADP5588:ADP5588键盘I/O扩展器评估
    发表于 05-24 16:37 2次下载
    EVAL-ADP5588:ADP5588键盘<b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器<b class='flag-5'>评估</b>板

    单片机I/O控制方式

    单片机如何实现当一个程序在访问一个I/O设备时,而不占用CPU呢?对于这个问题,我们先了解一下单片机I/O设备有哪几种主要的控制方式;程序循
    发表于 12-01 16:21 10次下载
    单片机<b class='flag-5'>I</b>/<b class='flag-5'>O</b>控制方式

    I/O虚拟化及Virtio接口介绍

    I/O虚拟化是计算机虚拟化最复杂的部分,因为涉及到CPU、操作系统、Hypervisor以及I/O
    的头像 发表于 10-26 17:21 4189次阅读

    Linux性能工具分享

    性能工具谱图 * CPU 性能工具 * 内存性能工具 * 磁盘 I/
    的头像 发表于 05-12 10:29 601次阅读
    Linux<b class='flag-5'>性能</b>工具分享

    虚拟化技术—CPU虚拟化

    物理机器是由CPU内存I/O设备等一组资源构成的实体。虚拟机也一样,由虚拟CPU,虚拟内存
    的头像 发表于 06-06 15:47 2131次阅读

    jmap dump内存命令

    空间的详细信息的文件。通过分析堆内存快照,可以帮助我们进行内存泄漏和性能问题的定位和分析,以及优化代码和内存使用。 使用jmap dump
    的头像 发表于 12-05 10:38 3136次阅读

    jvm内存分析命令和工具

    介绍JVM内存分析命令和工具,并详细介绍它们的使用方法和功能。 一、JVM内存分析命令 jps命令
    的头像 发表于 12-05 11:07 1174次阅读