性能压测工具Sysbench

性能压测工具Sysbench

工具介绍

Sysbench是一个多线程的性能测试工具,主要用于测试Linux系统下的CPU、内存、IO性能,它可以通过模拟多用户并发访问来对系统的负载性能进行评估。Sysbench通常被系统管理员和开发人员用来评估系统在高负载情况下的表现,或者比较不同硬件和软件配置对性能的影响。
Sysbench的主要功能包括:

  1. CPU性能测试:通过执行一系列计算密集型的任务来测试CPU的性能。
  2. 内存性能测试:通过分配和访问大量内存来测试系统的内存带宽和处理大量数据的能力。
  3. IO性能测试:通过读写文件来测试磁盘IO性能,可以测试不同的文件系统。
  4. 网络性能测试:虽然Sysbench原生并不支持网络性能测试,但可以通过其他工具如iperf与sysbench结合来测试网络性能。
  5. 数据库性能测试:Sysbench提供了一个OLTP测试模块,可以用来测试数据库系统的性能,它模拟了创建表、插入数据、更新数据、查询数据以及删除数据等操作。
    Sysbench的测试结果通常以每秒能够执行的操作次数(如每秒的插入、更新、查询等)来衡量系统的性能。这些测试结果对于确定系统瓶颈和优化系统配置非常有帮助。
    使用Sysbench进行测试时,可以灵活地设置各种参数,如线程数、数据量、测试时长等,以适应不同的测试需求。此外,Sysbench的脚本化程度较高,可以通过脚本来自动化测试流程,便于重复执行和比较测试结果。

测试指标介绍

1、cpu测试:找范围内最大素数,所用时间越短越好。

2、互斥锁测试:并发线程同时申请互斥锁循环一定次数花费的时间,所用时间越少越好。

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

4、IO性能测试:IOPS越大越好。

  • IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数

安装sysbench

二进制安装(建议)

  • Debian/Ubuntu
1
2
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
  • RHEL/CentOS
1
2
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
  • Fedora
1
2
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash	
sudo dnf -y install sysbench
  • Arch Linux
1
sudo pacman -Suy sysbench
  • macOS
1
2
# Add --with-postgresql if you need PostgreSQL support
brew install sysbench

源码安装

官方建议使用二进制安装方式,以下是在没有可用的二进制包情况下的使用说明。

环境依赖

  • Debian/Ubuntu
1
2
3
4
5
apt -y install make automake libtool pkg-config libaio-dev
# For MySQL support
apt -y install libmysqlclient-dev libssl-dev
# For PostgreSQL support
apt -y install libpq-dev
  • RHEL/CentOS
1
2
3
4
5
yum -y install make automake libtool pkgconfig libaio-devel
# For MySQL support, replace with mysql-devel on RHEL/CentOS 5
yum -y install mariadb-devel openssl-devel
# For PostgreSQL support
yum -y install postgresql-devel
  • Fedora
1
2
3
4
5
dnf -y install make automake libtool pkgconfig libaio-devel
# For MySQL support
dnf -y install mariadb-devel openssl-devel
# For PostgreSQL support
dnf -y install postgresql-devel
  • macOS

默认已安装Xcode(或Xcode Command Line Tools)和Homebrew的情况下:

1
2
3
4
5
6
7
brew install automake libtool openssl pkg-config
# For MySQL support
brew install mysql
# For PostgreSQL support
brew install postgresql
# openssl is not linked by Homebrew, this is to avoid "ld: library not found for -lssl"
export LDFLAGS=-L/usr/local/opt/openssl/lib

安装

源码仓库:https://github.com/akopytov/sysbench.git

1
2
3
4
5
./autogen.sh
# Add --with-pgsql to build with PostgreSQL support
./configure
make -j
make install

开始测试

1、CPU性能测试

通过计算0到10000中最大的素数所用的时间来测试。

  • 什么是进程?

进程就是程序的一次执行,是一个动态的过程。

  • 什么是线程?

线程是轻量级的进程,一个进程内可以有一个或者是多个线程,线程是CPU调度的基本单位。

  • 什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

  • 多线程的好处:

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,并不是说所有情况下用多线程都是好事,因为多线程的情况下,CPU还要花时间去维护,CPU处理各线程的请求时在线程间的切换也要花时间,所以一般情况下是可以不用多线程的,用了有时反而会得不偿失,大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等。

接下来将分别测试CPU在单线程和多线程的测试:

(1)单线程性能测试

sysbench –num-threads=1 –test=cpu –cpu-max-prime=10000 run

参数详解:

  • cpu-max-prime=N 用来选项指定最大的素数,具体参数可以根据CPU的性能来设置,默认为10000

官方系统测试结果

Pasted image 20230316091751

64位Debian测试结果

Pasted image 20230316091804

(2)多线程性能测试

sysbench –num-threads=4 –test=cpu –cpu-max-prime=10000 run

官方系统测试结果

Pasted image 20230316091820

64位Debian测试结果

Pasted image 20230316091832

2、互斥锁测试

并发线程同时申请互斥锁循环一定次数花费的时间,所用时间越少越好

sysbench –test=mutex –mutex-num=4096 –mutex-locks=50000 –mutex-loops=10000 run

