Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客

Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客

Java web应用性能分析概叙-CSDN博客

Java web应用性能分析之【基准测试】-CSDN博客

        上面基本科普了一下基准测试,这里我们将从sysbench安装、sysbench使用、sysbench报告解读等方面来详细讲解sysbench完成基准测试。

        一般情况下基准测试一定是有个对比。可以是相同硬件配置,不同品牌硬件服务器间的对比;也可以是在同一硬件服务器上,不同基准测试场景的对比。

sysbench简介

        SysBench是一个跨平台的基准测试工具,用于评估计算机系统在不同负载条件下的性能。它模拟真实场景下的工作负载,提供了多种测试模式,包括CPU、内存、磁盘、线程、数据库等方面的测试。

        主要包括以下几种测试:

  • cpu性能
  • 磁盘io性能
  • 调度程序性能
  • 内存分配及传输速度
  • POSIX线程性能
  • 数据库性能(OLTP基准测试)

sysbench安装

        sysbench的github地址GitHub - akopytov/sysbench: Scriptable database and system performance benchmark

        最新版本sysbench 1.0.20,下载地址:

Release Release 1.0.20 · akopytov/sysbench · GitHub

        安装方式,官网已经给出了说明指导

        需要重点注意的是这里,在./configure配置环境时,如果要测试mysql,需要指定“you can specify them explicitly with --with-mysql-includes and --with-mysql-libs options to ./configure.”这两个路径

        我在ubuntu18上安装如下:

sysbench基本操作

       基本语法:sysbench [options]... [testname] [command],执行sysbench –help,或者详见官网。

https://github.com/akopytov/sysbench?tab=readme-ov-file#general-syntax

command

         command是sysbench要执行的命令,包括:prepare、run、cleanup。

        顾名思义,prepare是为测试提前准备数据,run是执行正式的测试,cleanup是在测试完成后对数据库进行清理。后面我们的基准测试脚本也是按照这个来写的。

testname

        testname 是一个可选的内置测试名称(如 fileio、memory、cpu等),或一个捆绑的 Lua 脚本名称(如 oltp_read_only),或一个自定义 Lua 脚本的路径。testname指定了要进行的测试,在老版本的sysbench中,可以通过--test参数指定测试的脚本;而在新版本中,--test参数已经声明为废弃,可以不使用--test,而是直接指定脚本。

        例如,如下两种方法效果是一样的:

1

2

sysbench  --test=./tests/include/oltp_legacy/oltp.lua

sysbench ./tests/include/oltp_legacy/oltp.lua

        测试时使用的脚本为lua脚本,可以使用sysbench自带脚本,也可以自己开发。对于大多数应用,使用sysbench自带的脚本就足够了。不同版本的sysbench中,lua脚本的位置可能不同,可以自己在sysbench路径下使用find命令搜索oltp.lua。P.S.:大多数数据服务都是oltp类型的,如果你不了解什么是oltp,那么大概率你的数据服务就是oltp类型的。

options

        sysbench的options参数有很多,options是一个包含0个或多个以“--”开头的命令行选项的列表。其中比较常用的包括:

MySQL 连接信息参数

  • --mysql-host:MySQL服务器主机名,默认localhost;如果在本机上使用localhost报错,提示无法连接MySQL服务器,改成本机的IP地址应该就可以了。
  • --mysql-port:MySQL服务器端口,默认3306
  • --mysql-user:用户名
  • --mysql-password:密码
  • --mysql-db 指定数据库 默认sbtest

  • --mysql-ssl 使用 ssl 连接 默认off

  • --mysql-ssl-cipher ssl 使用 specific cipher

  • --mysql-compression 如果客户端库中有压缩功能,则使用压缩功能 默认off

  • --mysql-debug 跟踪所有客户端库调用 默认off

  • --mysql-ignore-errors 忽略的错误 [1213,1020,1205]

  • --mysql-dry-run 模拟运行,假装所有 MySQL 客户端 API 调用都成功,但不执行它们 默认off

