单组件式测试工具
有一些有用的工具可以测试MySQL 和基于MySQL 的系统的性能 节将演示如何利用这些工具进行测试
mysqlslap
mysqlslap(//dev mysql /doc/refman/ /en/mysqlslap )可以模拟服务器的负载 并输出计时信息 它包含在MySQL 的发行包中 应该在MySQL 或者更新的版本中都可以使用 测试时可以执行并发连接数 并指定SQL 语句(可以在命令行上执行 也可以把SQL 语句写入到参数文件中) 如果没有指定SQL 语句 mysqlslap 会自动生成查询schema 的SELECT 语句
MySQL Benchmark Suite (sql bench)
在MySQL 的发行包中也提供了一款自己的基准测试套件 可以用于在不同数据库服务器上进行比较测试 它是单线程的 主要用于测试服务器执行查询的速度 结果会显示哪种类型的 *** 作在服务器上执行得更快
这个测试套件的主要好处是包含了大量预定义的测试 容易使用 所以可以很轻松地用于比较不同存储引擎或者不同配置的性能测试 其也可以用于高层次测试 比较两个服务器的总体性能 当然也可以只执行预定义测试的子集(例如只测试UPDATE 的性能) 这些测试大部分是CPU 密集型的 但也有些短时间的测试需要大量的磁盘I/O *** 作
这个套件的最大缺点主要有 它是单用户模式的 测试的数据集很小且用户无法使用指定的数据 并且同一个测试多次运行的结果可能会相差很大 因为是单线程且串行执行的 所以无法测试多CPU 的能力 只能用于比较单CPU 服务器的性能差别 使用这个套件测试数据库服务器还需要Perl 和BDB 的支持 相关文档请参考//dev mysql /doc/en/mysql benchmarks /
Super Smack
Super Smack(//vegan net/tony/super ack/)是一款用于MySQL 和PostgreSQL的基准测试工具 可以提供压力测试和负载生成 这是一个复杂而强大的工具 可以模拟多用户访问 可以加载测试数据到数据库 并支持使用随机数据填充测试表 测试定义在 ack 文件中 ack 文件使用一种简单的语法定义测试的客户端 表 查询等测试要素
Database Test Suite
Database Test Suite 是由开源软件开发实验室(OSDL Open Source DevelopmentLabs)设计的 发布在SourceFe 网站(//sourcefe net/projects/osdldbt/)上 这是一款类似某些工业标准测试的测试工具集 例如由事务处理性能委员会(TPC Transaction Processing Performance Council)制定的各种标准 特别值得一提的是 其中的dbt 就是一款免费的TPC C OLTP 测试工具(未认证) 之前本书作者经常使用该工具 不过现在已经使用自己研发的专用于MySQL 的测试工具替代了
Percona s TPCC MySQL Tool
我们开发了一个类似TPC C 的基准测试工具集 其中有部分是专门为MySQL 测试开发的 在评估大压力下MySQL 的一些行为时 我们经常会利用这个工具进行测试(简单的测试 一般会采用sy ench 替代) 该工具的源代码可以在//launchpad net/perconatools 下载 在源码库中有一个简单的文档说明
sy ench
sy ench(//launchpad net/sy ench)是一款多线程系统压测工具 它可以根据影响数据库服务器性能的各种因素来评估系统的性能 例如 可以用来测试文件I/O *** 作系统调度器 内存分配和传输速度 POSIX 线程 以及数据库服务器等 sy ench 支持Lua 脚本语言(// lua ) Lua 对于各种测试场景的设置可以非常灵活 sy ench 是我们非常喜欢的一种全能测试工具 支持MySQL *** 作系统和硬件的硬件测试
返回目录 高性能MySQL
编辑推荐
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程
lishixinzhi/Article/program/MySQL/201311/29732
benchmarksql缺数据的解决办法:
1、检查数据源配置:请确保您已经正确地配置了数据源,并且输入的数据库名、表名、用户名和密码正确无误。
2、增加数据量:您可以尝试增加数据量,以确保benchmarksql有足够的数据来执行测试。您可以通过手动插入数据或者使用数据生成工具来实现。
3、检查数据生成工具:如果您使用了数据生成工具来生成数据,请确保生成的数据符合您的要求并且没有错误。
4、检查数据库设置:如果您使用的是MySQL数据库,您可能需要检查数据库设置,例如innodb_buffer_pool_size和innodb_log_file_size等参数。
1.激励的设置
相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。
方法1:为双向端口设置中间变量inout_reg作为该inout的输出寄存,inout口在testbench中要定义为wire型变量,然后用输出使能控制传输方向。
eg:
inout [0:0] bi_dir_port;
wire [0:0] bi_dir_port;
reg [0:0] bi_dir_port_reg;
reg bi_dir_port_oe;
assign bi_dir_port=bi_dir_port_oebi_dir_port_reg:1'bz;
用bi_dir_port_oe控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用inout双向口互连。往端口写(就是往模块里面输入)
方法2:使用force和release语句,这种方法不能准确反映双向端口的信号变化,但这种方法可以反映块内信号的变化。具体如示:
module test();
wire data_inout;
reg data_reg;
reg link;
#xx; //延时
force data_inout=1'bx; //强制作为输入端口
#xx;
release data_inout; //释放输入端口
endmodule
从文本文件中读取和写入向量
1)读取文本文件:用 $readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh
用于读取十六进制文件。例如:
reg [7:0] mem[1:256] // a 8-bit, 256-word
定义存储器mem
initial $readmemh ( "memdata", mem ) // 将dat文件读入寄存器mem中
initial $readmemh ( "memdata", mem, 128, 1 ) // 参数为寄存器加载数据的地址始终
2)输出文本文件:打开输出文件用$fopen 例如:
integer out_file; // out_file 是一个文件描述,需要定义为 integer类型
out_file = $fopen ( " cpudata " ); // cpudata 是需要打开的文件,也就是最终的输出文本
设计中的信号值可以通过$fmonitor, $fdisplay,
2 Verilog和Ncverilog命令使用库文件或库目录
ex) ncverilog -f runf -v
lib/libv -y lib2 +libext+v //一般编译文件在runf中,
库文件在libv中,lib2目录中的v文件系统自动搜索
使用库文件或库目录,只编译需要的模块而不必全部编译
3.Verilog Testbench信号记录的系统任务:
1) SHM数据库可以记录在设计仿真过程中信号的变化 它只在probes有效的时间内记录你set probe
on的信号的变化
ex) $shm_open("wavesshm");
//打开波形数据库
$shm_probe(top,
"AS"); // set probe on
"top",
第二个参数:
A -- signals of the specific scrope
S
-- Ports of the specified scope and below, excluding library
cells
C
-- Ports of the specified scope and below, including library
cells
AS
-- Signals of the specified scope and below, excluding library
cells
AC
-- Signals of the specified scope and below, including library
cells
还有一个
M ,表示当前scope的memories, 可以跟上面的结合使用, "AM" "AMS"
"AMC"
什么都不加表示当前scope的ports;
$shm_close
//关闭数据库
2) VCD数据库也可以记录在设计仿真过程中信号的变化
它只记录你选择的信号的变化
ex) $dumpfile("filename");
//打开数据库
$dumpvars(1,
topu1); //scope = topu1, depth =
1
第一个参数表示深度,
为0时记录所有深度;
第二个参数表示scope,省略时表当前的scope
$dumpvars;
//depth = all scope =
all
$dumpvars(0);
//depth = all scope =
current
$dumpvars(1,
topu1); //depth = 1 scope =
topu1
$dumpoff
//暂停记录数据改变,信号变化不写入库文件中
$dumpon
//重新恢复记录
3) Debussy
fsdb数据库也可以记录信号的变化,它的优势是可以跟debussy结合,方便调试
如果要在ncverilog仿真时,记录信号,
首先要设置debussy:
a setenv LD_LIBRARY_PATH
:$LD_LIBRARY_PATH
(path for
debpliso file
(/share/PLI/nc_xl//nc_loadpli1))
b while
invoking ncverilog use the +ncloadpli1
option
ncverilog -f
runf +debug
+ncloadpli1=debpli:deb_PLIPtr
fsdb数据库文件的记录方法,是使用$fsdbDumpfile和$fsdbDumpvars系统函数,使用方法参见VCD
注意:
在用ncverilog的时候,为了正确地记录波形,要使用参数: "+access+rw", 否则没有读写权限
在记录信号或者波形时需要指出被记录信号的路径,如:tbmoduleu1clk
………………………………………………………………………………………………………
关于信号记录的系统任务的说明:
在testbench中使用信号记录的系统任务,就可以将自己需要的部分的结果以及波形文件记录下来(可采用sigalscan工具查看),适用于对较大的系统进行仿真,速度快,优于全局仿真。使用简单,在testbench中添加:initial
begin
$shm_open("wavesshm");
$shm_probe("要记录信号的路径“,”AS“);
#10000
$shm_close; 即可。
4 ncverilog编译的顺序: ncverilog file1 file2
有时候这些文件存在依存关系,如在file2中要用到在file1中定义的变量,这时候就要注意其编译的顺序是
从后到前,就先编译file2然后才是file2
5
信号的强制赋值force
首先, force语句只能在过程语句中出现,即要在initial 或者 always 中间 去除force
用 release 语句
initial begin
force sig1 = 1'b1; ; release sig1;
end
force可以对wire赋值,这时整个net都被赋值; 也可以对reg赋值
6.加载测试向量时,避免在时钟的上下沿变化
为了模拟真实器件的行为,加载测试向量时,避免在时钟的上下沿变化,而是在时钟的上升沿延时一个时间单位后,加载的测试向量发生变化。如:
assign #5 c=a^b
……
@(posedge clk) #(01`cycle) A=1;
//testbench的波形输出
module top;
initial
begin
$dumpfile("/topvcd");
//存储波形的文件名和路径,一般是vcd格式
$dumpvars(1,top);
//存储top这一层的所有信号数据
$dumpvars(2,topu1);
//存储topu1之下两层的所有数据信号(包含topu1这一层)
$dumpvars(3,topu2);
//存储topu2之下三层的所有数据信号(包含topu2这一层)
$dumpvars(0,topu3);
//存储topu3之下所有层的所有数据信号
end
endmodule
//产生随机数,seed是种子
$random(seed);
ex: din <= $random(20);
//仿真时间,为unsigned型的64位数据
$time
ex:
time condition_happen_time;
condition_happen_time = $time;
$monitor($time,"data utput = %d", dout);
//参数
parameter para1 = 10,
para2 = 20,
para3 = 30;
//显示任务
$display();
//监视任务
$monitor();
//延迟模型
specify
//describ pin-to-pin delay
endspecify
ex:
module nand_or(Y,A,B,C);
input A,B,C;
output Y;
AND2 #02 (N,A,B);
OR2 #01 (Y,C,N);
specify
(A->Y) = 02;
(B->Y) = 03;
(C->Y) = 01;
endspecify
endmodule
//时间刻度
`timescale 单位时间/时间精确度
//文件I/O
1打开文件
integer file_id;
file_id = fopen("file_path/file_name");
2写入文件
//$fmonitor只要有变化就一直记录
$fmonitor(file_id, "%format_char", parameter);
eg:$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);
//$fwrite需要触发条件才记录
$fwrite(file_id, "%format_char", parameter);
//$fdisplay需要触发条件才记录
$fdisplay(file_id, "%format_char", parameter);
$fstrobe();
3读取文件
integer file_id;
file_id = $fread("file_path/file_name", "r");
4关闭文件
$fclose(fjile_id);
5由文件设定存储器初值
$readmemh("file_name", memory_name"); //初始化数据为十六进制
$readmemb("file_name", memory_name"); //初始化数据为二进制
//仿真控制
$finish(parameter); //parameter = 0,1,2
$stop(parameter);
//读入SDF文件
$sdf_annotate("sdf_file_name", module_instance, "scale_factors");
//module_instance: sdf文件所对应的instance名
//scale_factors:针对timming delay中的最小延时min,典型延迟typ,最大延时max调整延迟参数
//generate语句,在Verilog-2001中定义用于表达重复性动作
//必须事先声明genvar类型变量作为generate循环的指标
eg:
genvar i;
generate for(i = 0; i < 4; i = i + 1)
begin
assign = din[i] = i % 2;
end
endgenerate
//资源共享
always @(A or B or C or D)
sum = sel (A+B):(C+D);
//上面例子使用两个加法器和一个MUX,面积大
//下面例子使用一个加法器和两个MUX,面积小
always @(A or B or C or D)
begin
tmp1 = sel A:C;
tmp2 = sel B:D;
end
always @(tmp1 or tmp2)
sum = tmp1 + tmp2;
模板:
module testbench; //定义一个没有输入输出的module
reg ……
//将DUT的输入定义为reg类型
……
wire……
//将DUT的输出定义为wire类型
……
//在这里例化DUT
initial
begin
……
//在这里添加激励(可以有多个这样的结构)
end
always……
//通常在这里定义时钟信号
initial
//在这里添加比较语句(可选)
end
initial
//在这里添加输出语句(在屏幕上显示仿真结果)
end
endmodule
一下介绍一些书写Testbench的技巧:
1如果激励中有一些重复的项目,可以考虑将这些语句编写成一个task,这样会给书写和仿真带来很大方便。例如,一个存储器的testbench的激励可以包含write,read等task。
2如果DUT中包含双向信号(inout),在编写testbench时要注意。需要一个reg变量来表示其输入,还需要一个wire变量表示其输出。
3如果initial块语句过于复杂,可以考虑将其分为互补相干的几个部分,用数个initial块来描述。在仿真时,这些initial块会并发运行。这样方便阅读和修改。
4每个testbench都最好包含$stop语句,用以指明仿真何时结束。
最后提供一个简单的示例(转自Xilinx文档):
DUT:
module shift_reg (clock, reset, load, sel, data, shiftreg);
input clock;
input reset;
input load;
input [1:0] sel;
input [4:0] data;
output [4:0] shiftreg;
reg [4:0] shiftreg;
always @ (posedge clock)
begin
if (reset)
shiftreg = 0;
else if (load)
shiftreg = data;
else
case (sel)
2’b00 : shiftreg = shiftreg;
2’b01 : shiftreg = shiftreg << 1;
2’b10 : shiftreg = shiftreg >> 1;
default : shiftreg = shiftreg;
endcase
end
endmodule
Testbench:
module testbench; // declare testbench name
reg clock;
reg load;
reg reset; // declaration of signals
wire [4:0] shiftreg;
reg [4:0] data;
reg [1:0] sel;
// instantiation of the shift_reg design below
shift_reg dut(clock (clock),
load
(load),
reset
(reset),
shiftreg
(shiftreg),
data
(data),
sel
(sel));
//this process block sets up the free running clock
initial begin
clock = 0;
forever #50 clock = ~clock;
end
initial begin// this process block specifies the stimulus
reset = 1;
data = 5’b00000;
load = 0;
sel = 2’b00;
#200
reset = 0;
load = 1;
#200
data = 5’b00001;
#100
sel = 2’b01;
load = 0;
#200
sel = 2’b10;
#1000 $stop;
end
initial begin// this process block pipes the ASCII results to the
//terminal or text editor
$timeformat(-9,1,"ns",12);
$display(" Time Clk Rst Ld SftRg Data Sel");
$monitor("%t %b %b %b %b %b %b", $realtime,
clock,
reset, load, shiftreg, data, sel);
end
endmodule
另存为时候更改文件名后缀。
根据博客园查询显示,用记事本打开文件,另存为其他文件时候在文件名的后缀加上需要更改的文件类型,保存类型为文本文档,即可更改worrkbench保存文件类型。
Workbench是一款专为MySQL设计的ER和数据库建模工具。
说到benchmaeksql,其实很多人并不陌生
因为它确实在对数据库的测试过程中起到了一定的作用。现在很多数据库用户也会将这个测试的结果作为衡量数据库好坏的一个因素之一。
但是我相信,很多人在使用的过程中,也应该发现了benchmarksql的一些不足之处。
下面我将说一下个人的愚见,也许是自己 *** 作过程中的问题,毕竟才踏入数据库开发的行列,还是一个菜鸟,在不停的学习中。
首先,个人呢觉得在数据加载这一块,做的不是很好,查看了一下load那一块的代码,发现对所有的数据都是insert进去的,这样的效率应该是相对于copy来说是慢很多的。
其次在最后进行数据测试的时候,如果设置为1个terminals的时候,可能看不出什么问题。但是当设置较大的时候,例如测试100个warehouse,根据测试规则,100个warehouse的时候,最多可以有1000个terminals,这个时候,就会发现经常回出现键值唯一的错误,出现这个错误应该是正常的,但是不应该在这个错误出现之后,报出java堆栈的错误,这个应该是一个bug吧
并且我查看了源代码之后,也发现了一个问题,就是在事物提交更新的那个模块,并没有做到一个sql语句进行一次事物提交,而是在两个或者更多的sql处理之后才进行提交 *** 作。这个在做数据更新的时候可能会出错。具体网上应该有很多这样的文章,如果第一个错误,第二个提交事务的时候会报错,这个觉得应该需要修正一下。
另外在配置方面,在网上查了很久都没有说一个具体的配置之间的关联和最有配置。
这个目前根据自身的经验,我觉得和机子的配置有关,不同的配置,我们可以设置共享内存和存储方面
在每分钟执行事务数的那个配置,我们可以根据配置慢慢调整。我的做法是:设定好运行10分钟,1个terminals,100个warehouse,然后从1000开始,每次上涨10000,然后运行完之后看吞吐量,如果到达一个值之后,有所降低,然后在每次减1000或2000,直到找到最优值。
然后每分钟执行事务数设置找到的最优值,在调试terminals。从1000开始,往回每次减100,按照找limitTxnsPerMin的方法找出最优值即可。
当然这种方式找出的值,对不同主机和不同配置都是有所不同的。同时需要注意的是当terminals越大的时候,你会发现在执行的过程中,出现违反键值唯一约束的问题也就越多。不过我认为这个是正常的。
Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址:
MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
MySQL-client - MySQL 客户端程序,用于连接并 *** 作Mysql服务器。
MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclientso),使用MySQL。
MySQL-bench - MySQL数据库服务器的基准和性能测试工具。
以下安装Mysql RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如:Centos。
安装步骤如下:
使用root用户登陆你的Linux系统。
下载Mysql RPM包,下载地址为:MySQL 下载。
通过以下命令执行Mysql安装,rpm包为你下载的rpm包:
[root@host]# rpm -i MySQL-509-0i386rpm
以上安装mysql服务器的过程会创建mysql用户,并创建一个mysql配置文件mycnf。
你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。
以下是一些mysql可选包的安装过程,你可以根据自己的需要来安装:
[root@host]# rpm -i MySQL-client-509-0i386rpm
[root@host]# rpm -i MySQL-devel-509-0i386rpm
[root@host]# rpm -i MySQL-shared-509-0i386rpm
[root@host]# rpm -i MySQL-bench-509-0i386rpm
以上就是关于高性能MySQL:单组件式测试工具全部的内容,包括:高性能MySQL:单组件式测试工具、benchmarksql缺数据、如何编写testbench的总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)