参数详解:

  • mutex-num=N 数组互斥的总大小。默认是4096

  • mutex-locks=N 每个线程互斥锁的数量。默认是50000

  • mutex-loops=N 内部互斥锁的空循环数量。默认是10000

官方系统测试结果

Pasted image 20230316091921

64位Debian测试结果

Pasted image 20230316091935

3、线程测试

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

sysbench –test=threads –num-threads=1000 –thread-yields=1000 –thread-locks=8 run

(发送1000次/个测试线程请求,每次/个线程请求产生/生成1000个数量,每个线程的锁数量为8 )

参数详解:

  • thread-yields=N 指定每个请求的压力,默认为1000

  • thread-locks=N 指定每个线程的锁数量,默认为8

官方系统测试结果

Pasted image 20230316091947

64位Debian测试结果

Pasted image 20230316091956

4、IO性能测试

IOPS越大越好

接下来将会分成随机文件读写测试和文件连续读写测试

参数详解:

  • file-num=N 代表生成测试文件的数量,默认为128。

  • file-block-size=N 测试时所使用文件块的大小,如果想磁盘针对innodb存储引擎进行测试,可以将其设置 为16384,即innodb存储引擎页的大小。默认为16384。

  • file-total-size=SIZE 创建测试文件的总大小,默认为2G大小。

  • file-test-mode=STRING 文件测试模式,包含:seqwr(顺序写), v seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)。

  • file-io-mode=STRING 文件操作的模式,sync(同步),async(异步),fastmmap(快速mmap),slowmmap(慢速mmap),默认为sync同步模式。

  • file-async-backlog=N 对应每个线程队列的异步操作数,默认128。

  • file-extra-flags=STRING 打开文件时的选项,这是与API相关的参数。

  • file-fsync-freq=N 执行fsync()函数的频率。fsync主要是同步磁盘文件,因为可能有系统和磁盘缓冲的关系。 0代表不使用fsync函数。默认值为100。

  • file-fsync-all=[on|off] 每执行完一次写操作,就执行一次fsync。默认为off。

  • file-fsync-end=[on|off] 在测试结束时执行fsync函数。默认为on。

  • file-fsync-mode=STRING 文件同步函数的选择,同样是和API相关的参数,由于多个操作系统对于fdatasync支持不同,因此不建议使用fdatasync。默认为fsync。

  • file-merged-requests=N 大多情况下,合并可能的IO的请求数,默为0。

  • file-rw-ratio=N 测试时的读写比例,默认时为1.5,即可3:2。

(1)随机文件读写:

每秒读取速度, 每秒请求数量

sysbench –test=fileio –file-num=2 –file-total-size=64M –file-test-mode=rndwr run

官方系统测试结果

Pasted image 20230316092010

64位Debian测试结果

Pasted image 20230316092023

(2)文件连续读写

sysbench –test=fileio –file-num=2 –file-total-size=64M –file-test-mode=seqrewr run

官方系统测试结果

Pasted image 20230316092035

64位Debian测试结果

Pasted image 20230316092047

5、数据库测试

Sysbench通过SQL脚本来创建测试用的数据库和表。默认情况下,它使用MySQL数据库进行测试,也可以修改配置来支持其他数据库系统。创建一个数据库和表的示例SQL脚本如下:

1
2
3
4
5
6
7
8
9
10
CREATE DATABASE sysbench_test;

USE sysbench_test;

CREATE TABLE oltp_test (
id INT PRIMARY KEY AUTO_INCREMENT,
some_text TEXT,
some_integer INT,
some_float FLOAT
);
1
2
sysbench --threads=16 --time=60 --report-interval=1 /opt/homebrew/Cellar/sysbench/1.0.20_6/share/sysbench/oltp_common.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=Z*1 --mysql-db=test --tables=4 --table-size=100000 prepare
# 4张表,每张表个10万行,16线程 准备

image-20240228144707632

1
2
sysbench --threads=16 --time=60 --report-interval=1 /opt/homebrew/Cellar/sysbench/1.0.20_6/share/sysbench/oltp_point_select.lua  --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=Z*1 --mysql-db=test --tables=4 --table-size=100000 run
# 运行

image-20240228144943862

此处结果内容主要包含:

  • 时间计数/秒
  • 线程数(thds)
  • 每秒事务(tps)
  • 每秒查询数(qps)
  • 读/写/其他操作数(r/w/o)
  • 95%操作的耗时[lat(ms, 95%)]
  • 每秒的错误数(err/s)
  • 每秒的重连数(reconn/s)

SQL统计信息(SQL statistics):

  • SQL的读/写/其他/总计次数(queries performed)
  • 总事务数及每秒事务数(transactions)
  • 总查询数及每秒查询数(queries)
  • 忽略错误数据(ignored errors)
  • 重新连接数据(reconnects)

通用统计信息(General statistics):

  • 总时间(total time)
  • 总操作数(total number of events)

耗时信息(单位毫秒):

  • 最小(min)
  • 平均(avg)
  • 最大(max)
  • 95%耗时(95th percentile)
  • 总耗时(sum)
1
2
3
sysbench --threads=16 --time=60 --report-interval=1 oltp_read_write  --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=Z*1 \
--mysql-db=test --tables=4 --table-size=100000 cleanup
# 清理

参考文档

项目地址