MySQL 执行参数

  • --oltp-test-mode:执行模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插入更新等,但是不使用事务;complex模式下测试最全面,会测试增删改查,而且会使用事务。可以根据自己的需要选择测试模式。
  • --oltp-tables-count:测试的表数量,根据实际情况选择
  • --oltp-table-size:测试的表的大小,根据实际情况选择
  • --threads:客户端的并发连接数
  • --time:测试执行的时间,单位是秒,该值不要太短,可以选择120
  • --report-interval:生成报告的时间间隔,单位是秒,如10

压测的lua脚本

        注:这些脚本均包含了oltp_common,所以调用这些脚本可以直接使用 oltp_common 脚本中的内容,oltp_common 脚本中编写了数据生成、数据清理等基础函数。

        lua脚本参数

sysbench的基准测试场景

基准场景步骤

        先确定单线程运行时的 TPS 值。

        根据系统最大的预估容量设置场景中的线程数、递增参数等;如果不会预估容量,可以直接多加一些线程,然后在递增的过程中查看曲线的变化;

        强调一下,如果你不会预估容量,可以直接多加一些线程,然后在递增的过程中查看曲线的变化;确定正式基准场景的压力参数。

基准场景的目的

        获得单接口最大 TPS:如果单接口最大 TPS 没有超过容量场景中的要求,那就必须要调优

        解决单接口基准场景中遇到的性能问题:也就是说,当我们在做单接口测试时,碰到了性能瓶颈一定要分析解决。

基准场景性能分析步骤

        第一阶段:硬件资源用完。即在基准场景中,我们要把 CPU、内存、网络、IO 等资源中的任一个耗尽,因为在这种情况下,我们很容易从全局监控的性能计数器中看到现象,可以接着去跟踪分析。

        第二阶段:优化到最高 TPS。即在基准场景中,我们要把单接口的 TPS 调到最高,以免成为容量场景中的瓶颈点。

主要测试方式

  1.         cpu性能 :找范围内最大素数{时间越短越好}
  2.         磁盘io性能:不同场景下IOPS{越大越好}
  3.         调度程序性能 :线程并发执行,循环响应信号量花费的时间{越少越好}
  4.         内存分配及传输速度:以不同块大小传输一定数量的数据吞吐量大小{越大越好}
  5.         POSIX线程性能 :并发线程同时申请互斥锁循环一定次数花费的时间{越少越好}
  6.         数据库性能(OLTP基准测试):qps、tps越高越好

         服务器硬件环境:阿里云主机  2核(vCPU)   4GiB内存   46GB磁盘 1 Mbps带宽。

        这里我们以测试cpu为例,脚本和分析,都一样。

        测试cpu

        测试素数上限20万,线程1、2、4、6、8、10

