51Testing软件测试论坛

标题: 带你走进SQLITE压测工具的世界 [打印本页]

作者: 草帽路飞UU    时间: 2022-8-18 17:32
标题: 带你走进SQLITE压测工具的世界
sqlite数据库压测程序
​       SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

首先得安装sqlite3和它的头文件
[attach]141605[/attach]
固件环境
​ CPU:Intel® Core™ i7-1065G7 CPU @ 1.30GHz

​ 内存: 16G

​ 内核:linux-5.4.18-35-generic

​ 硬盘:Seagate Barracuda 2.5 5400固态硬盘

设计方案
(1)本次设计共使用四个模块,分别是

主函数(main.c):用于压测程序的主要实现。

配置接口(config.c):用于读取配置文件,去掉空行和注释行

配置文件(sqlitetest.conf):用于修改配置文件

(2)本次测试基于KylinOS V10 SP1桌面操作系统 使用sqlite3 3.31.1 进行测试

测试流程图如图所示
[attach]141606[/attach]

sqlittest程序从配置文件中读取文件,通过取出配置项中的空各项以及注释项来读取配置

主要接口

*getTickTime********:获取时间戳时间执行前的时间戳*

*callback********:回调函数记录select语句执行的次数*

*insertData********:预编译插入语句,以预编译的方式执行Insert语句*

*SelectData:预编译Select语句,使用参数化的数据库语句*

*UpdateData:预编译Update,使用参数化的数据库语句*

*threadWriteDbFunc********:写处理线程*

*threadReadDbFunc:读处理线程*
测试截图[color=rgba(0, 0, 0, 0.75)][td]
线程模式读并发写并发日志模式测试数量测试结果
单线程11WAL1000
单线程11DELETE1000
多线程1010WAL1000
多线程1010DELETE1000
串行1010WAL1000
串行1010DELETE1000

测试结论基准测试结果表明sqlite数据库在未经过调优并发量较少的情况下各种配置均能很快得到相应在预编译update语句1000条数据7ms即可完成,但负载测试的结果表明sqlite数据库在高并发的多线程的情况下性能明显下降,10000条数据即使预编译了也需要45秒左右未预编译的情况下更超过了110s。

优化方案

① 尽量使用wal模式打开数据库

② 预编译Select 和update等语句

③ 打开wal内存页可以适当增大,减少直接I/O

④ 增大异步I/O数

使用tune工具进行优化

安装 tuned
dnf -y install tuned

然后启动tuned

systemctl enable --now tuned

tuned服务帮助用户轻松改变内核设置,用户通过修改tuned的配置来修改内核参数,而不在需要在/etc/sysctl中进行更改,并且tuned提供了一系列的调优建议参数,客户不需要有调优经验也能完成性能优化。

使用tuned-adm list命令可以查看操作系统自带的一些配置和介绍,系统默认值为“吞吐量性能”目的是提高吞吐量,可以运行tuned-adm active查看当前系统使用的配置参数,tuned的默认配置参数在/usr/lib/tuned/目录下

通用参数
首先在/etc/tuned目录下创建一个文件夹

mkdir /etc/tuned/oracle

然后生成配置文件

vim /etc/tuned/oracle/tuned.conf

#

# tuned configuration

#

[main]

summary=Tuned profile for Oracle RDBMS

[cpu]

#CPU性能模式

governor=performance

energy_perf_bias=performance

#最小可用功率

min_perf_pct=100

[sysctl]

vm.swappiness = 10

#降低脏背景比率/增加脏背景比率

vm.dirty_background_ratio = 3

vm.dirty_ratio = 40

vm.dirty_expire_centisecs = 500

vm.dirty_writeback_centisecs = 250

#内核分配策略允许分配超过所有物理内存和交换空间总和的内存

vm.overcommit_memory=2

#配置数据库使用的共享内存

kernel.shmmax = 4398046511104

kernel.shmall = 1073741824

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 6815744

#异步I/O

fs.aio-max-nr = 1048576

#能够使用的端口号

net.ipv4.ip_local_port_range = 9000 65499

#网络缓存

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

#TCP报文时间戳

net.ipv4.tcp_timestamps=0

#内核内部错误时触发panic

kernel.panic_on_oops = 1

#减少任务的重新迁移,高吞吐量不设置

kernel.sched_migration_cost_ns=50000000

#减少实时进程调度频率

kernel.sched_min_granularity_ns=10000000

#仅在注重吞吐量的情况下设置该参数,低延迟的情况不要设置

kernel.sched_wakeup_granularity_ns=15000000

[vm]

#关闭透明巨页

transparent_hugepages=never

该文件[]内的参数是与系统交互部分的参数和值

[main]包含摘要信息,还可以使用include语句包含来自其他优化配置文件的值。

[cpu]包含cpu调控器的设置和cpu电源设置。

[sysctl]包含与procfs交互的值。

[vm]和[bootloader]插件启用/禁用透明的大型页面(bootloader插件将帮助我们与GRUB命令行参数交互)。

通过以上参数设置实现以下功能

CPU进入性能模式(数据库性能不会出现随机性能下降。

不使用swap来交换内存,并提高数据库进程的oom分值始终在内存中。

内核辅助数据库脏页回写,减少回写和检查点的负载

写缓存更快落盘

关闭TCP的时间戳避免由TCP时间戳导致的问题

禁止透明巨页,预先分配好巨页,防止内存碎片化严重的时候无法分配巨页

配置完该文件后使用以下命令使配置文件生效

tuned-adm profile oracle

等待该命令执行完成后,还需要重新编译一下grub.cfg文件并重启使禁止透明巨页生效

grub2-mkconfig -o /boot/grub2/grub.cfg

reboot





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2