mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况
使用JM压测数据库
1、点击测试计划,再点击“浏览”,把JDBC驱动添加进来;
JDBC驱动:mysql-connector-java-5.1.39-bin.jar
一般位于java环境的 \java\jre\lib\ext 文件中
2、添加线程组,设置线程数、启动时间、循环次数
3、右键点击该线程组,再添加一个配置元件:JDBC Connection Configuration
JDBC配置原件参数说明:
Variable Name(变量名):这里写入数据库连接池的名字
Database URL:数据库连接地址 (jdbc:mysql://host:port/name)
JDBC Driver class:数据库驱动(可以将需要连接的数据库驱动jar包复制到jmeter的lib/目录下,然后在设置测试计划界面,最下面的Library中导入)(com.mysql.jdbc.Driver)
4、添加JDBC请求,(取样器中添加)
Variable name:这里写入数据库连接池的名字(和JDBC Connection Configuration名字保持一致 )
Query:里面填入查询数据库数据的SQL语句(填写的SQL语句末尾不要加“;”)
parameter valus:数据的参数值
parameter types:数据的参数类型
cariable names:保存SQL语句返回结果的变量名
result cariable name:创建一个对象变量,保存所有返回结果
query timeout:查询超时时间
handle result set:定义如何处理由callable statements语句返回的结果
5、添加结果树,调试
6、添加聚合报告,查看返回结果
利用Monyog实时监控数据库:
1/链接状态
2/数据库吞吐量
3/缓存未命中
4/声明
5/CPU使用率
6/磁盘IO
随着并发的增加,服务器的处理能力或者说tps也在增加,直到到达极限值。超过并发极限值后cpu或内存资源会出现死锁、阻塞等等问题导致服务器处理能力下降。
可以根据buffer_pool配置来提升事务处理能力
Buffer Pool
简介:Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中。Buffer Pool可以用来加速数据的读写,如果Buffer Pool越大,那么Mysql就越像一个内存数据库,所以了解Buffer Pool的配置可以提高Buffer Pool的性能。
innodb_buffer_pool_size:缓存区域的大小。
innodb_buffer_pool_chunk_size:当增加或减少innodb_buffer_pool_size时,操作以块(chunk)形式执行。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认值128M。
innodb_buffer_pool_instances:当buffer pool比较大的时候(超过1G),innodb会把buffer pool划分成几个instances,这样可以提高读写操作的并发,减少竞争。读写page都使用hash函数分配给一个instances。
当增加或者减少buffer pool大小的时候,实际上是操作的chunk。buffer pool的大小必须是innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances,如果配置的innodb_buffer_pool_size不是innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances的倍数,buffer pool的大小会自动调整为innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数,自动调整的值不少于指定的值。
如果指定的buffer大小是9G,instances的个数是16,chunk默认的大小是128M,那么buffer会自动调整为10G。具体的配置可以参考mysql官网的介绍mysql reference
优化思路:
在数据库级别进行优化
表格结构合理
是否有适当的 索引来提高查询效率
是否为每个表使用适当的存储引擎
每个表是否使用适当的行格式
应用程序是否使用适当的 锁定策略
是否正确使用了用于缓存的所有内存区域?也就是说,足够大以容纳频繁访问的数据,但不能太大以至于它们会超载物理内存并导致分页。要配置的主要内存区域是InnoDB缓冲池,MyISAM密钥缓存和MySQL查询缓存。
在硬件级别进行优化
磁盘寻求。磁盘需要一段时间才能找到一块数据。对于现代磁盘,平均时间通常低于10毫秒,因此我们理论上可以做到大约100次寻找。这个时间用新磁盘慢慢改善,并且很难针对单个表进行优化。优化寻道时间的方法是将数据分配到多个磁盘上。
磁盘读写。当磁盘位于正确位置时,我们需要读取或写入数据。使用现代磁盘,一个磁盘可提供至少10-20MB / s的吞吐量。这比搜索更容易优化,因为您可以从多个磁盘并行读取。
CPU周期。当数据在主存储器中时,我们必须处理它以获得我们的结果。与内存量相比具有大表是最常见的限制因素。但是对于小桌子,速度通常不是问题。
内存带宽。当CPU需要的数据量超过CPU缓存容量时,主内存带宽成为瓶颈。对于大多数系统来说,这是一个不常见的瓶颈,但需要注意的是。
平衡可移植性和性能
要在一个可移植MySQL程序中使用面向性能的SQL扩展,可以将MySQL特定的关键字封装在/*! * /语句的注释分隔符中。其他SQL服务器将会忽略注释的关键字。
具体参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html#innodb-buffer-pool-lru