Drupal在Vagrant环境中非常缓慢。

12
我已开始将许多开发环境迁移到Vagrant。到目前为止,这对于几乎所有事情都非常有用,但我们的第一个Drupal迁移无法使用。它非常慢。我们的Wordpress、CakePHP和Node.js站点都表现得非常好甚至更好,但不包括Drupal。这个问题真是糟糕透了。
该盒子是一个由Veewee创建的Ubuntu 12.04 64位机器。它是我们所有基于Web的项目所使用的相同基础盒子,因此没有什么特别之处。在我的站点目录中,我有一个规范目录(sites/my-site/),其中包含所有站点资源以及指向该规范目录的域名符号链接(sites/dev.mysite.com -> /vagrant/www/sites/my-site),这显然是团队正在使用的某个模块所必需的。
这是一个混合的Windows / OSX开发团队,并且在两个平台上都很慢。从我的Vagrantfile中唯一半非常规的代码片段如下:
config.vm.forward_port 80, 8080

config.vm.share_folder( "v-root", "/vagrant", ".", :extra => 'dmode=777,fmode=777' )

# Allows symlinks to the host directory.
config.vm.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]

Vagrant::Config.run do |config|
  config.vm.provision :shell, :path => "provision.vm.sh"
end

我的shell提供程序只做了几件事情:
  • 安装drush
  • 创建了上述符号链接到规范站点目录
  • 编写了一个Nginx服务器块
  • 如有必要,创建了一个settings.php文件。
有什么我可以做来提高性能吗?比如说,很多? 更新 我将这个问题缩小到一个看起来像是远程数据库的地方。为了进行苹果与苹果的比较,我下载了Drupal 7.21的全新副本,并从Vagrant Web服务器对3个不同的数据库执行了标准安装:
  • 在与Web服务器相同的Vagrant VM上创建的新数据库(localhost)
  • 在原始问题中使用的共享开发服务器上创建的新数据库(dev)
  • 在EC2实例上创建的新数据库(tmp)
完成后,我登录到新的Drupal安装程序并加载主页(localhost:8080)5次。然后我连接到每个数据库并以相同的方式加载相同的页面。我发现,当Drupal连接到远程数据库时,页面加载速度要慢4-6倍。

请记住,这是一次全新的(标准)安装。没有任何项目负担。


你是通过主机名还是IP地址连接到数据库的?数据库运行在IPv4还是IPv6上? 此外,http://serverfault.com/questions/495914/vagrant-slow-internet-connection-in-guest - Danack
11个回答

11

我也遇到了类似的问题。看起来,对于具有1000多个文件的项目树,VirtualBox共享文件夹可能非常缓慢

切换到NFS可能是解决方案。


我出于好奇尝试了一下,但并没有获得任何巨大的性能提升。而且我有一些开发者在使用Windows系统,所以这对他们来说是无用的。我发现最大的提升是将数据库设为本地模式。虽然这对实际开发来说不太好,但作为测试案例,它显著提高了速度。 - Rob Wilkerson
在为Vagrant中的Drupal开发VM开发解决方案时,我遇到了类似的问题。在我的经验中,为VM和本地数据库分配更多的RAM肯定有所帮助,但为了那些跟随者的利益,我将发布有关切换到NFS以处理具有许多文件的项目的发现。 - David Watson
1
我曾经遇到过严重的速度问题。对我来说,解决这个问题的方法是增加我的apc.shm_size并切换到NFS文件系统。这两个方法一起使Drupal页面加载时间减少了5-6秒。 - David Meister
1
只是跟进一下,切换到NFS使事情快了一个数量级。我现在在支持它的盒子上为Undine(我在d.o上维护的项目)提供了一个默认配置。请注意,这对于Windows来说并不是一个很好的解决方案 - 尽管我听说你可以通过一些体操来实现它,但我个人还没有确认过。 - David Watson
这个解决方案极大地提高了网站的安装速度。使用共享文件夹时,我们的默认配置文件安装需要超过10分钟的时间。通过NSF,安装时间缩短到了一分钟。 - Nebel54
1
NFS的问题在于,如果需要的话,您无法为共享文件夹设置所有者/组。 - Pedro Luz

5
问题几乎肯定是要在my.cnf中需要skip_name_resolve或VirtualBox对具有大量文件的共享目录处理不佳上。两者都可以用strace -c轻松跟踪,但您可能会发现一次只纠正一个问题并查看哪个问题解决了性能问题更容易一些。
如果您在进行这些更改后仍然遇到缓慢,请告诉我,我们可以进一步调试。

好的,这不是“skip_name_resolve”。我很久以前就添加了它。即使是大量的文件(我认为是),我也不知道如何修复它。 - Rob Wilkerson
@RobWilkerson 方便的测试方法是将文件目录拉到本地,而不是留在主机上。如果您目前在DrupalCon,请来核心房间找我,我很乐意帮助。 - BMDan
我认为关键字应该是"skip-name-resolve",而不是"skip_name_resolve",对吗? - Offlein
1
@Offlein MySQL在配置文件中可以接受使用下划线,但在命令行中需要使用破折号。规范的形式是在my.cnf中使用下划线,在命令行中使用破折号,但这实际上是一种“随心所欲”的情况。 - BMDan

