性能分析-CPU知识

目录

CPU知识

cpu组成

查看cpu信息:

top命令中 cpu相关:

top命令看到系统负载: CPU负载 + IO负载

上下文: CPU的寄存器和程序计数器----在cpu的控制器中

实战演示分析

top命令分析

arthas工具

进程上下文切换高的问题分析

stress-ng 工具定位

分析

top

vmstat

pidstat -w 1

线程上下文切换的问题分析

stress-ng 工具定位

分析

top

vmstat

pidstat -w 1

IO密集型导致服务器负载高

stress-ng 工具定位

分析

top

vmstat 1

iostat -dx 1

监控平台

grafana + promethues 监控模板界面不显示数据


CPU知识


选择: 架构、核、主频

cpu组成

控制单元 、计算单元、存储单元

查看cpu信息:

  • top
  • lscpu
  • cat /proc/cpuinfo

top命令中 cpu相关:

  • top命令中的 进程列表中,是根据cpu的使用率从高到低。所以使用top进行性能分析时,如果 cpu使用率高,可以首先分析top命令中进程列表中 cpu使用率最高的第一个进程。
  • us\sy 非内核态(用户态)\内核态(系统态)
    • us: 逻辑运算
    • sy: 底层计算
    • 如果现在 top命令中,cpu使用率高的第1个进程,是一个 应用程序。此时再看 us、sy。
      • us高: 应该是 应用程序的 逻辑运算 频繁 ------代码有问题
    • 如果 现在top命令中,cpu使用率高的第1个进程是一个数据库程序。此时再看 us、sy。
      • us高: sql语句执行逻辑很复杂 -----sql有问题
      • sy高: 读写磁盘操作

top命令看到系统负载: CPU负载 + IO负载

  • sys高, =====> 怀疑===>上下文切换高 ======>pidstat====>自愿上下文切换高------可能是获取不 到足够的资源,----内存不足
  • sys高 =====》怀疑 =====》上下文切换=====》pidstat=====》非自愿上下文切换高 -----cpu不够用
  • us高 ====》业务逻辑有关 -----实现上存在、FGC、 CPU密集计算
  • si高 ====》 抢占资源 wa高 ===》 等资源 -----可能是内存,也可能是网络资源、外设资源、磁盘资源太慢

上下文: CPU的寄存器和程序计数器----在cpu的控制器中

  • 上下文切换发生在cpu的控制器中。 其实就是 cpu控制器中的指令的切换。

CPU上下文的切换,先保存前一个指令的资源到内核中,然后加载新的指令的资源,执行新的指 令

  • 这个过程有保存老的, 加载新的,所以它会占用CPU的时间。如果占用的总时间长,到cpu的 用 与计算的时间就少了。所以cpu运算速度就变慢,处理的 响应时间就变长了。

切换的指令,可以是同一个进程的,也可以是不同进程的

  • 同一个进程中上下文切换。
    • 进程是资源的拥有者。
    • 同一个进程中, 不同线程之间的切换。 只需要保存线程的私有的资源即可
  • 不同进程之间,上下文切换。
    • 保存 前一个进程的资源, 然后打开新进程的资源。

实战演示分析

现在讲的CPU,cpu是硬件设备。要进行性能分析可以使用性能分析命令,也可以使用监控平台。

  • 先用 命令分析
  • 再用 监控平台来分析

把xxxxx项目启动

对 获取验证码 接口 进行性能测试

top命令分析

  • top进程列表中, cpu使用率最高的java进程
    • 知道 java进行的 pid
    • ps -ef |grep pid 找 找到 具体java进程 -----判断出,到底是哪个java进程,导致的cpu使用
  • cpu的总的使用率数据中,显示 总和 接近100%, us态是最高的
    • 代码逻辑有问题
  • 结论: xxxxx项目,在获取验证码接口上,存在性能问题,代码逻辑可能有问题。

arthas工具

是阿里开源的 java项目的性能分析工具。

  • 定位:
    • arthas: 下载到 xxxx项目机器上   curl -O https://arthas.aliyun.com/arthas-boot.jar
    •  使用 java -jar arthas-boot.jar 启动arthas
      • 显示出,所有的java进程列表
      • 选择你要分析的java进程的id的 序号 回车, 就自动连接到 你要连接到java进程
      • 查看帮助信息thread --help
  • thread -n 数字 ------获取到了 cpu使用率最高的几个线程栈信息
    • 如果你看不懂, 你把这个线程栈信息,给 java开发人员,让他们定位。
    • 自己看线程栈信息,找到 项目工程的 代码类和行
      • at
      • com.lemon.lemon_erp.controller.CodeController.getCode(CodeController.j ava:67)

