周末把云数据库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。
评论