## 测试素数上限20万,线程2、4、8、10root@zhouxx:~# sysbench cpu --cpu-max-prime=200000 --threads=1 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options:
Number of threads: 1   ##线程数
Initializing random number generator from current timePrime numbers limit: 200000  ## 素数上限Initializing worker threads...Threads started!CPU speed:events per second:    17.24  #所有线程每秒完成的event数General statistics:total time:                          10.0349s  ##总耗时total number of events:              173  ##总共完成的event数Latency (ms):min:                                   56.78  ##最少耗时avg:                                   58.00 #平均耗时max:                                   70.17 #最大耗时95th percentile:                       61.08  ##95%都在61.08秒内找到sum:                                10033.47Threads fairness:events (avg/stddev):           173.0000/0.00 完成了几轮的素数计算execution time (avg/stddev):   10.0335/0.00  #每个线程平均耗时10秒,标准差为0##event: 完成了几轮的素数计算
##stddev(标准差): 在相同时间内,多个线程分别完成的素数计算次数是否稳定,如果数值越低,则表示多个线程的结果越接近(即越稳定)。该参数对于单线程无意义。root@zhouxx:~# sysbench cpu --cpu-max-prime=200000 --threads=2 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options:
Number of threads: 2
Initializing random number generator from current timePrime numbers limit: 200000Initializing worker threads...Threads started!CPU speed:events per second:    33.95General statistics:total time:                          10.0420stotal number of events:              341Latency (ms):min:                                   56.98avg:                                   58.86max:                                  116.2495th percentile:                       63.32sum:                                20072.61Threads fairness:events (avg/stddev):           170.5000/1.50execution time (avg/stddev):   10.0363/0.00root@zhouxx:~# 
root@zhouxx:~# sysbench cpu --cpu-max-prime=200000 --threads=4 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options:
Number of threads: 4
Initializing random number generator from current timePrime numbers limit: 200000Initializing worker threads...Threads started!CPU speed:events per second:    33.93General statistics:total time:                          10.0781stotal number of events:              342Latency (ms):min:                                   57.78avg:                                  117.53max:                                  159.6295th percentile:                      123.28sum:                                40193.86Threads fairness:events (avg/stddev):           85.5000/1.12execution time (avg/stddev):   10.0485/0.02root@zhouxx:~# sysbench cpu --cpu-max-prime=200000 --threads=8 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options:
Number of threads: 8
Initializing random number generator from current timePrime numbers limit: 200000Initializing worker threads...Threads started!CPU speed:events per second:    33.95General statistics:total time:                          10.1018stotal number of events:              343Latency (ms):min:                                  155.71avg:                                  234.83max:                                  279.1095th percentile:                      267.41sum:                                80545.85Threads fairness:events (avg/stddev):           42.8750/1.05execution time (avg/stddev):   10.0682/0.02root@zhouxx:~# sysbench cpu --cpu-max-prime=200000 --threads=10 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)Running the test with following options:
Number of threads: 10
Initializing random number generator from current timePrime numbers limit: 200000Initializing worker threads...Threads started!CPU speed:events per second:    34.27General statistics:total time:                          10.1246stotal number of events:              347Latency (ms):min:                                  190.21avg:                                  290.45max:                                  327.9595th percentile:                      308.84sum:                               100786.19Threads fairness:events (avg/stddev):           34.7000/0.46execution time (avg/stddev):   10.0786/0.04root@zhouxx:~# 
       结果分析

        服务器进行CPU性能对比,当素数上限和线程数一致时:

  • 相同时间,比较event

  • 相同event,比较时间

  • 时间和event都相同,比较stddev(标准差)

        绘图

        这里直接用echart的折线图

        完整的测试过程,应该开着监控,观察服务器资源消耗情况。

        测试内存

        测试线程

        测试io

      测试mutex

      测试OLTP

        备注:--test=oltp 已经被弃用

sysbench测试cpu

sysbench测试内存

sysbench测试io

sysbench测试数据库

        测试mysql数据库前的准备工作:创建数据库和登录账号。

CREATE DATABASE sbtest CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER 'sbuser'@'%' IDENTIFIED BY "zhouxx1234";
grant all privileges on sbtest.* to 'sbuser'@'localhost' identified by 'zhouxx1234';
grant all privileges on sbtest.* to 'sbuser'@'%' identified by 'zhouxx1234';
grant all privileges on sbtest.* to 'sbuser'@'172.26.35.10' identified by 'zhouxx1234';
UPDATE mysql.user SET authentication_string=PASSWORD('zhouxx1234') WHERE User='sbuser';
flush privileges;

完整的sysbench基准测试脚本

测试oltp批量插入脚本

