五分钟排查Linux的健康状态

news/2024/5/19 20:59:04/文章来源:https://blog.csdn.net/qq_32727095/article/details/130076860

五分钟排查Linux的健康状态

  • 1. CPU
    • 1.1 top命令
    • 1.2 什么是负载
    • 1.3 vmstat
  • 2. 内存
    • 2.1 观测命令
    • 2.2 CPU缓存
    • 2.3 HugePage
    • 2.4 预先加载
  • 3. I/O
    • 3.1 观测命令
    • 3.2 零拷贝
  • 4. 网络

参考:《Linux运维实战》、xjjdog

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

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

1. CPU

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

1.1 top命令

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

在这里插入图片描述

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分钟的数值。

在这里插入图片描述

如图,以单核操作系统为例,将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命令的一些输出信息。

在这里插入图片描述

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

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

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

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

在这里插入图片描述

2. 内存

2.1 观测命令

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

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

2.2 CPU缓存

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

在这里插入图片描述

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。

在这里插入图片描述

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

2.4 预先加载

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

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

3. I/O

3.1 观测命令

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

详细介绍如下:

  • %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的效率就得到提升。

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

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

4. 网络

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

在这里插入图片描述
当然,我们可以选择性的只看TCP的一些状态。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_96304.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

华为运动健康服务(HUAWEI Health Kit)6.10.0 版本新增的能力有哪些? 阅读本文寻找答案,一起加入运动健康服务生态大家庭! 一、 支持三方应用查询用户测量的连续血糖数据 符合申请Health Kit服务中开发者申请资质要求…

初识掌控板2.0、官方拓展板和配套编程软件mpython

不是广告!!不是广告!! 一、掌控板2.0概览 掌控板又名掌上联网计算机,是一款为青少年学习Python编程和创意制造,特别是物联网应用而设计的开源硬件。内置microPython开源嵌入式Python运行环境,可…

查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。 可能有同学这里就不太理解什么是最优的查询路径了,这个看起来确实很抽象,当然,这个查询优化器的工…

C51单片机串口通信(概念部分)

1.通信的基本概念 1.1:串行通信与并行通信 (1).串行通信 串行通信是指用一根数据线将 一个字节的八个bit位连接,从低位开始依次传输。 优点:成本便宜,传输稳定 缺点:速度慢 并行通信是指将一…

阿里云蔡英华:云智一体,让产业全面迈向智能

4月11日,在2023阿里云峰会上,阿里云智能首席商业官蔡英华表示,算力的飞速发展使数字化成为确定,使智能化成为可能。阿里云将以云计算为基石,以AI为引擎,参与到从数字化迈向智能化的划时代变革中。 基于服务…

第三十天 Maven高级

目录 Maven高级 1. 分模块设计与开发 1.1 介绍 1.2实践 1.3 总结 2. 继承与聚合 2.1 继承 2.2 聚合 2.3 继承与聚合对比 3. 私服 3.1 场景 3.2 介绍 3.3 资源上传与下载 Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中&am…

论文笔记|CVPR2023:Semantic Prompt for Few-Shot Image Recognition

论文地址:https://arxiv.org/pdf/2303.14123.pdf 这是一篇2023年发表在CVPR上的论文,论文题目是Semantic Prompt for Few-Shot Image Recognitio,即用于小样本图像识别的语义提示。 1 Motivation 第一,最近几项研究利用 语义信…

矿泉水为什么会溴酸盐超标

矿泉水为什么会溴酸盐超标? 水生产企业多使用臭氧消毒,不过,水生产企业不存在水运输路途遥远的问题,因此可以使用臭氧消毒。同时,也是因为臭氧在消毒后会直接变成氧气,所以不会有使用氯消毒后的那种味道&a…

我在“Now In Android”中学到的 9 件事

我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序,完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践,旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…

【软考备战·希赛网每日一练】2023年4月11日

文章目录一、今日成绩二、错题总结第一题第二题第三题第四题第五题三、知识查缺题目及解析来源:2023年04月11日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 策略模式:定义一系列算法,把它们一个个封装起来&#…

c++学习之c++对c的扩展1

目录 1.面向过程与面向对象的编程 2.面向对象编程的三大特点 3.c对c的扩展: 1.作用域运算符:: 2.命名空间 1.c命名空间(namespace) 2.命名空间的使用 1.在不同命名空间内可以创建相同的名称 2.命名空间只能在全…

2.30、守护进程(1)

2.30、守护进程(1)1.终端是什么2.进程组是什么3.会话是什么4.进程组、会话、控制终端之间的关系5.进程组、会话操作有哪些函数①pid_t getpgrp(void);②pid_t getpgid(pid_t pid);③int setpgid(pid_t pid, pid_t pgid);④pid_t getsid(pid_t pid);⑥pid…

Java 在循环的try catch中使用continue、break

循环的try catch中使用continue、break。 结论:1. 循环内catch代码端中的的continue、break可以正常生效。 2. 无论是continue还是break,退出循环前都会执行finally中的代码 文章目录代码:情形1(无continue、break)结果…

HTTP协议状态码大全 | 汇总HTTP所有状态码

🔊 HTTP 状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。 HTTP…

有反爬机制就爬不了吗?那是你还不知道反反爬,道高一尺魔高一丈啊

文章目录一、从用户请求的Headers反爬虫二、基于用户行为反爬虫(1)方法1(2)方法2三、动态页面的反爬虫四.总结不知道你们在用爬虫爬数据的时候是否有发现,越来越多的网站都有自己的反爬机制,抓取数据已经不…

300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机

无线耳机是人们日常生活中必不可少的设备,无论是听音乐化石看电影都能获得身临其境的感觉,由于科技真在发展中,不断地的发生变化,百元价位就可以感受到不错的音色,下面小编整理了几款300左右音质表现不错的蓝牙耳机。 …

Git这么香,为啥还要可视化?

一、降低入门门槛 Github Desktop / Sourcetree / TortoiseGit “工欲善其事,必先利其器”,团队项目开发中的高效协作管理非常重要。 对于高级程序员及IT老兵来说,有了Git直接用命令行管理也许就足够了, 但可视化的工具会降低技术…

【pta刷题】小技巧

好久没更了 写天梯模拟L1都有题不能AC&#xff0c;是什么品种的蒟蒻 L1-7 谷歌的招聘 题目详情 - L1-7 谷歌的招聘 (pintia.cn) 自己写半天都是Segmentation Fault&#xff0c; 学习一下几个函数叭// 1.substr&#xff08;&#xff09;函数 获取子串 #include<bits/st…

Distilling Knowledge via Knowledge Review(引言翻译)

翻译得可能不太准确&#xff0c;希望有能力的各位批评指正&#xff01; Introduction 第一段 深度卷积神经网络&#xff08;CNN&#xff09;在计算机视觉多数任务中取得了显著的成功。 然而&#xff0c;卷积网络的成功往往伴随着相当大的计算和内存消耗&#xff0c; 使得将…

企业级信息系统开发讲课笔记2.3 利用MyBatis实现关联查询

文章目录零、本节学习目标一、查询需求&#xff08;一&#xff09;针对三张表关联查询&#xff08;二&#xff09;按班级编号查询班级信息&#xff08;三&#xff09;查询全部班级信息二、创建数据库表&#xff08;一&#xff09;创建教师表&#xff08;二&#xff09;创建班级…