根据
qa.drupal.org上Drupal 7测试性能调优提示,似乎运行测试数据库在ram磁盘中会带来最大的速度提升。
DamZ为Debian 5编写了一个修改后的mysql init.d脚本,可以完全在tmpfs中运行MySQL数据库。它在http://drupal.org/files/mysql-tmpfs.txt,附加在http://drupal.org/node/466972上。
这使得双四核机器从50分钟的测试和巨大的InnoDB磁盘I/O转变为每个测试不到3分钟。它现在作为PIFR v1的#32用于testing.d.o。这绝对是唯一的方法。
我没有也不会立即在InnoDB上尝试它,如果有人想要省略下面的skip-innodb步骤并在tmpfs上尝试它,请随意。
此外,在
这里有一些关于在OS X上创建ram磁盘的说明,虽然这是将整个mysql数据库库存移到ram磁盘中,而不仅仅是单个数据库:
更新 - 我现在已经尝试过这种方法,并记录下了我的发现
通过切换到ram磁盘,我已经能够将测试时间缩短30-50%。以下是我采取的步骤:
创建ram磁盘
我选择了1GB,主要是因为我有4GB的RAM,而且我不确定我需要多少空间,所以我会保险一些:
diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000`
安装mysql
接下来,我运行了mysql安装脚本,在新的ramdisk上安装mysql。
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/Volumes/ramdisk
然后,我采取了以下步骤:确保之前的mysqld已经停止运行,然后启动mysql守护进程,并确保我们告诉它使用ram磁盘作为我们的数据目录,而不是默认位置。
/usr/local/mysql/bin/mysqld \
--basedir=/usr/local/mysql \
--datadir=/Volumes/ramdisk \
--log-error=/Volumes/ramdisk/mysql.ramdisk.err \
--pid-file=/Volumes/ramdisk/mysql.ramdisk.pid \
--port=3306 \
--socket=/tmp/mysql_ram.sock
添加测试数据库
然后,我使用drush从我们的staging站点下载了最新的数据库转储文件,并更新了settings.php指向它的位置:
drush sql-dump > staging.project.database.dump.sql
创建符号链接 - 这是因为默认情况下mysql命令会查找
/tmp/mysql.sock
,将其符号链接到我们的短期ram磁盘上比不断更改php.ini文件更简单。接下来需要将这些数据导入本地测试设置中的ram磁盘中。这涉及创建一个指向ram磁盘数据库套接字的符号链接,并创建数据库,授予在drupal安装中指定的mysql用户权限,然后加载数据库以开始运行测试。步骤如下:
ln -s /tmp/mysql_ram.sock /tmp/mysql.sock
创建数据库(从mysql提示符处使用命令行)
CREATE DATABASE project_name;
GRANT ALL PRIVILEGES ON project_name.* to db_user@localhost IDENTIFIED BY 'db_password';
将内容加载到新数据库中...
mysql project_database < staging.project.database.dump.sql
在命令行上运行测试
最后,在命令行上运行测试,并使用growlnotify告诉我测试何时完成。
php ./scripts/run-tests.sh --verbose --class ClientFeatureTestCase testFeaturesCreateNewsItem ; growlnotify -w -m "Tests have finished."
两个测试用例需要大约一分半钟的时间,仍然非常慢 - 比我之前使用过的其他框架慢了几个数量级。
我在这里做错了什么?
这绝不能是使用Drupal运行测试的标准方式,但我没有找到任何关于Drupal测试套件需要花费多长时间的统计数据来告诉我不同的情况。