慢PHPUnit测试

时间:2013-02-16 19:51:42

标签: php mysql phpunit

我正在运行PHPUnit来使用CIUnit(两者之间的第三方接口)测试CodeIgniter应用程序。许多测试从空的MySQL数据库中选择数据,该数据库在setUp()中填充了5-10条记录。在Windows和Web服务器(Ubuntu 10.04 / Apache 2.2 / MySQL 5.1 / PHP 5.3)上,105次测试在2-3秒内运行,内存使用量约为30mb。在我的本地(Ubuntu 12.04 / Apache 2.2 / MySQL 5.5 / PHP 5.3)上,105次测试以相同的内存使用量运行,但大约需要45秒。

我已经缩小了使用数据库的测试的缓慢程度;是否有任何我可能缺少的配置设置使测试运行速度慢15倍?如果没有,我最好的办法是尝试降级MySQL,或者甚至是Ubuntu(我已经尝试过从12.10降级到12.04)?

任何答案都非常感谢。

2 个答案:

答案 0 :(得分:5)

您最有可能遇到ext4文件系统中由barriers being default on创建的性能损失。在这里阅读更多内容:

以下是他们的行为from the docs

  

屏障=℃,| 1(*)>
  jbd代码。 barrier = 0禁用,barrier = 1启用。这也是   需要一个可以支持障碍的IO堆栈,如果jbd得到了   屏障写入错误,它将再次禁用警告。写   障碍强制执行适当的磁盘订单日志提交,制作   易失性磁盘写入缓存可以安全使用,但会有一些性能损失。   如果您的磁盘以某种方式备用电池,请禁用   障碍可以安全地提高绩效。

您可以尝试在没有它们的情况下重新安装文件系统(使用mysql数据文件所在的安装点)

mount -o remount,nobarrier /

在我的环境中,这会使Tests: 83, Assertions: 194套件的运行时间从48秒减少到6。

答案 1 :(得分:1)

通过遵循这个建议[1],我能够显着加快我的PHPUnit测试:

  

如果您使用的是InnoDB引擎(Fedora上的默认设置),请尝试将其添加到my.cnf数据库配置中:

     

的[mysqld]

     

...

     

的innodb_flush_log_at_trx_commit = 2

     

...

     

然后重新启动服务器。

它确实会降低数据库的可靠性,如果你在写作等时断电,这对于我的开发机器来说绝对是可以接受的,但我不建议将它用于生产。在[2]中查看有关可靠性的更多详细信息。

[1] http://aventinesolutions.nl/mediawiki2/index.php/PHPUnit:_a_Quick_Way_to_Speed_Up_Test_Suites?goback=.gde_1685627_member_107087295

[2] http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit