Linux 问题排查及性能调优

2023-11-04

一.问题场景

1.CPU问题

流量高峰期,服务器 CPU 使用率过高报警,登录 Linux 上去 top 完,进一步定位,是系统 CPU 资源太少,或者程序并发部分有问题。

2.内存问题

系统没有跑吃内存的程序, free 命令之后,发现系统没有内存了,哪里占用了内存。

3.iowait问题

收到 Zabbix 告警发现某台存放监控数据的数据库主机的 iowait 较高。


二.性能优化简介:

  1. 性能优化是个系统工程,总是牵一发而动全身。它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时出问题。

  2. 从资源使用的视角出发,分析各种 Linux 资源可能会碰到的性能问题,包括 CPU 性能、磁盘 I/O 性能、内存性能以及网络性能。
    性能优化的第一步,了解“性能指标”这个概念。

  3. 性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是从应用负载的视角来考察性能,直接影响了产品终端的用户体验。跟它们对应的,是从系统资源的视角出发的指标,比如资源使用率、饱和度等。

  4. 找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。选择指标评估应用程序和系统的性能;为应用程序和系统设置性能目标;进行性能基准测试;性能分析定位瓶颈;优化系统和应用程序;
    如下图
    Linux 性能分析最重要的参考资料之一,在 Linux 不同子系统出现性能问题后,应该用什么样的工具来观测和分析。
    请添加图片描述


三.Linux 问题排查顺序

前言: 监控大盘

有监控的情况下,首先去监控大盘,有没有异常报警,如果初期还没有监控的情况按照下面步骤去系统层面有没有异常

第一步: 平均负载

1、系统的平均负载,使用top或者htop命令查看,平均负载体现的是系统的一个整体情况应该是cpu、内存、磁盘性能的一个综合,一般是平均负载的值大于机器cpu的核数,说明机器资源已经紧张了

第二步: cpu核

2、平均负载高了以后,在top中看cpu每个核的使用情况,如果占比很高,瓶颈是cpu,什么进程导致的

第三步: 内存

3、如果cpu没有问题,看内存,用free去查看内存的是用情况,但不直接看他剩余了多少,还要结合看看cache和buffer,然后再具体是什么进程占用了过高的内存,是用top去排序

第四步: 磁盘

4、内存没有问题的话就要去看磁盘了,磁盘iostat去查看

第五步: 带宽

5、还有就是带宽问题,一般会用iftop去查看流量情况,流量是否超过的机器给定的带宽

第六步: 具体应用

6、涉及到具体应用的话,就要根据具体应用的设定参数来查看,比如连接数是否查过设定值等

第七步: 外部系统

7.如果系统层各个指标查下来都没有发现异常,那么就要考虑外部系统了,比如数据库、缓存、存储等

四.问题排查

1.执行 top 或者 uptime 命令,来了解系统的负载情况

[root@localhost ~]# uptime

如下图
请添加图片描述

内容 含义
14:45:49 当前时间
up 10:44 系统运行时间 格式为时:分
5 users 当前登录用户数
load average: 0.04, 0.03, 0.00 系统负载(平均负载),即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

2.分析平均负载是否合理?

2.1查看CPU核数
[root@localhost ~]# grep 'model name' /proc/cpuinfo |wc -l

请添加图片描述

2.2查看此时的平均负载:
[root@localhost ~]# uptime

请添加图片描述

2.3系统过载 : 平均负载 > cpu核数 × 70%

注意:这里是新新虚拟机不存在过载!!!

2.4工具辅助排查 iostat、mpstat、pidstat

如果过载 使用 iostat、mpstat、pidstat 等工具,找平均负载高的根源 预先安装 stress 和 sysstat 包

**备注说明:**stress 是一个Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景

顺序安装===》

[root@localhost ~]# yum install -y epel-release

[root@localhost ~]# yum install stress -y

[root@localhost ~]# yum install sysstat -y
mpstat 简介

mpstat :是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。

pidstat 简介

pidstat :pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。


五.模拟场景

场景一 : CPU密集型进程

模拟一个 CPU 使用率 100% 的场景

[root@localhost ~]# stress --cpu 1 --timeout 600

查看实时负载监控 平均负载会逐渐升高

[root@localhost ~]# watch -d uptime

请添加图片描述
监控所有 CPU 间隔5秒输出1次

[root@localhost ~]#  mpstat -P ALL 5

如下图
请添加图片描述

到底是哪个进程导致了 CPU 使用率为 100% 呢?你可以使用 pidstat 来查询

[root@localhost ~]# pidstat -u 5 1

