MySQL 8.0: MTR Configurations to Be Set to Server Defaults Where Possible

MySQL Test Run 或者 MTR,是一个MySQL测试项目。它的主要目的是为了确保MySQL服务器在新特性的功能测试阶段和旧功能完整性测试阶段符合预期。当MySQL服务器程序的任何组件出现变更时,都需要运行一系列的测试来检查这些变更是否会引起任何副作用。

MTR里的测试用例主要包含执行SQL语句和产生可以验证的结果。由于这些测试的目的是为了模仿客户端与MySQL服务器的交互,所以由MTR启动的MySQL服务的配置应该最好是与MySQL服务器的默认加载的配置相同。但是,MTR所使用的my.cnf配置文件会习惯性地将一些服务器系统参数设置设为非默认值,而不是采用默认值。而且这种配置已经被普遍使用多年,其原因可能是因为之前缺少性能强大的虚拟机。多年以来,大量的人力物力被投入到MySQL测试团队的组建之中。从当年只有少数几个工程师到现在,MySQL测试团队已经成长为一个完备的团队,并且可以用的机器也更为强大。由于每台物理机器都配置了海量内存和128 核心的处理器,因此可在在各种平台上运行数千个测试用例,这也正是本篇工作日志背后的驱动力。

WL#8795 开始仔细分析MTR使用的my.cnf配置文件,并将服务器系统变量的设置尽可能的更改为默认值。 除此之外,本日志还试图找到一些非默认设置的原因。

这篇博客将会讨论配置文件中的变量和它们的设置。

设置为服务器默认值的一些变量:

1. open-files-limit = 1024
2. local-infile
3. character-set-server = latin1
4. sort_buffer_size = 256K
5. loose-innodb_log_files_in_group = 2

下面的变量之前被设置为非默认值,但是现在已被修改为服务器的默认值:

1. key_buffer_size = 1M

由于增加这个变量的值可以为所有的读写操作提供更好的索引服务,所以在配置文件里,这个值被修改为默认值8M。这个变量的最大值是取决于服务器的物理内存大小以及每个进程的内存限制的。这也可能是之前设置为一个较小值的原因。

2. max_heap_table_size = 1M

这个变量的值被修改为默认值16M。这个值是表示允许的内存堆表大小的最大值,由于现在的机器都有了更大的内存,默认设置应该不会产生任何负面影响。

3. loose-innodb_data_file_path = ibdata1:10M:autoextend

这个变量被设置为服务器默认值: ibdata1:12M:autoextend,12M是ibdata文件的大小。现在的服务器都能够支持文件大小的增长。

4. loose-innodb_lru_scan_depth = 100

这个变量值被修改为服务器的默认值1024。

5. loose-innodb_write_io_threads = 2 and loose-innodb_read_io_threads = 2

这些默认值被设置为4。但是对于replication测试,它们被设置为2,以便于在增加并发mysqld实例数的时候,机器的aio-max-nr限制不会越界。这也是由于在MTR运行replication测试的时候会有四个以上的并发。

6. loose-innodb_log_buffer_size = 1M

innodb_log_buffer_size比较大的话,大事务在运行时就没必要在提交之前把日志写入到磁盘。这减少了磁盘I/O,这也是这个参数被设置为它的默认值16M的另一个动机。

7. binlog-direct-non-transactional-updates

默认值是OFF。设置这个变量为ON的话,会使得对非事务性表的更新直接被写入二进制日志而不是事务缓存。这解决了同时更新事务和非事务表的所有并发问题。

在配置文件里面它被设置为OFF,但在某些包含同时更新MyISAM和InnoDB表事务的测试中,它被设置为ON,以便于语句会直接写入二进制日志,从而在slave上避免由于并发问题产生的矛盾。

8. slave-net-timeout = 120

设置这个参数从120改为默认值60,以避免出现不成功的尝试。

有些变量不能设置为默认值,这是在此工作日志写作过程中发现的。

1. connect-timeout = 60

默认值是10,为了避免测试服务器在压力下的闪断,它需要设置为60。有关这个问题的详细描述,可以查看Bug #28359。

2. log-bin-trust-function-creators = 1

当启用binlog的时候,这个参数是控制存储函数创造者在不要创建会引发不安全的纪录被写进binlog的存储函数的这件事上是否可信。由于这个参数被设置为1,所以在存储函数的创建上没有强制限制。

3. log-bin = mysqld-bin

Binlog记录默认是OFF的,但是对于有多个mysqld服务器的replication测试来说,它需要设置为ON。只有在一主一从两个服务器实例的replication测试用例的配置文件中才将其设置为ON。另外,在特定测试中,如果启动了两个以上的服务器,它们都需要启用binlog记录。 其他的replication测试也需要此参数设置为ON。

4. loose-innodb_buffer_pool_size = 24M

这个参数被修改为默认值128M,并经过了测试。这个修改以及innodb-log-file-size的增加导致在使用-mem选项运行标准MTR用例时磁盘usage(/ dev / shm)增加。 -mem选项用于在内存中运行测试用例,以便运行所需的时间更少。 这导致Valgrind运行崩溃。 因此,这两个参数被设置为非默认值,因为内存无法处理它。

5. loose-innodb_log_file_size = 5M

这个参数指定在日志组中每个redo日志文件的大小。 它的默认值48M通过了测试,但由于上面提及的原因被设置为5M。

除了由于环境原因需要在配置文件中设置为非默认值的一些参数,其余的设置都为服务器默认值。 现在,MTR启动一个服务器运行所有测试用例时,其设置尽可能接近默认的MySQL服务器。 MTR作为测试MySQL代码的重要工具,用以确保测试能处于类似于社区版本的环境中,从而提升用户遇到bug前就将其找出的几率。

关于 Deepa Dixit

Deepa Dixit 2015年加入MySQL团队。她隶属于ServerQA团队,致力于确保优化器新功能的质量。查看Deepa Dixit的所有文章

Leave a Reply