进程上下文切换高的问题分析

stress-ng 工具定位

进程: 在一台机器上 有多个进程

使用 stress-ng 工具,来模拟产生大量的 进程,然后相互竞争,造成性能现象,模拟在企业服 务器中 多进程的情况。

yum install epel-release.noarch

yum update -y

yum install stress-ng -y

命令 nproc 获取系统cpu的数量

((proc_cnt = `nproc`*10)); stress-ng --cpu $proc_cnt --pthread 1 --timeout 120s

分析

top
  • 进程列表中,cpu使用率最高的一些进程的名称相同; cpu的 us态值最高 sy也有增大; loadaverage 非常大。
    • 进程名称相同,怀疑是在抢cpu资源----想到 vmstat

vmstat
  • procs中r队列的值,有明显的数据变化。
  • 有大量的进程在抢占cpu资源。 -------cpu不够,是性能瓶颈。
  • 内存中,free有稍微变少,cache有变大,buff基本没变
  • bi bo si so 没有明显的变化
  • system中的 in 变化比较小, cs变化非常大。-----上下文切换非常大。

pidstat -w 1
  • cswch/s 自愿上下文切换要大一些 nvcswch/s 也有明显的数,相对来说小一些。

当系统出现 了进程上下文过多导致的性能问题,通过top命令和vmstat命令和pidstat命令,看到现象就如上。

这个问题,怎么解决?

  • 加cpu,但是实际中,加cpu数量,是不方便。
  • 减少进程(迁移一些进程到另外的服务器上、或者调整项目代码配置,减少启动的进程数量)

线程上下文切换的问题分析

一个进程: 就是一个程序、一个服务、一个项目, 进程是资源的拥有者。

线程: 是进程的工作者。 一个进程是可以有多个线程的。

线程上下文切换:

同一个进程中,多个线程之间的切换

不同进程间,线程的切换 ------类似 进程切换

stress-ng 工具定位

stress-ng --cpu `nproc` --pthread 10 --timeout 120

分析

top

系统负载升高、CPU的使用情况中 us和sy都有值、si也有值,sy要比us大。进程列表中先了 多个项目的名称。

vmstat

proc中 r列有明显的数据变化,b列没有变化,free有变小,cache变大,in、cs有数据变化, 但是 cs变化的很明显(上下文切换)。

pidstat -w 1

看到每一个线程的 cswch/s 自愿上下文切换的数据都比较大, 每个线程的非自愿nvcswch/s上下文切换数据比较小的。

进程上下文切换线程上下文切换
topus大,sy小us小,sy大
vamstat 1 proc列的r数据大 、cs数据大proc列的r数据大、cs数据大
pidstat -w 1 ,总的进程的自愿上下文大,每个进程的自愿上下文小,每个进程的非自愿上下文切换大。每个线程的自愿上下文切换是 大的,非自愿上下文切换小

这种问题怎么解决?

  • 少启动一些线程:
    • 修改进程中,启动的线程数的配置 ------ 最大值,由服务所在的机器或容器的CPU核数来定
    • 在服务器上,少启用一些服务\进程,迁移一些进程到其他服务器上面。

IO密集型导致服务器负载高

  • 系统负载高,由两部分组成: CPU负载高、 IO负载高 io负载高,
  • top命令看得时候,cpu的使用率中 wa 值
  • 如果 CPU使用率中wa值比较大,这种情况大概率就是 IO性能问题
  • io负载: 磁盘负载 、 网络负载、外设负载
    • 如果是网络负载慢: 可能就是网卡或者是带宽
      • 网卡: 一般情况下 都是千兆网卡 ------一般情况下,网卡速度不会成为瓶颈
    • 外设:
      • 磁盘: 读写使用率 IOPS 模拟,系统IO使用率高,导致的性能瓶颈的分析
  • 模拟,系统IO使用率高,导致的性能瓶颈的分析
    • 什么现象,说明磁盘的io成为了性能瓶颈?

stress-ng 工具定位

stress-ng -i 6 --hdd 1 --timeout 120

分析

top

sy、wa、si 这三个值,跳跃性的成为最大值。

  • sy cpu的内核进程计算 读写磁盘是发生在内核中
  • wa 等待数据
  • si 软中断

vmstat 1

proc的r队列有变化不明显; free表小,cache 变大了, bi、bo有明显的数据

bi bo 是磁盘操作-----怀疑是磁盘瓶颈

iostat -dx 1

await有明显的数据,说明有明显的磁盘等待。

使用这个命令不要过于频繁或时间过长。执行这个命令很明显的等待,操作会很卡,持续操作的话,可能导致 机器宕机。