如下图

stress的进程的CPU使用率为1
请添加图片描述
分析: stress的 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 stress CPU 使用率为 100% 。

场景二 : I/O密集型进程

模拟一个iowait 100%的场景

[root@localhost ~]# stress -i 1 --timeout 600

查看实时负载监控 平均负载会逐渐升高

[root@localhost ~]# watch -d uptime![请添加图片描述](https://img-blog.csdnimg.cn/40db9f5fca6e412fa7d2b7453bea858b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q2m5aSn5bGx,size_20,color_FFFFFF,t_70,g_se,x_16)

监控所有间隔5秒输出1次

[root@localhost ~]#  mpstat -P ALL 5

如下图请添加图片描述

出现问题

为什么iowait 还是0 而 sys很高

原因:

  1. -i,–io:表示调用sync(),它表示通过系统调用 sync() 来模拟 I/O 的问题;但这种方法实际上并不可靠,因为 sync() 的本意是刷新内存缓冲区的数据到磁盘中,以确保同步。

  2. 如果缓冲区内本来就没多少数据,那读写到磁盘中的数据也就不多,也就没法产生 I/O 压力。

  3. 这一点,在使用 SSD 磁盘的环境中尤为明显,很可能你的 iowait 总是 0,却单纯因为大量的系统调用,导致了系统CPU使用率 sys 升高。

解决问题

 这种情况,推荐使用 stress-ng 来代替 stress。 参数: stress-ng -i 4 --hdd 1 --timeout 600
 
 可能需要下载安装包 y y 就行了 

如下图请添加图片描述
重新模拟

[root@localhost ~]# stress-ng -i 1 --timeout 600

pidstat 来查询iowait高的 原因

[root@localhost ~]# pidstat -u 5 1

如下图请添加图片描述
分析: 明显%wait 比之前高了 但是还是不够高 会逐渐升高 说明 平均负载的升高是由于 iowait 的升高。 stress-ng导致


场景三 : 大量进程的场景 (等待CPU的进程->进程间会争抢CPU)

当系统中运行进程超出 CPU 运行能力时,就会出现等待 CPU 的进程。
模拟16个进程,本机是4核

[root@localhost ~]# stress -c 16 --timeout 600

观察平均负载

[root@localhost ~]# uptime

mpstat观察到CPU使用率

[root@localhost ~]# 

通过uptime观察到系统平均负载很高,通过mpstat观察到CPU使用率也很高,iowait为0,说明此进程是CPU密集型的,或者在进行CPU的争用;请添加图片描述

通过pidstat -u观察到wait指标很高,则说明进程间存在CPU争用的情况,可以判断系统中存在大量的进程在等待使用CPU;

pidstat -u 5 1

如下图
请添加图片描述
分析: 大量的进程,超出了CPU的计算能力,导致的系统的平均负载很高

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 问题排查及性能调优 的相关文章

  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I