#!/bin/bashcurrent_data=$(date "+%Y-%m-%d")
current_time=$(date "+%H:%M:%S")#链接配置信息
dbhost="172.26.35.10"
dbport=3306
dbuser="sbuser"
dbpwd="zhouxx1234"
dbname=sbtest
#单表数据量
tbsize=3
#表数据量
tables=1
#选择引擎,默认innodb
testengine=innodb
# 压测使用的lua 脚本
luascript=bulk_insert.lua
# 线程数组
#threads=(1 5 10 15)
# 测试时间
sbtime=600mkdir -p /usr/share/sysbench/sblog
sbtestlogdir=/usr/share/sysbench/sblog         #存放log的地方,需要手动自己创建
path=/usr/sysbench/share/sysbench/         #存放sysbench脚本point_select.lua等其他脚本的地方#for thread in  ${threads[@]}
for thread in 1 5 10 15
do#测试结果输出日志sblogname=${sbtestlogdir}/sbtench_${testengine}_${luascript}_${thread}_$(date "+%Y%m%d%H%M%S").logecho "============================压测开始! 当前日期:$(date "+%Y-%m-%d %H:%M:%S")======================================压测地址:${dbhost},压测端口:${dbport},测试引擎对象:${testengine}压测数据量:${tables}张表每张表${tbsize}条数据量,压测时间:${sbtime} s,当前压测线程:${threads}日志地址:${sbtestlogdir}sysbench ${path}${luascript} --db-driver=mysql --mysql-host=${dbhost} \--mysql-port=${dbport} --mysql-user=${dbuser} \--mysql-password=${dbpwd} \--mysql-db=${dbname} --table_size=${tbsize} \--tables=${tables} --events=0 --time=${sbtime} \--mysql_storage_engine=${testengine}  \--threads=${thread} --percentile=95  \--range_selects=0 --skip-trx=1 --report-interval=5 prepare " >> ${sblogname}sysbench ${path}${luascript} --db-driver=mysql --mysql-host=${dbhost} \--mysql-port=${dbport} --mysql-user=${dbuser} \--mysql-password=${dbpwd} \--mysql-db=${dbname} --table_size=${tbsize} \--tables=${tables} --events=0 --time=${sbtime} \--mysql_storage_engine=${testengine}  \--threads=${thread} --percentile=95  \--range_selects=0 --skip-trx=1 --report-interval=5 prepare >> ${sblogname}sysbench ${path}${luascript} --db-driver=mysql --mysql-host=${dbhost} \--mysql-port=${dbport} --mysql-user=${dbuser} \--mysql-password=${dbpwd} \--mysql-db=${dbname} --table_size=${tbsize} \--tables=${tables} --events=0 --time=${sbtime} \--mysql_storage_engine=${testengine}  \--threads=${thread} --percentile=95  \--range_selects=0 --skip-trx=1 --report-interval=5 run >> ${sblogname}sysbench ${path}${luascript} --db-driver=mysql --mysql-host=${dbhost} \--mysql-port=${dbport} --mysql-user=${dbuser} \--mysql-password=${dbpwd} \--mysql-db=${dbname} --table_size=${tbsize} \--tables=${tables} --events=0 --time=${sbtime} \--mysql_storage_engine=${testengine}  \--threads=${thread} --percentile=95  \--range_selects=0 --skip-trx=1 --report-interval=5 cleanup >> ${sblogname}     echo "============================压测结束! 当前时间:$(date "+%Y-%m-%d %H:%M:%S")====================================== " >> ${sblogname}#sleep 10#/etc/init.d/atomstore restartdone

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

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

相关文章

深入浅出 Transformer

Transformer 背后的核心概念:注意力机制、编码器-解码器架构、多头注意力等等。 一、理解注意力机制 注意力机制能够集中注意力在输入序列的某些部分,同时忽略其他部分,就像我们人类在理解句子时关注特定的单词或短语一样。 自注意力是种特…

眼图仪参数理解和一些测量指标

参考资料: https://www.eet-china.com/mp/a35960.html 一:关于眼图仪: :::warning ●如果追溯历史,大约47年前,眼图就已经开始广泛应用。在1962年-2002的40年间,眼图的测量方法是基于采样示波器的传统方法…

C++默认构造函数的合成