4

我通过谷歌搜索了类似的问题,所以我希望我的回答可以帮助其他人。

如果您使用precise32 vagrant box作为起点,请注意该盒子默认只有360MB的内存。

要增加内存(至少在Vagrant V2与VirtualBox中),请按照以下方式进行:

config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
end

这让Drupal对我来说更加响应迅速。

我一直使用512MB的自定义盒子,但是现在已经对其进行了内存升级,很快就会尝试它。谢谢。 - Rob Wilkerson

3

我尝试了许多方法来加快我的Vagrant速度,最终在项目的问题跟踪器中偶然发现了这个。

config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end

我之前尝试使用NFS却不成功,这恰好是解决问题的关键。


有趣。我也发现了这一点,没有太大的区别。对我来说,银弹是使用本地数据库。 - Rob Wilkerson
我使用Ruby on Rails做到了将1800ms的响应时间减少了200ms。 - ringe

3

这只是一个基于PHP/MySQL的应用程序,因此Drupal没有太多特别之处,除非它已经被定制过。你可能已经做了一些工作,但以下是一些建议来分离问题。

  • 检查Drupal dblog日志中是否有错误。
  • 检查您的nginx和php日志是否有错误。
  • 考虑运行的活动模块数量(超过100个?那将是一个非常重的安装)
  • 安装一个新的Drupal实例并进行比较。这可能会将问题限制在您的实例上而不是Drupal的总体问题上。

如果发现是Drupal实例的问题

  • 安装开发者模块并启用内存报告功能,以便您知道每个页面加载使用了多少内存,并为改进提供一个基准。
  • 确保您已经安装了APC或其他PHP opcache,并确保命中率良好。如果以前没有运行它,请注意Devel报告的内存使用差异。
  • 运行像xhprof之类的内容,或禁用可疑的模块,直到找到主要违规者。
  • 启用mysql慢查询和索引日志,查找潜在问题,然后相应地添加索引或采取其他措施。

如果其他应用程序运行良好,我怀疑问题可能出在特定的模块上,或者您的Drupal安装总体上比较臃肿,需要进行一些优化或提供更多内存。


你解决这个问题了吗?我的研究似乎表明共享文件夹很慢,但我还没有找到能加速它们的解决方案。 - Jeroen Coupé
@JeroenCoupé - 我还在继续处理它。这不是最优先的事情。到本周末可能会了解更多情况。你能提供有关你的“共享文件夹”速度缓慢的任何细节吗? - Rob Wilkerson
我找到了一个链接,似乎表明这是由于网络映射缓慢引起的http://groups.drupal.org/node/270828,但是提供的解决方案并没有帮助我。 - Jeroen Coupé
我一直在抽空工作,并已经找到了似乎是主要来源的东西。我已经更新了我的问题并附上了我发现的内容。 - Rob Wilkerson

2

1
我只是试图自己解决这个问题。我尝试了这里和Rails Windows Vagrant非常慢的响应时间的建议。没有真正的运气,我在一个温暖的请求中刮掉了1800毫秒响应时间中的200毫秒,没有真正的数据呈现。这是使用Ruby on Rails而不是Drupal。问题是一样的。

将共享文件夹切换到Rsync使我在同一请求上获得了大约280ms的响应时间。

Vagrantfile:

  config.vm.synced_folder '.', '/vagrant', type: 'rsync',
                                       rsync__exclude: '.git/'

使用方法:

$ vagrant up
$ vagrant rsync-auto

后面的命令会监视您的工作目录并自动同步更改。
请参见https://www.vagrantup.com/docs/synced-folders/rsync.htmlhttps://www.vagrantup.com/docs/cli/rsync-auto.html

我也对使用rsync同步频率缓慢感到非常烦恼。我经常不得不刷新页面两次来查看微小的CSS调整,因为第一次同步只完成了一半。 - ringe

0
我遇到了同样的问题。这些建议对于使用Windows主机的人尤其有帮助。如果没有NFS支持(对于Windows来说是一个大问题),你将无法获得良好的性能,因此:
  1. 完全不使用同步文件夹。

    config.vm.synced_folder "../data", "/vagrant", disabled: true
    
  2. 在虚拟机中设置Samba服务器+在Windows主机上设置网络驱动器。 有很多文章介绍如何做到这一点,例如:https://www.liberiangeek.net/2014/07/ubuntu-tips-create-samba-file-server-ubuntu-14-04/

0

0

在任何服务器环境中,延迟对于数据库连接都是一个大问题。即使只是在数据库连接上运行加密也会导致显著的性能问题,尽管在这些条件下它很可能是必需的。

你与数据库之间的ping时间是多少?如果每次查询都至少需要一次往返,则会累积耗时。再加上加密所需的一点时间。如果不使用持久性数据库连接,情况会更糟。

我建议考虑在何处进行缓存。例如,在VM上使用memcached进行缓存而不是在数据库中进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接