问题解决办法

  • 磁盘成为了瓶颈
    • 换磁盘: 应用服务器换固态硬盘
    • 减少IO操作: 应用服务器,写日志,是应用服务最常见的磁盘操作
      • 减少日志: 提高日志级别,日志级别越高,日志量越少。
      • 日志文件拆解:如 根据日志文件大小拆解
    • 数据库服务器的磁盘瓶颈

监控平台

监控服务器硬件资源: grafana + Prometheus + node_exporter

  • grafana
  • prometheus 时序数据
  • node_exporter: Prometheus收集硬件资源的收集器
    • 如果你想要收集信息,就选择用不同的
    • exporter exporter不同,就可以收集不同的资源(硬件资源、服务资源)

grafana、Prometheus,不会安装在被监控服务器上。 exporter 会安装到 被监控的机器上。要收集多 个机器,每个机器上都放置 exporter

node_exporter的 默认端口: 浏览器http协议可以访问端口 9100

  • 启动 ./node_exporter

Prometheus可浏览器http协议访问的端口: 9090

  • 配置文件 prometheus.yml 要注意格式
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.130.133:9100']
  • ./prometheus

启动grafana: systemctl restart grafana-server

http://grafana的ip:3000 admin admin

选择添加 Prometheus数据源

  • 注意: 数据源添加url: http://prometheus的ip:9090

引入模板: import 12884

  • 注意: 数据源,要选择你上面添加的 数据源的名称

grafana + promethues 监控模板界面不显示数据

  • Prometheus 与 node_exporter机器 网络不通
  • Prometheus的机器的 时间 与 node_expoter机器的时间 相差特别大
    • 隔8小时 把grafana的模板界面右上角的时间 拉长8小时以上--出现数据
  • 界面模板的界面 左上角 信息没有出来 ---可以手动填,不是所有的都会带出来
  • 有修改 hosts文件(系统名未改,大部分公司已经改了的)
    • /etc/hosts文件中
      • 没有填写主机名网络请求时,有的会要读取这个文件中主机名,读不到会导致网络延迟非常大。

搭建环境详见:Linux集群监控部署: prometheus 普罗米修斯 + Grafana(超详细)_监控 普罗米修斯和gra-CSDN博客文章浏览阅读1.1w次,点赞12次,收藏130次。前言之前我们有用到top、free、iostat等等命令,去监控服务器的性能,但是这些命令,我们只针对单台服务器进行监控,通常我们线上都是一个集群的项目,难道我们需要每一台服务器都去敲命令监控吗?这样显然不是符合逻辑的,Linux中就提供了一个集群监控工具 – prometheus。..._监控 普罗米修斯和grahttps://blog.csdn.net/weixin_43865008/article/details/118946362

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

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

相关文章

《MATLAB科研绘图与学术图表绘制从入门到精通》

解锁MATLAB科研绘图魅力,让数据可视化成为你的科研利器! 1.零基础快速入门:软件操作实战案例图文、代码结合讲解,从入门到精通快速高效。 2.多种科研绘图方法:科研绘图基础变量图形极坐标图形3D图形地理信息可视化等&a…

pdf操作器(图片转文字、PDF转word、PDF拆分、图片jpg、png互转)

pdf操作器(不用联网图片转文字、PDF转word、PDF拆分、图片jpg、png互转)介绍目前该软件实现了以下功能 pdf转wordpdf拆分图片,图片导出在桌面的一个文件夹里图片合并为pdf压缩、转换图片格式(jpg和png)OCR图片转文字&…

【计算机网络经典面试题】简述 TCP 三次握手和四次挥手的过程

TCP链接 1.三次挥手2.四次挥手3.拓展说说 TCP 2次握手行不行?为什么要3次 1.三次挥手 1)第一次握手:建立连接时,客户端向服务器发送SYN包(seqx),请求建立连接,等待确认 2&#xff09…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同,以下是它们之间的一些主要区别: 大小可变性: vector是C标准模板库(STL)提供的动态数组容器,它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

【AIGC】HF-Mirror 使用说明(MacOS 版)

今天这篇文章主要是记录 HF-Mirror 的使用过程,官网上提供了 Linux 和 Windows 的使用方式。本人作为 MacOS 用户也将自己的使用办法记录一下,希望能够帮助到其他人。 HF-Mirror 是什么? HF-Mirror 是大神 padeoe 开源的 huggingface 镜像站…

CVE-2023-2928 DedeCMS 文件包含漏洞getshell 漏洞分析

DedeCMS(也称为织梦CMS)是一款基于PHPMySQL的开源内容管理系统。 在 DedeCMS 5.7.106 及之前的版本中发现一个漏洞。它已被宣布为关键。受此漏洞影响的是未知功能的文件uploads/dede/article_allowurl_edit.php。对参数 allurls 的操作会导致代码注入。…

