您在這裡

Drupal 6數據庫MyISAM轉InnoDB後性能下降打補丁

James Qi 在 2015年7月20日 - 14:50 發表

  周末把雲數據庫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。

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。