sysbench服务器性能测试

2023-01-10 18:16:20 来源:51CTO博客

1,sysbench简介

sysbench是一款开源的​​多线程​​​​性能测试​​工具,可以执行cpu/内存/线程/IO/数据库等方面的性能测试;包含以下几种测试:

cpu性能磁盘IO性能调度程序性能内存分配及传输速度POSIX线程性能数据库性能(OLTP基准测试)数据库目前支持MySQL/PostgreSQL/Oracle​

2,工具安装

编译好的离线二进制rpm包下载链接:

​​​​​​https://github.com/sqm-sys/other-packages/raw/main/sysbench.tar.gz​​


(资料图片仅供参考)

[root@server1 home]# tar zxf sysbench.tar.gz[root@server1 home]# rpm -ivh sysbench/*.rpmwarning: sysbench/ck-0.5.2-2.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEYPreparing...                          ################################# [100%]Updating / installing...1:postgresql-libs-9.2.24-8.el7_9   ################################# [ 25%]2:luajit-2.0.4-3.el7               ################################# [ 50%]3:ck-0.5.2-2.el7                   ################################# [ 75%]4:sysbench-1.0.17-2.el7            ################################# [100%]

3,配置参数详解

[root@server1 home]# sysbench --helpUsage:  sysbench [options]... [testname] [command]General options(常用选项):  --threads=N       //创建测试线程的数目。默认为1                  --events=N        //设置期望执行的时间总数。默认是0,不限制  --time=N          //最大执行时间,单位是s。默认是0,不限制。                 --forced-shutdown=STRING      //超过max-time强制中断。默认是off。    --thread-stack-size=SIZE      //每个线程的堆栈大小。默认是32k。  --rate=N                      //平均事物速率。0表示不限速  --report-interval=N            //以秒为单位定期报告具有指定间隔的统计信息。0禁用中间报告  --report-checkpoints=[LIST,...] //转储全部统计数据并在指定时间点重置所有计数器。参数是一个以逗号分隔的值列表,表示从测试开始到必须执行报告检查点所经过的时间(以秒为单位)。默认情况下报表检查点是关闭的。  --debug[=on|off]               //打印更多的调试信息,默认关闭  --validate[=on|off]             //在可能的情况下执行验证检查,默认关闭  --help[=on|off]                 //获取help帮助,以获取参数使用方式  --version[=on|off]              //查看当前版本信息  --config-file=FILENAME         //包含命令行选项的文件Pseudo-Random Numbers Generator options(伪随机数发生器选项):  --rand-type=STRING random numbers distribution {uniform,gaussian,special,pareto} [special]  --rand-spec-iter=N number of iterations used for numbers generation [12]  --rand-spec-pct=N  percentage of values to be treated as "special" (for special distribution) [1]  --rand-spec-res=N  percentage of "special" values to use (for special distribution) [75]  --rand-seed=N      seed for random number generator. When 0, the current time is used as a RNG seed. [0]  --rand-pareto-h=N  parameter h for pareto distribution [0.2]Log options(日志相关选项):  --verbosity=N   //日志详细级别 {5 - debug, 0 - 仅critical messages}  默认值 3  --percentile=N      //延时统计(latency statistics)中,需要计算的百分比 (1-100)。设置为0表示禁用百分比值计算。 Use the special  --histogram[=on|off] //在报告中打印延迟直方图,默认关闭General database options(常用数据库选项):  --db-driver=STRING  //设置程序使用的数据驱动。默认值mysql;  --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]  --db-debug[=on|off]  //打印数据库的调试信息,默认关闭Compiled-in database drivers:  mysql - MySQL driver  pgsql - PostgreSQL drivermysql options:  --mysql-host=[LIST,...]          MySQL server host [localhost]  --mysql-port=[LIST,...]          MySQL server port [3306]  --mysql-socket=[LIST,...]        MySQL socket  --mysql-user=STRING              MySQL user [sbtest]  --mysql-password=STRING          MySQL password []  --mysql-db=STRING                MySQL database name [sbtest]  --mysql-ssl[=on|off]             //使用SSL连接,默认关闭  --mysql-ssl-cipher=STRING        //为SSL连接使用特定的密码  --mysql-compression[=on|off]     //使用压缩,默认关闭  --mysql-debug[=on|off]          //跟踪所有客户端库调用信息,默认关闭  --mysql-ignore-errors=[LIST,...] //要忽略的错误列表,或"all" [1213,1020,1205]  --mysql-dry-run[=on|off]         试运行,假装所有MySQL客户端API调用都是成功的,而不执行它们,默认关闭pgsql options:  --pgsql-host=STRING     PostgreSQL server host [localhost]  --pgsql-port=N          PostgreSQL server port [5432]  --pgsql-user=STRING       --pgsql-password=STRING   --pgsql-db=STRING

4,开始测试

1,cpu性能测试

常用参数:

​--cpu-max-prime: 素数生成数量的上限 (默认值10000)​

​--threads: 线程数(默认值1)​

​--time: 运行时长,单位秒​

​--events: event上限次数,默认值为0,若设置100,则表示当完成100次event后,即使时间还有剩,也停止运行;​

执行命令进行cpu测试,cpu测试主要是进行素数的加法运算,下图中指定了最大的质数发生器数量为20000,我的测试服务器(1C)执行时间大约为9.9s;

//素数上限2万,默认10秒,2个线程sysbench --test=cpu --cpu-max-prime=20000 --threads=2  run
Running the test with following options:Number of threads: 2   //指定线程数为1(默认值)Initializing random number generator from current timePrime numbers limit: 20000     //每个线程产生的素数上限均为2万个Initializing worker threads...Threads started!CPU speed:    events per second:   387.24      //所有线程每秒完成了 387.24次eventGeneral statistics:    total time:                          10.0046s   //共耗时10秒    total number of events:              3875    //10秒内所有线程一共完成了3875次eventLatency (ms):         min:                                    2.12     // 完成1次event的最少耗时2.12毫秒         avg:                                    5.15     // 所有event的平均耗时5.15毫秒         max:                                   25.78     // 完成1次event的最多耗时25.78毫秒         95th percentile:                       14.73     // 95%次event在14.73秒毫秒内完成         sum:                                 19956.33     // 所有线程的耗时总和(每个线程耗时10秒,2个线程叠加耗时就是20秒)Threads fairness:    events (avg/stddev):           1937.5000/1.50  // 平均每个线程完成 1937次event,标准差为1.5    execution time (avg/stddev):   9.9782/0.0      // 每个线程平均耗时9.9秒,标准差为0

event:完成了几轮的素数计算;

stddev(标准差):在相同时间内,多个线程分别完成的素数计算次数是否稳定,如果数值越低,则表示多个线程的结果越接近(越稳定)。该参数对于单线程无意义;

性能指标:

如果有2台服务器进行cpu性能对比,当素数上限和线程数一致时:相同时间,比较event相同event,比较时间

2,线程测试

常用参数:

​--thread-yields:每个请求产生多少线程,默认值100​

​--thread-locks: 每个线程锁的数量,默认值8​

​--num-threads: 发送请求线程的数量​

//64个测试线程请求,每个线程请求产生100个数量,每个线程的锁数量为2sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
sysbench 1.0.17 (using system LuaJIT 2.0.4)Running the test with following options:Number of threads: 64    //指定线程数为64Initializing random number generator from current timeInitializing worker threads...Threads started!General statistics:    total time:                          10.0072s      //共耗时10秒    total number of events:              46303        //10秒内所有线程一共完成了46303次eventLatency (ms):         min:                                    0.19     // 完成1次event的最少耗时0.19毫秒         avg:                                   13.83     // 所有event的平均耗时13.83毫秒         max:                                 4636.20     // 完成1次event的最多耗时4636毫秒         95th percentile:                       36.89     // 95%次event在36.89毫秒内完成         sum:                               640152.82     // 所有线程的耗时总和(每个线程耗时10秒,64个线程叠加耗时就是64秒(1分04s)Threads fairness:    events (avg/stddev):           723.4844/1075.89       // 平均每个线程完成 723次event,标准差为1075    execution time (avg/stddev):   10.0024/0.00            // 每个线程平均耗时10秒,标准差为0

性能指标:

线程并发执行,循环响应信号量花费的时间越少越好。

3,磁盘IO性能测试

常用参数:

​file-num=N 创建测试文件的数量,默认128个​​​​file-block-size=N block size大小,默认16K​​​​file-total-size=SIZE 所有文件的总大小,默认2G​​​​file-test-mode=STRING 测试类型(seqwr:顺序写, seqrewr:顺序读写, seqrd:顺序读, rndrd:随机读, rndwr:随机写, rndrw:随机读写)​​​​file-io-mode=STRING I/O模式,需要系统支持,默认sync[sync(同步IO),async(异步IO),mmap()]​​​​file-async-backlog=N每个线程的异步操作队列数,默认128个,需要--file-io-mode=async;​​​​file-extra-flags=STRING 使用额外的标志来打开文件{sync,dsync,direct} 。默认为空​​​​file-fsync-freq=N 当请求数达到多少时执行fsync()刷新,默认100,0代表过程中不执行​​​​file-fsync-all=[on|off] 执行每一个写操作后执行fsync()刷新操作,默认关闭off​​​​file-fsync-end=[on|off] 测试结束执行fsync()操作,默认开启on​​​​file-fsync-mode=STRING 同步刷新方法,默认fsync {fsync, fdatasync}​​​​file-merged-requests=N合并指定数量的IO请求,0代表不合并,默认0​​​​file-rw-ratio=N 读写比例,默认1.5/1​

sysbench的性能测试都需要做prepare,run,cleanup这三步,准备数据,跑测试,删除数据。在准备阶段创建测试所需数据,在清理阶段删除这些数据。