随机推荐

  • Cadence(OrCAD)原理图导入到PADS Layout遇到的问题和解决方法

    看到有网友留言说将Cadence画的原理图导入到PADS Layout中没有成功 先在Cadence中导出原理图的网表 当然这里的网表是PADS Layout支持的 asc格式 然后在PADS Layout导入该网表文件 最终出现提示错误的
  • ARM汇编指令

    ARM汇编指令 1 汇编语法 1 1 mov movw r0 63500 0xf80c 将63500放到r0寄存器的低八位中 movt r0 25667 0x6443f80c 将25667放到r0寄存器的高八位中 1 2 lsl 左移 st
  • (十)服务器K8S集群部署SpringBoot项目实战

    1 准备springboot项目 可以在 https start spring io 网站准备一个项目 这里作为k8s的学习所以springboot项目中准备一个简单的访问接口即可 2 服务器环境准备 安装Jdk 1 更新系统软件包 sud
  • MybatisPlus分页类型转换 不要在用循环转换了

    使用MybatisPlus查询的sql 返回的必须是一个对应表实体的泛型分页数据 我们给前端返回只需返回VO 我们可能会循环进行对象复制从新赋值 优化 MybatisPlus分页对象有直接转换的方法 优化前 最终分页对象 Page
  • openwrt中添加自定义驱动模块和APP

    驱动模块添加 1 make menuconfig中的 kernel modules 其中的各个配置选项来自于下面目录中的 mk文件 这里以other mk为对照 后续我们添加的驱动模块 添加到other分支当中 2 建立模块目录 路径是pa
  • 力扣 [104、111、222]

    文章目录 104 二叉树的最大深度 原题链接 思路 代码 111 二叉树的最小深度 原题链接 思路 代码 222 完全二叉树的节点个数 原题链接 思路 广度优先遍历 思路 深度优先遍历 代码 代码 104 二叉树的最大深度 原题链接 思路
  • 【HDLBits 刷题 4】Verilog Language(4)Procedures 和 More Verilog Features 部分

    目录 写在前面 Procedures Alwaysblock1 Alwaysblock2 Always if Always if2 Always case Always case2 Always casez Always nolatches
  • 数据挖掘算法之C4.5

    算法描述 C4 5算法是机器学习和数据挖掘领域中用于处理分类问题的算法 该算法是有监督学习类型的 即 给定一个数据集 每条记录都由一组特征来描述 每条记录仅属于一个标签 在给定的数据集上运行C4 5算法可以学习到一个从特征值到标签的映射 进
  • 力扣算法题(只用C)

    昨天写了力扣的五题算法题 虽然是五题简单题 不过对于初窥算法的我 感悟也是挺多 也小有成就感 毕竟是自己想出来 敲出来的 力扣上的算法题 和平时自己写的是不一样的 继续加油 nums是传入的给定整数数组 numsSize是数组长度 targ
  • 【整型提升】 【算术转换】【两千字详解】

    目录 1 隐式类型转换 1 1整型提升的概念 1 2整型提升的意义 1 3如何进行整型提升 负数的整形提升 正数的整形提升 无符号数的整形提升 1 4实战应用 2 算数转化 1 隐式类型转换 表达式求值的顺序一部分是由操作符的优先级和结合性
  • opencv旋转矩形定义以及求交叉面积

    目录 代码 运行结果 结果分析 用途 可以用来计算目标检测或者分割等结果IOU 代码 import cv2 旋转矩形的定义 中心点x 中心点y 宽 高 角度值 rect1 0 0 100 100 10 x y w h rect2 0 0 5
  • Ubuntu Workbench连接失败 your connection attempt failed for user ‘root‘ to the MySQL server at 127.0.0.1

    1 打开终端进入root帐号 2 进入 etc mysql debian cnf文件 查看debian sys maint帐号密码 3 运行 mysql u debian sys maint p 输入密码 4 修改root帐号的密码 ALT
  • 经纬度换算数值_经纬度换算

    1 经纬度和弧度的转换 转换方法 角度转弧度为 180 角度 弧度变角度为180 弧度 经度分东经和西经 从0 经线向东内到180 为东容经 用字母E表示 从0 经线向西到180 为西经 用字母W表示经度的变化规律是东经向东度数越来越大 西
  • VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

    需求如下 B列为产品名为合并单元格 C列为供应商名 G H列为金额数据 数据源放在同一个文件夹内 B列产品名来源于工作薄名称中间的字符串 C列供应商名来源于工作薄中的sheet名 G H列金额数据来源于工作薄中sheet中固定单元格P25
  • c++函数指针

    1 声明函数指针 double cal int prototype double pf int 指针pf指向的函数 输入参数为int 返回值为double pf cal 指针赋值 2 指针作为函数的参数传递 void estimate in
  • Pytorch Tensor的索引与切片

    1 Pytorch风格的索引 根据Tensor的shape 从前往后索引 依次在每个维度上做索引 示例代码 import torch a torch rand 4 3 28 28 print a 0 shape 取到第一个维度 print
  • svg格式文件转换为png图片文件

    快要下班的时候 领导突然找我 发给我一个页面 说觉得这个页面的图标感觉不错 想把它做成图片放在项目里 我打开网页 用f12一看 用的是svg 这个我也不知道咋处理啊 但是遇到事情我们先不要慌 先在网上找找有没有解决办法 一顿搜索之下 我找到
  • 1. TensorRT量化的定义及意义

    前言 手写AI推出的全新TensorRT模型量化课程 链接 TensorRT下的模型量化 课程大纲如下 1 量化的定义及意义 1 1 什么是量化 定义 量化 Quantization 是指将高精度浮点数 如float32 表示为低精度整数
  • warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

    下面的文章详细介绍了这个warning的来源和解决方法 也可以关闭优化 当然关闭优化并不是最终解决方法 down vote accepted First off let s examine why you get the aliasing
  • Linux 问题排查及性能调优

    总目录 一 问题场景 1 CPU问题 2 内存问题 3 iowait问题 二 性能优化简介 三 Linux 问题排查顺序 前言 监控大盘 第一步 平均负载 第二步 cpu核 第三步 内存 第四步 磁盘 第五步 带宽 第六步 具体应用 第七步