编译器只在编译期需要的时候合成默认构造函数,而不是在用户需要的时候 文章目录 引入编译器合成默认构造函数的四种情况情况一 类中包含带有默认构造函数的类的成员对象情况二 派生类的基类带有默认构造函数情况三 类带有一个虚函数情况四 派生自一个虚基类的类 参考…

Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和

1143. 最长公共子序列 这题有点像递增子序列和公共子数组的组合, 要求公共子序列不一定非要是连续的。 确定dp数组下标及其含义 dp[i][j]表示text1[i - 1]与text2[j - 1]结尾的最高公共子序列。 长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的…

Redis 服务等过期策略和内存淘汰策略解析

redis服务是基于内存运行的,所以很多数据都存放在内存中,但是内存又不是无限的,所以redis就引出了key的过期和淘汰策略。 一、Redis的过期策略: 我们在set key的时候,可以给它设置一个过期时间,比如expire …

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接: MikTeX ( https://mikt…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手,而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次,挥手是四次? 三次握手流程 首先是客户端(也就是我们的浏览器)发送一个SYN标志位…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一,队列的概念 队列是一种特殊的受限制的线性表。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的t(First In First Out)的线性表,简称FIF…

请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

NDK 基础(五)—— C++ 高级特性2

1、左值右值 在 C 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。 **左值(lvalue)**是指可以出现在赋值操作符左侧的表达式&a…

商店数据(九)

目录 65.店铺入驻字段表 66.店铺分类表 67.店铺配置表 68.店铺快递公司关联表 69.店铺资料附加表 70.店铺入驻流程表 71.店铺运费模板表 72.消息类型表 65.店铺入驻字段表 CREATE TABLE wst_bases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,flowld int(11)…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言,进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持,且初始流量相当有限。因此,开店的首要任务便是积极展开测评工作,努力积累初始的评论和销售记录。测评的益处颇为显著,它不…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动,传参有哪些方式? 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住:一般是对于Spring Boot应用特有的配置参数,确保它们遵循Spring Boot的配置属性命…

【视频打架行为数据集】打斗场景视频数据集简要介绍

一、UBI-Fight(异常事件检测数据集) 介绍 UBI-Fights 数据集是一个独特的全新大型数据集,涉及特定的异常检测并仍然在打斗场景中提供广泛的多样性,该数据集包含 80 小时的视频,在帧级别进行了完全注释。由 1000 个视…

# 从浅入深 学习 SpringCloud 微服务架构(五)Consul(2)

从浅入深 学习 SpringCloud 微服务架构(五)Consul(2) 段子手168 一、consul 集群:consul 集群的基础知识 1、启动 sonsul 服务命令: 以开发者模式快速启动: consul agent -dev -client0.0.0…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

移动端日志采集与分析最佳实践

前言 做为一名移动端开发者,深刻体会日志采集对工程师来说具有重要意义,遇到问题除了 debug 调试就是看日志了,通过看日志可以帮助我们了解应用程序运行状况、优化用户体验、保障数据安全依据,本文将介绍日志采集的重要性、移动端…

高级防爬还得是公众号

平时一天也就1K的流量,最近流量暴涨,已经用自研的WAF防火墙阻挡了很多恶意攻击和爬虫,已经过滤掉很多低级攻击和爬取了。 多出的流量,也仅仅多了一个导航 dh.yu7s.com 用户,多时没有用的机器人爬虫,不封掉浪…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中,有时会发现公司里的报表,经过多人多次的重复的使用和修改后,会出现这种情况: 1.在表格里按照需要输入数字,保存工作簿。 2.然而,再次打开工作簿,里面的数字变成日期&a…

c#学习入门2

十、运算符 1)算术运算符是用于数值类型变量计算的运算符,它返回的结果是数值 1.赋值符号 2.算数运算符 加 减- 乘* 除/ 取余% 3.算数运算符的优先级 4.算术运算符的复合运算 5.算术运算符的自增减 2)字符串拼接 1.字符串拼接方式1 注意&…