//准备测试数据sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
//磁盘IO压测测试(指定最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。)sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench 1.0.17 (using system LuaJIT 2.0.4)Running the test with following options:Number of threads: 16Initializing random number generator from current timeExtra file open flags: (none)128 files, 24MiB each3GiB total file sizeBlock size 16KiBNumber of IO requests: 0Read/Write ratio for combined random IO test: 1.50Periodic FSYNC enabled, calling fsync() each 100 requests.Calling fsync() at the end of test, Enabled.Using synchronous I/O modeDoing random r/w testInitializing worker threads...Threads started!File operations:    reads/s:                      11466.89    //读操作耗时/s     writes/s:                     7644.56     //写操作耗时/s    fsyncs/s:                     24661.17    //fsyncs操作耗时/sThroughput:    read, MiB/s:                  179.17      //读的速度/s      written, MiB/s:               119.45      //写的速度/sGeneral statistics:    total time:                          10.0054s   //共耗时时间/s    total number of events:              435984     //共完成的event总数Latency (ms):         min:                                    0.00   //最小耗时         avg:                                    0.37   //平均耗时          max:                                   80.65   //最大耗时         95th percentile:                        1.86   //95% event操作耗时         sum:                               159664.15   //所有线程的耗时总和Threads fairness:    events (avg/stddev):           27249.0000/364.02  //平均每个线程完成events数/标准差    execution time (avg/stddev):   9.9790/0.00        //平均每个线程执行时间/标准差
//清除测试数据sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

性能指标:

1)衡量磁盘io性能,一般主要看以下几个指标:

IOPS:每秒读/写次数,单位为次(计数)吞吐量:每秒的读写数据量,单位为MB/s时延:I/O 操作的发送时间到接收确认所经过的时间

2)不同场景下read/s, writes/s, readMiB/s和writtent MiB/s越大越好

4,内存测试

常用参数:

​memory-block-size=SIZE 测试时内存块大小 [1K]​

​memory-total-size=SIZE 传输数据总大小 [100G]​

​memory-scope=STRING 内存访问范围{global,local}。默认是global​

​memory-oper=STRING 内存操作类型 {read, write, none} [write]​

​memory-access-mode=STRING 存储器存取方式 {seq:顺序,rnd:随机}[默认:seq]​

sysbench内存性能测试,主要是针对不同大小的块进行连续读写或者随机读写操作。在内存性能测试中,events指的是读/写一个内存块。

//指定本次测试整个过程是在内存中传输 3G 的数据量,每个 block 大小为 8K,存储器存取方式为随机sysbench --test=memory --memory-block-size=8k --memory-total-size=3G  --memory-access-mode=rnd  run
sysbench 1.0.17 (using system LuaJIT 2.0.4)Running the test with following options:Number of threads: 1    //指定默认线程1Initializing random number generator from current timeRunning memory speed test with the following options:  block size: 8KiB    #block块大小8k  total size: 3072MiB  #总大小8G  operation: write    #内存操作类型(写)  scope: global   #内存访问范围globalInitializing worker threads...Threads started!Total operations: 393216 (112796.84 per second)  //每秒处理大小3072.00 MiB transferred (881.23 MiB/sec)      //每秒传输量(881/s)General statistics:    total time:                          3.4843s   //总耗时3.4s    total number of events:              393216    //总events数,即读写一个内存块Latency (ms):         min:                                    0.00   //最小耗时,这里等于0是因为内存块太小,返回的结果数值精度不够         avg:                                    0.01   //平均耗时         max:                                   14.63   //最大耗时         95th percentile:                        0.01   //95%events耗时范围         sum:                                 3301.64   //所有线程总耗时Threads fairness:    events (avg/stddev):           393216.0000/0.00   //平均每个线程完成events数/标准差    execution time (avg/stddev):   3.3016/0.00        //平均每个线程执行时间/标准差

性能指标:

以不同块的大小传输一定得数量的数据吞吐量越大越好。

小结:本文仅实践cpu,线程,磁盘,内存性能测试,OLTP测试后续补充;

​- mem- memory-block-size=SIZE 测试时内存块大小 [1K]

- memory-total-size=SIZE 传输数据总大小 [100G]

- memory-scope=STRING 内存访问范围{global,local}。默认是global

- memory-oper=STRING 内存操作类型 {read, write, none} [write]

- memory-access-mode=STRING 存储器存取方式 {seq:顺序,rnd:随机} [默认:seq]

ory-block-size=SIZE 测试时内存块大小 [1K]

- memory-total-size=SIZE 传输数据总大小 [100G]

- memory-scope=STRING 内存访问范围{global,local}。默认是global

- memory-oper=STRING 内存操作类型 {read, write, none} [write]

- memory-access-mode=STRING 存储器存取方式 {seq:顺序,rnd:随机} [默认:seq]

标签: 性能测试 执行时间 内存操作

上一篇:c语言模拟用户输入三次密码并判断是否正确
下一篇:【独家焦点】LeetCode.209 长度最小的子数组