如何使用远程数据库(而非 DNS 解析)加速 Drupal 7

如何使用远程数据库(而非 DNS 解析)加速 Drupal 7

我们在 Ubuntu LTS 虚拟机(VMWare)上安装了 Drupal 7,并且 MySQL 5.1 服务器位于同一台物理服务器上,但在不同的虚拟机上。

Drupal 网站目前正在开发中,因此几乎没有流量,但是,尽管 ping 和 shell 访问速度非常快,但 Drupal 站点的运行速度却非常慢(加载任何页面都需要 5 秒以上)。经过这里和其他地方的研究,我了解到问题在于 SQL 是通过网络接口访问的,而 Drupal 显然在这方面做得非常糟糕。

我已经检查了 DNS 解析,无论是从 Drupal 端(数据库主机由 ip 指定,/etc/hosts 文件中有一个 dns 条目)还是从 MySQL 端(skip-name-resolve 已打开,drupal 客户端通过 ip 地址获得访问权限)都不应该有。

Drupal devel querylog 说:

执行了 336 个查询,耗时 5993.89 毫秒。超过 5 毫秒的查询会突出显示。页面执行时间为 7015.35 毫秒。内存使用情况:devel_boot()=5.53 MB,devel_shutdown()=93.35 MB,PHP 峰值=94 MB。

奇怪的是,对于单个页面的加载,大约 2/3 的查询速度很快,其他查询则非常慢:

1.765 DrupalDatabaseCache::getMultipleP A E
SELECT cid, data, created, expire, serialized FROM cache_bootstrap WHERE cid IN (:cids_0)
default
575.825 DrupalDatabaseCache::getMultipleP A E
SELECT cid, data, created, expire, serialized FROM cache_bootstrap WHERE cid IN (:cids_0)
default
13.585 DrupalDatabaseCache::getMultipleP A E
SELECT cid, data, created, expire, serialized FROM cache_bootstrap WHERE cid IN (:cids_0)
default
466.9914 DrupalDatabaseCache::getMultipleP A E
SELECT cid, data, created, expire, serialized FROM cache WHERE cid IN (:cids_0)
default
1.841 drupal_lookup_pathP A E
SELECT source FROM url_alias WHERE alias = :alias AND language IN (:language, :language_none) ORDER BY language ASC, pid DESC
default

通过启用 Drupal 缓存可以解决匿名访问的问题。但是,整个管理界面仍然很慢。

目前公司的政策是单独设置数据库服务器。还有其他选项可以加快 Drupal 的速度吗?

默认数据库配置显示驱动程序“mysql”,也许我应该将其更改为“mysqli”或“pdo_mysql”?但是,如果我将其更改为 mysqli,database.inc 会抱怨相关驱动程序不存在——没有专门为 drupal 安装的东西,因为 mysqli 和 pdo 都在 PHP 本身中启用。

答案1

我认为有两个方面可以优化您的网站:

  1. 通过调整 MySQL 数据库来减少单个查询。我会从mysqltuner.pl,它将向您显示安装中明显的问题并提供调整提示。
  2. 减少查询次数。我知道一个大型 Drupal 安装,它是使用 Web 服务器主机上的 memcache 完成的。

你检查了吗管理站点性能在 drupal.org?

答案2

我遇到了同样的问题,并使用 Google Chrome PageSpeed 和 YSlow 来找出我的问题。

基本上,我是按照以下步骤进行的:

尝试安装PHP 高级编程,将 APC shm 大小设置为 256Mb(有很多指南)。然后确保活着对于 Apache 而言是开启的,并且也激活 Apache 压缩(通过 Apache mod_deflate)。

答案3

答案4

由于这个问题仍然在吸引着人们的回答,我将自己回答,因为我当时已经解决了它。

基本上,只要我将 Mysql 移到与 Drupal 相同的虚拟机上,一切都会变得非常快。因此,问题在于 Drupal 每次加载页面时都会发出大量 SQL 查询 = 架构不佳。

相关内容