我正在运行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)?
任何答案都非常感谢。
答案 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]中查看有关可靠性的更多详细信息。
[2] http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit