四年前,I gave a talk关于我们如何在短短几分钟内完成15分钟以上的测试套件。这主要是关于珀尔的,尽管有涉及事物的mysql方面的位。
从那时起,我的团队为套件添加了更多测试,但是我们实际上已经继续优化,使运行时间降低了。我们最近也进行了硬件更改,从我们的共同连接服务器转变为更大,更快的GCP现场实例(T2D是my testing has shown最快的),我们终于接近了半分钟的运行时间:
Yath Result Summary
----------------------------------------------------------------------------------------
File Count: 146
Assertion Count: 51338
Wall Time: 33.97 seconds
CPU Time: 322.32 seconds (usr: 7.79s | sys: 0.19s | cusr: 262.65s | csys: 51.69s)
CPU Usage: 948%
--> Result: PASSED <--
它是如此接近30秒钟,以至于任何普通人(不是),我立即开始尝试打破它。
Profiler非常清楚:经过多年的优化,除了实际的数据库调用之外,没有更多明显的瓶颈,尤其是对于我们必须创建临时DB的测试。由于MySQL是本地的,而且已经进行了微调,所以我唯一能想到的就是加快实际磁盘I/O。当然,我们已经在使用快速的SSD类型,但是为什么不大幅度更快呢?如果我刚将整个数据目录安装到RAM怎么办?这是一台测试服务器,在我们启动的每个点实例上,DB都是重置的。诚然,自硬盘时代以来,我就没有尝试使用Ramdrive,但至少值得尝试。
因此,您可以通过几种方法将MySQL数据安装在RamDrive上。假设您想将其烘烤到实际的OS映像中,然后一种方法是安装MySQL,初始化所需的DBS,停止MySQL并将数据目录移至备份位置:
mv /var/lib/mysql /var/lib/mysql.bak
您可以安装SystemD服务,该服务在启动时创建RamDrive并复制备份的SystemD服务,并将其设置为MySQL服务的要求。示例配置:
# /etc/systemd/system/mysql_ramdisk.service:
[Service]
Type=oneshot
User=root
Group=root
ExecStart=/bin/mount --types tmpfs --options rw,noatime,mode=1777,size=6g,nr_inodes=5K --source tmpfs --target /var/lib/mysql
ExecStart=/bin/cp -rp /var/lib/mysql.bak/. /var/lib/mysql/
[Install]
RequiredBy=mysql.service
就我而言,由于我想要更直接的控制/调整,所以我决定在测试套件跑步者脚本上创建RamDrive。相关部分有点像这样:
# Create the backup the first time the script is run on a server
unless (-e $mysql_data_backup) {
system "sudo systemctl stop mysql";
system "sudo mv /var/lib/mysql /var/lib/mysql.bak";
}
# Check for mountpoint, create ramdrive if required
my $check = `grep '/var/lib/mysql ' /proc/mounts`;
unless ($check =~ m#/var/lib/mysql#) {
system "sudo systemctl stop mysql";
system "sudo mkdir /var/lib/mysql" unless -e '/var/lib/mysql';
system "sudo chown mysql:mysql /var/lib/mysql";
system "sudo mount -t tmpfs -o size=6g tmpfs /var/lib/mysql";
system "sudo cp -rp /var/lib/mysql.bak/. /var/lib/mysql/";
system "sudo systemctl start mysql";
}
因此,当服务器第一次运行我们的测试套件时,创建RamDrive并将〜5GB DB复制到它时需要几秒钟。在随后的运行中,它无济于事。
之后,我尝试运行相同的测试套件:
Yath Result Summary
----------------------------------------------------------------------------------------
File Count: 146
Assertion Count: 51465
Wall Time: 25.95 seconds
CPU Time: 331.70 seconds (usr: 8.38s | sys: 0.17s | cusr: 268.70s | csys: 54.45s)
CPU Usage: 1278%
--> Result: PASSED <--
我们从34秒到26秒的运行时间。在原本非常优化的测试套件中,这几乎是25%的速度提高,只有一个简单的技巧!
SSD很快,但他们仍然无法与RAM竞争。如果您在开发系统或测试系统上有I/O瓶颈,您不在乎持久性并且可以避免RAM,请尝试一下。