解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …

基本乐理(识别和构成和弦一)阅读记录一

和弦、 和弦是非常好听的,顾名思义。我现在阅读的书籍是《基本乐理》- 作者李重光,直接跳跃到第十九章进行阅读。 理解和弦 书中介绍对理解和弦的前提要素是要对音程要掌握。 如:大三度 如:小三度 如:纯五度 音程 音…

如何使用Java和RabbitMQ实现延迟队列?

前言 今天我们使用Java和RabbitMQ实现消息队列的延迟功能。 前期准备,需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列?-CSDN博客 今天讲的是依赖RabbitMQ的延迟插件实现…

Python---Numpy线性代数

1.数组和矩阵操作: 创建数组和矩阵:np.array, np.matrix 基本的数组操作:形状修改、大小调整、转置等 import numpy as np# 创建一个 2x3 的数组 A np.array([[1, 2, 3], [4, 5, 6]]) print("数组 A:\n", A)# 将数组 A 转换为矩阵…

SpringBoot项目打包和部署

目录 1.插件 2.打包 3.运行 1.插件 此插件会在pom中自动添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></bu…

【软考】23种设计模式详解,记忆方式,并举例说明

23种设计模式详解&#xff0c;举例说明 一、创建型模式1.1、抽象工厂模式&#xff08;Abstract Factory&#xff09;1.1.1、简介1.1.2、意图与应用场景1.1.3、结构1.1.4、优缺点1.1.4、示例代码&#xff08;简化版&#xff09; 1.2、建造者模式&#xff08;Builder&#xff09;…

c++的学习之路:16、string(3)

上章有一些东西当时没学到&#xff0c;这里学到了将在补充&#xff0c;文章末附上代码&#xff0c;思维导图。 目录 一、赋值重载 二、带模板的创建 三、析构函数 四、代码 五、思维导图 一、赋值重载 这里的赋值重载就是直接利用交换函数进行把传参生成的临时数据和需要…

【iOS】UITableView性能优化

文章目录 前言一、优化的本质二、卡顿产生原因三、CPU层面优化1.使用轻量级对象2.cellForRowAtIndexPath方法中不要做耗时操作3.UITableView的复用机制4.提前计算好布局了解tableView代理方法执行顺序cell高度计算rowHeightestimatedRowHeight 高度计算进行时机rowHeight计算时…

基于Spring boot+Vue的业余排球俱乐部会员管理系统

5 系统功能模块的具体实现 5.1超级会员角色 5.1.1 登录 超级管理员登录通过用户名和密码去数据库查询用户表&#xff0c;该名称是否在用户表中存在&#xff0c;如果存在&#xff0c;则通过用户名和密码查询密码是否正确&#xff0c;然后吧用户的信息存在jwt的负载里&#xf…

【CicadaPlayer】demuxer_service的简单理解

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SMPMessageControllerListener.cppplayer的demuxer服务类 std::unique_ptr<demuxer_service> mDemuxerService{nullptr};根据option (Cicada::options),可以决定音视频的不同操作,通过 hander可以获得具体使…

探究“大模型+机器人”的现状和未来

基础模型(Foundation Models)是近年来人工智能领域的重要突破&#xff0c;在自然语言处理和计算机视觉等领域取得了显著成果。将基础模型引入机器人学&#xff0c;有望从感知、决策和控制等方面提升机器人系统的性能&#xff0c;推动机器人学的发展。由斯坦福大学、普林斯顿大学…

Redis中的Sentinel(六)

Sentinel 选举领头Sentinel. 当一个主服务器被判断为客观下线时&#xff0c;监视这个下线主服务器的各个Sentinel会进行协商&#xff0c;选举出一个领头Sentinel,并由领头 Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法: 1.所有在线的S…

大日志精选案例四:某省级大数据集团日志审计优化实战解析

“在集团日常运营中&#xff0c;数据安全始终是我们关注的重点。过去&#xff0c;数据量大、处理速度慢&#xff0c;导致日志数据难以迅速获取和分析&#xff0c;影响业务决策。但自从引入聚铭大日志解决方案后&#xff0c;系统日志和用户行为数据都得到了高效处理与存储。该方…

Nginx配置之localhost和反向代理

文章目录 第一步、查看安装位置和配置文件第二步、web服务器设置第三步、localhost 指令第四步、设置反向代理 清明假期&#xff0c;在家练习Nginx配置&#xff0c;在前期【 linux环境下安装配置nginx代理服务器】已经完成nginx环境搭建&#xff0c;本期主要实践web服务器&…