当前位置

Drupal 6数据库MyISAM转InnoDB后性能下降打补丁

James Qi 在 2015年7月20日 - 14:50 提交
内容摘要:周末把云数据库RDS进行了配置升级,上面的一些站点数据表从MyISAM转为了InnoDB,今天早上来发现IOPS异常升高,网站打开困难,查看实时实例会话,发现有很多这样的语句堆积: SELE......

  周末把云数据库RDS进行了配置升级,上面的一些站点数据表从MyISAM转为了InnoDB,今天早上来发现IOPS异常升高,网站打开困难,查看实时实例会话,发现有很多这样的语句堆积:

SELECT COUNT(pid) FROM url_alias

  在Google中搜索了一下,这篇文章说明很多人也遇到过这种问题COUNT(*) is an expensive query in InnoDB.,Drupal 6默认的数据库表引擎是MyISAM,上面那句统计数量的查询语句瞬间可以执行完,但对InnoDB引擎来说需要全表扫描来获得统计数据,当我们网站的页面数量众多的时候,就非常消耗数据库服务器的资源。而Pressflow版本就针对性解决了这样的问题:What makes Pressflow scale: #1 faster core queries,而Drupal 7的默认引擎是InnoDB,应该也不存在这样的问题。

  本来想把涉及到的url_alias表转回MyISAM的,但阿里云RDS现在弱化对MyISAM的支持、已经禁止转为MyISAM了,只要设法修改Drupal程序来解决。就用开始那篇文章中说到的一个Patch补丁196862-expensive-count-query-range-all-127.patch,打上该补丁(办法参看 Patch Apply),就可以发现RDS的负载立马就下降了很多。

  随着Drupal 8正式版推出的逐渐接近,Drupal 6的淘汰是必然趋势,我们还有一些以前用Drupal 6开发的网站,都面临各种问题(例如对InnoDB的支持、对PHP高版本的支持等),准备近期安排时间专门来进行到Drupal 7的升级工作。


  最近将国内托管的服务器转向阿里云,其中部分drupal 6版本的站点搬迁后,再次遇到innodb数据库使rds负载iops异常升高的问题,进行上面的修改后可以缓解。将打补丁的办法再次记录一下:

cd /alidata/www/drupal6_path/
wget https://www.drupal.org/files/196862-expensive-count-query-range-all-127.patch
patch -p1 < 196862-expensive-count-query-range-all-127.patch

  打补丁的过程会显示出来:

patching file includes/locale.inc
Reversed (or previously applied) patch detected!  Assume -R? [n] 
Apply anyway? [n] y
Hunk #1 FAILED at 289.
1 out of 1 hunk FAILED -- saving rejects to file includes/locale.inc.rej
patching file includes/path.inc
Reversed (or previously applied) patch detected!  Assume -R? [n] y
patching file modules/book/book.install
patching file modules/menu/menu.admin.inc
patching file modules/node/node.admin.inc
patching file modules/node/node.module
Hunk #1 succeeded at 490 (offset 7 lines).
Hunk #2 succeeded at 2182 (offset 7 lines).
Hunk #3 succeeded at 2740 (offset 7 lines).
patching file modules/path/path.admin.inc
patching file modules/path/path.module
Hunk #1 succeeded at 180 (offset 42 lines).
patching file modules/ping/ping.module
patching file modules/profile/profile.module
patching file modules/profile/profile.pages.inc
patching file modules/system/system.module
Hunk #2 succeeded at 1079 (offset 30 lines).
patching file modules/user/user.admin.inc
Hunk #1 succeeded at 683 (offset 15 lines).
patching file modules/user/user.module
Hunk #1 succeeded at 1639 (offset 47 lines).
Hunk #2 succeeded at 1651 (offset 47 lines).

  注意不要重复运行,否则会提示已经打过补丁了:

Reversed (or previously applied) patch detected!  Assume -R? [n] R
Apply anyway? [n] n

  2015年10月20日补充:一段时间以来发现有的阿里云RDS数据库服务器IOPS很高,今天检查,正好是从我们某次升级Drupal 6网站后开始的,再仔细看是升级后没有重新进行打补丁的操作,从而让程序恢复对innodb的统计操作造成服务器负载高,重新打补丁后正常。

  以后再在Drupal 6版本升级还要记得打这个补丁。或者以后还是尽快都设法升级到Drupal 7。