在一些大型项目中,数据库性能往往是整体性能的瓶颈。达梦数据库作为国产数据库的代表,在各行各界中有着广泛使用,而kylin10 sp1作为国产操作系统的代表,二者的兼容性与性能表现备受关注。本文将详细介绍如何在Kylin10 SP1 环境下使用 jmeter 对 达梦 数据库进行压测,为数据库性能优化提供数据支撑。
将下载的DM8(dm8_20250507_FTarm2000_kylin10_sp1_64.iso)iso文件解压,将其中的DMInstall.bin文件移动到需要安装目录下
使用
chmod 755 ./DMInstall.bin
命令,为文件赋予执行权限,接着执行
./DMInstall.bin -i
命令,执行命令行安装程序。
注意事项:上述命令的参数-i
是指使用使用命令行进行安装,如果需要使用图形化安装直接使用命令:
./DMInstall.bin
即可
执行完安装指令后,会进行一些基础设置,根据自己需求选择即可。走到下图所示即表示安装完成。
在启动数据库之前,首先先得对数据库进行初始化,注册实例。我们首先进入到安装完成的dm8的bin目录下:
cd /data/test6/dljDmTest/dmdbms/bin/
在该目录下执行命令:
./dminit path=/data db_name=dljDmTest instance_name=dljDmTest port_num=1111 page_size=16 CASE_SENSITIVE=0 sysdba_pwd="admin123!@#A" SYSAUDITOR_PWD="admin123!@#A" log_size=256 BUFFER=1024 AUTO_ADJ_CPUS=0
进行数据库初始化。
**注意事项:**在这里我设置的port_num=1111
表示设置DM数据库的运行端口为1111,可以根据自己的需求进行修改。
下面是对上述命令的参数解释
关键字 | 说明(默认值) |
---|---|
PATH | 初始数据库存放的路径 |
DB_NAME | 数据库名(DAMENG) |
INSTANCE_NAME | 实例名(DMSERVER) |
PORT_NUM | 监听端口号(5236) |
PAGE_SIZE | 数据页大小(8),可选值:4, 8, 16, 32,单位:K |
CASE_SENSITIVE | 大小敏感(Y),可选值:Y/N,1/0 |
SYSDBA_PWD | 设置SYSDBA密码 |
SYSAUDITOR_PWD | 设置SYSAUDITOR密码 |
LOG_SIZE | 日志文件大小(4096),单位为:M,范围为:256M ~ 8G |
BUFFER | 系统缓存大小(8000),单位M |
初始化完成之后,使用命令:
cd dljDmTest/dmdbms/bin
进入到达梦数据库安装的bin目录下,在该目录下使用命令:
./dmserver /data/test6/dljDmTest/dmdbms/dljDmTest/dljDmTest/dm.ini
**注意事项:**这里的/data/test6/dljDmTest/dmdbms/dljDmTest/dljDmTest/dm.ini
应该改成你自己安装的DM数据库中dm.ini
路径。
即可启动数据库。
输出SYSTEM IS READY即表示数据库启动成功。
因为JMeter的运行依赖于jdk。而JMeter 5.6.3需要jdk 1.8及以上环境才可以运行,所以首先我们需要验证一下服务器中是否存在jdk1.8以上的环境。
使用
java -version
如上所示,我的服务器中已存在jdk 1.8.0_272环境。
首先我们现在服务器上创建jmeter
目录,用来存放jmeter
压缩包,使用命令:
mkdir jmeter
这里我将apache-jmeter-5.6.3.zip
上传到服务器的jmeter目录下,并使用命令
unzip apache-jmeter-5.6.3.zip
进行解压,下图即表示安装成功。
解压完成后,进入到解压后的bin目录下,在bin目录下使用命令
./jmeter -v
出现下面消息即表示JMeter安装成功。
注意事项:jmeter
解压后就不需要额外的配置,通过命令:
./jmeter -n -t 路径/001.jmx -l 路径/001.jtl
即可执行测试计划生成测试结果。
下图是本次测试DM数据库的Jmeter
生成的测试示例中用到的菜单树和子项。下面我将一个一个介绍下述子项。
在上图红框区域可以选择要引入的jar包,比如说本次测试是测DM数据库,那么我们就需要引入DM的jdbc
驱动,我们此时需要将jdbc
驱动引入到Linux
服务器中的Jmeter
中,驱动可以直接在DM8的安装包下面的目录\source\drivers\jdbc
下查找到,选择DmJdbcDriver8.jar
驱动即可。
需要将DMJdbcDriver8.jar
包引入到服务器中的jmeter
下。而一般jmeter
引入的驱动存放在目录/jmeter/apache-jmeter-5.6.3/lib/ext
下面。
线程组
例如上图,我这里设置的就是每秒启动5个线程,每个线程循环执行1000次,合计执行5000次。
JDBC Connection Configuration
jdbc:dm://IP:端口
。dm.jdbc.driver.DmDriver
。JDBC Request:
监听器:
首先我们先进入到jmeter的安装目录中,在该目录下创建jmx和jtl目录
mkdir jmx
mkdir jtl
其中jmx目录用来存放测试计划,我们先在windows上面的jmeter生成我们的测试计划,然后将这些测试计划放入到jmx目录中。
而jtl目录用来存放执行jmx测试计划后生成的测试结果。
我们首先在windows
的jmeter
下面生成测试计划001.jmx
首先线程组设置为:
JDBC Connection Configuration
设置为:
在JDBC Request
中设置的请求SQL语句为:
SELECT count(*) FROM sysobjects;
首先先测试查询语句。
然后将测试计划保存为001.jmx
,将该测试计划放入上一步创建的jmx
目录中
注意事项:
这个位置需要修改为你的DM数据库的服务器地址和端口。
进入到服务器的jmeter的bin目录下,然后到该目录下执行以下命令:
./jmeter -n -t /data/test6/dljDmTest/jmeter/apache-jmeter-5.6.3/jmx/001.jmx -l /data/test6/dljDmTest/jmeter/apache-jmeter-5.6.3/jtl/001.jtl
该命令的意思就是通过jmeter
执行/data/test6/dljDmTest/jmeter/apache-jmeter-5.6.3/jmx
目录下的001.jmx
文件,然后将执行结果生成为/data/test6/dljDmTest/jmeter/apache-jmeter-5.6.3/jtl
目录下的001.jtl
文件。
在执行完上述命令后,发现jmeter报错如下:![image-20250711170533075]
通过排查发现是dm数据库查询不到jdbc
驱动。
于是我查看执行计划,发现一下问题:
此处使用的jdbc
驱动是我windows
系统引入的驱动。
注意事项:我们此时需要将jdbc
驱动引入到Linux
服务器中的Jmeter
中,驱动可以直接在DM8的安装包下面的目录\source\drivers\jdbc
下查找到,选择DmJdbcDriver8.jar
驱动即可。
需要将DMJdbcDriver8.jar
包引入到服务器中的jmeter
下。而一般jmeter
引入的驱动存放在目录/jmeter/apache-jmeter-5.6.3/lib/ext
下面。
将准备好的jar包放入到 JMeter 安装目录下的lib/ext
目录。再次测试:
发现已经Jmeter可以成功跑通测试。
通过测试后会在jtl
目录下生成001.jtl
文件,将生成的jtl
文件迁移到windows
下面,然后通过windows
下的jmeter即可查看测试结果![image-20250711173439031]
之后可以通过不断调整线程组,来测试dm服务器的瓶颈和性能。
本次压测的目的是探究DM数据库的连接池最大线程数没有实际请求线程数多会造成怎样的后果。
预测当DM数据库的连接池最大线程数没有实际请求线程数多,会导致线程等待连接,影响压测效率。
达梦数据库自身有最大连接数限制(默认值和配置值),可通过数据库内置视图或配置文件查看:
登录到DM数据库后,执行以下 SQL 查看当前数据库允许的最大连接数:
SELECT SF_GET_PARA_VALUE(2, 'MAX_SESSIONS');
MAX_SESSIONS
是达梦数据库控制最大并发会话(连接)数的参数,默认值为 100,最大值可设置为 65535。这里我查询出来的最大连接数为2500。
达梦数据库的参数配置文件为dm.ini
,可通过以下步骤查看:
找到数据库实例的dm.ini
路径(初始化数据库时指定,例如/data/test6/dljDmTest/dmdbms/dljDmTest/dljDmTest/dm.ini
)。
使用grep
命令搜索MAX_SESSIONS
参数:
grep "MAX_SESSIONS" /data/test6/dljDmTest/dmdbms/dljDmTest/dljDmTest/dm.ini
输出结果类似:MAX_SESSIONS = 100
,即表示当前最大连接数限制为 100。
这里我通过命令查询出来,可以看到最大的连接数同样是2500。
上面我们查询出来的最大连接数为2500,这个数有点大不适合我们测试,我们将连接池的最大连接线程数改的稍微低一些。
我们可以通过SQL进行修改:
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 100); -- 将最大连接数改为500
修改后重启数据库,然后再次查询连接池最大连接数
再次通过上述两种方法都可以看出我们已经成功修改完成了连接池最大线程数。
这里我准备了两个测试用例001.jmx
和002.jmx
,下面是这两个测试用例的参数设置,两种测例的总请求数都为15000次。
001.jmx
下面是测例001.jmx
,我这里设置的模拟的并发用户数为50,小于连接池最大线程数100。总请求数为15000。
002.jmx
下面是测例001.jmx
,我这里设置的模拟的并发用户数为150,大于连接池最大线程数100。总请求数为15000。
执行的sql语句相同。
我们将这两个测试用例通过标题四所示过程放入到服务器中进行测试。
在执行的输出中,我们就可以初步看出001.jmx
的执行通过率为100%,全部执行完成时间为9秒。
002.jmx
的错误率为1.7%,错误请求数为2407,全部执行完成时间为1分4秒,两者之间的差距明显。
下面我将结合两者输出的jtl文件进行分析。
001.jtl
,下面是测试用例001.jmx
的测试结果文件,查看报告可看出错误率为0%,无错误请求。全部执行完成时间为9秒。
002.jtl
,下面是测试用例002.jmx
生成的测试结果文件,查看报告可看出错误率为1.7%,错误请求数为2407。全部执行完成时间为1分4秒
通过排查002.jtl
结果树,发现错误请求报错如下:
“Communication error” 直接指向网络层通信失败,即 JMeter 无法通过配置的 IP 和端口与达梦数据库建立连接。原因是请求的线程过多,错误请求长时间抢占不到连接池线程超时报错。
所以若连接池最大连接数小于线程数,会导致线程等待连接,影响压测效率,线程数设置过大会增加服务器负载,若超过数据库处理能力,会导致响应时间变长、错误率上升。
通过上述步骤的配置,我们可以成功在在服务器上部署达梦数据库和Jmeter
压测工具,然后通过编写Jmeter
测试计划,来测出服务器的使用达梦数据库时的性能瓶颈。能够帮助我们更好的调试参数,让达梦数据库在服务器上有更好的表现。同时我们也知道若连接池最大连接数小于线程数,会导致线程等待连接,影响压测效率,线程数设置过大会增加服务器负载,若超过数据库处理能力,会导致响应时间变长、错误率上升,所以我们应该合理设置DM数据库连接池的最大线程数,以保证不会对数据库出来能力产生影响。
文章
阅读量
获赞