性能瓶颈分析与调优

对于性能测试,很多时候压力并不能完全到达服务端,在客户端、网络连接端都有可能被阻塞,或者压测的某些特征符合CC和DDoS的行为,触发了防护策略导致压测结果达不到预期。

以下是各节点可能发生性能瓶颈的地方:

  1. 客户端阻塞:线程设置不合理,压测机配置跟不上;
  2. 网络连接端:宽带、最大连接数、新建连接数的限制;
  3. 服务器端:CPU、内存、磁盘IO、Network I/O;
  4. 中间件相关指标:线程池、连接池、GC等;
  5. 数据库相关指标:慢查SQL、命中率、锁、参数设置;
  6. 应用程序:算法、缓冲、缓存、同步或异步。

性能瓶颈分析与调优

性能瓶颈分析与调优

瓶颈排查处理方案:

瓶颈应对手段

CPU:

如果CPU User非常高,需要查看消耗在哪个进程,可以用top(linux)命令看出,接着用top –H –p 看哪个线程消耗资源高,如果是java应用,就可以用jstack看出此线程正在执行的堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在;

如果CPU Sys非常高,可以用strace(linux)看系统调用的资源消耗及时间;

如果CPU Wait非常高,考虑磁盘读写,可以通过减少日志输出、异步或换速度快的硬盘。

内存:

内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。

磁盘IO:

磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘。

网络IO:

网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩、减少内容大小、在本地设置缓存以及分多次传输等。

内核参数:

注意运行参数不要超过内核参数而导致系统出现问题

JVM:

jvm主要分析GC/FULL GC是否频繁,以及垃圾回收的时间,可以用jstat命令来查看,对于每个代大小以及GC频繁,通过jmap将内存dump,再借助工具HeapAnalyzer来分析哪地方占用的内存较高以及是否有内存泄漏可能。

常见线程问题(jstack pid)

⚫ CPU 使用率不高但是响应时间很长

➢ 对进行线程 dump,检查是不是有线程卡在了 IO、数据库这些地方

➢ 检查是否有”Waiting on condition”,如果有则说明线程在等待某种条件来唤

醒。比如 sleep 时间,网络 IO,磁盘 IO

➢ 检查是否有线程死锁(线程死锁指的是两个线程互相持有对方的锁,无法释放)

⚫ CPU 的 us 使用率高,负载很高,响应很长

➢ 多次堆栈,检查是否有某个线程一直在执行同一个方法

线程池:

如果线程不够用,可以通过参数调整,增加线程;对于线程池中的线程设置比较大的情况,还是不够用可能的原因是:某个线程被阻塞来不及释放,可能在等锁、方法耗时较长、数据库等待时间很长等原因导致,需要进一步分析才能定位。

JDBC连接池:

连接池不够用的情况下,可以通过参数进行调整增加;但是对于数据库本身处理很慢的情况下,调整没有多大的效果,需要查看数据库方面以及因代码导致连接未释放的原因。

SQL:

慢SQL,可以通过查看执行计划看SQL慢在哪里来进一步优化。

Original: https://www.cnblogs.com/ngd-mzl/p/15711329.html
Author: 尼古丁·瘾
Title: 性能瓶颈分析与调优

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585227/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 微步蜜罐部署

    1.下载安装包HFish-Windows-amd64 (Windows x86 架构 64 位系统),解压缩 下载地址反制溯源_欺骗防御_主动防御-HFish免费蜜罐平台 2.进入…

    Linux 2023年6月14日
    099
  • Linux_shell基础

    注意, 这里在运行时一定要写成./test.sh,而不是 test.sh, 运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有…

    Linux 2023年5月27日
    0114
  • Sublime Text 左侧不显示目录树如何解决

    方法一: 依次点击 View – Side Bar – Show Side Side点击后左侧的目录树就会显示出来了,如下图所示方法二:快捷键 Mac : …

    Linux 2023年6月13日
    099
  • 【C++基础】函数的分文件编写

    cpp函数的分文件编写 作用:让代码结构更加清晰 如下步骤: 创建后缀名为.h的头文件 创建后缀名为.cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义,同时引入自定义…

    Linux 2023年6月13日
    0104
  • 记一次因网络变更导致zabbix连接es报400和404

    背景 zabbix历史数据存储到es集群,正常工作中的时候,因网络变更导致zabbix server连接不上es,zabbix日志首先报400错误,之后一直404,es那边报查询相…

    Linux 2023年6月7日
    0106
  • Linux命令篇-curl 命令

    curl 查看网页源码 自动跳转 显示头信息 通信过程 下载文件 断点续传 获取天气 curl 查看网页源码 直接在curl命令后加上网址,就可以看到网页源码。 $ curl ww…

    Linux 2023年6月13日
    0110
  • Redis集群原理及搭建(Twemproxy、Predixy代理搭建、Redis Cluster集群)

    1 引言 网上很多文章会把集群和主从复制混为一谈,其实这两者是存在本质差异的,各自解决的问题不同。Redis在单机/单节点/单实例存在的风险: 单点故障、 容量有限、 并发压力问题…

    Linux 2023年6月13日
    0100
  • 012 Linux 搞懂用户权限升级(sudo 和 su),包学会😁

    Linux 系统中 root 账号通常用于系统的管理和维护,对操作系统的所有资源具有访问控制权限,当一个普通用户希望执行一些系统维护相关的操作的时候,就需要使用 sudo 命令,临…

    Linux 2023年6月13日
    078
  • mycat2 读写分离配置(详解)

    mycat2相对mycat1来说升级还挺多的,但是全网资料太少了,这里尽可能详细的将读写分离说清楚,目前这套配置已经在我司生产环境应用,日UV6W左右,暂时没发现问题。 1.1下载…

    Linux 2023年6月6日
    0105
  • 最小二乘法

    背景:我们有一系列的点(x,y),如下图所示,实际上这就是一个y=10*x的一元一次曲线,再加上一个随机误差得到的数据。 我们想用一个线性方程来拟合它y=a*x+b为了达到最好的拟…

    Linux 2023年6月15日
    0122
  • 意犹未尽的第2篇再次推出,继续讲解oracledb_exporter监控Oracle,一个入侵性极低的监控方案。

    写在开篇 基于上次的 oracledb_exporter监控Oracle,一个入侵性极低的监控方案 文章中,本篇继续讲解如下内容: 根据实际业务需求编写自定义监控指标,让其真正可以…

    Linux 2023年6月7日
    0104
  • 删除MySQL数据用户

    mysql删除用户的方法: 1、使用”drop user 用户名;”命令删除; 2、使用”delete from user where user…

    Linux 2023年6月13日
    080
  • Spring事务(一)-事务配置

    事务是数据库操作最基本的单元,是逻辑上的一组操作,这一组操作在同一个会话中要么都执行成功,要么都失败,这也是事务的最基本特性–原子性。事务的作用是为了保证系统数据的正确…

    Linux 2023年6月6日
    091
  • 如何画出别人一看就懂的架构图?

    技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提…

    Linux 2023年6月8日
    091
  • Java轻松实现,每天给对象发情话!

    一、引言 最近看到一篇用js代码实现表白的文章,深有感触。然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞实现思路: 使用HttpClien…

    Linux 2023年6月14日
    086
  • Redis集群-主从架构

    1.为什么需要集群? 互联网思维一向讲究的是三高,即高并发,高可用,高性能。高并发:系统能够同时并行处理的请求,主要度量指标有响应延时,吞吐量,每秒查询处理,每秒事务处理,并发用户…

    Linux 2023年6月7日
    0119
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球