5

我正在运行 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)?

任何答案都非常感谢。

4

2 回答 2

5

您很可能会遇到由于在 ext4 文件系统barriers中默认打开而造成的性能损失。在此处阅读更多内容:

这是他们从文档中所做的:

屏障=<0|1(*)>
jbd 代码。barrier=0 禁用,barrier=1 启用。这也需要一个可以支持屏障的 IO 堆栈,如果 jbd 在屏障写入时出错,它将再次禁用并发出警告。写屏障强制执行日志提交的正确磁盘顺序,使易失性磁盘写缓存可以安全使用,但会降低一些性能。如果您的磁盘以一种或另一种方式由电池供电,则禁用屏障可以安全地提高性能。

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

mount -o remount,nobarrier /

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

于 2013-02-16T22:16:19.263 回答
1

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

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

[mysqld]

...

innodb_flush_log_at_trx_commit=2

...

然后重新启动您的服务器。

它似乎确实会降低数据库的可靠性,如果您在写入时断电等。对于我的开发机器来说,这绝对是一个可以接受的 rick,但我不建议将它用于生产。请参阅 [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

于 2013-03-05T20:29:42.033 回答