資訊無涯,回頭已不見岸

解決MySQL在Windows環境啟動緩慢的狀況

目前運作部落格的作業系統從草創時期的 Windows Server 2003,一路用到現在的 Windows Server 2008 R2,其實一直以來都存在一個狀況,就是主機環境使用時間久了,只要遇到有維護狀況或 Windows Update 更新必須重開機,都必須等上很長一段時間才能讓部落格開始運作,因為 WordPress 使用的 MySQL 資料庫不知為何需要很長的準備時間,曾經一度慢到我以為資料庫壞掉還重灌整個環境。

剛好前幾天主機的硬體出了點狀況,導致網站也跟著挫賽,所以又面臨到需再開機進入作業系統,網站非常貼心地讓我一定要去吃個飯回來才恢復正常。心想這狀況實在太不合理,決定仔細觀察開機後 MySQL 到底在搞啥鬼。

果然一打開工作管理員就發現很詭異的狀況,mysqld.exe 這支 MySQL 主程式開機後從約 23MB 的記憶體使用量,以非常緩慢的速度不斷增加,直到四十幾 MB 才發現部落格開始運作,難怪重開機後無法立即連線。

在網路搜尋了一下,發現國外早有人發問到 MySQL 官網認為是 Bug,但看了幾個討論串似乎沒有什麼可用資訊,反而在簡中網站找到解決方法。

參考對岸的討論,我主要做了下面這件事情:
建立一個 MySQL 服務可存取及使用的暫存資料夾,譬如在 C 根目錄下建立一個「MySQLTemp」資料夾。接著修改 MySQL 的設定檔 my.ini,並在設定檔中的 [mysqld] 區段指定暫存檔的位置。至於 my.ini 設定檔的存放位置,請在 MySQL 的安裝目錄下尋找。

最後輸入參數「tmpdir="C:/MySQLTemp/" 」,存檔再重開機立刻感到正常許多。

但觀察工作管理員的 mysqld.exe 狀況,記憶體仍然是從 23 MB起跳,使用量同樣慢慢增加,再參考了幾篇關於 MysQL 效能的中英文討論後,決定把:

a. 預設的「innodb_buffer_pool_size=21M」值加大為 64M
b. 預設的「innodb_log_buffer_size」值改成 8M

果然在重開機後看到登入畫面的一分鐘內,部落格就完全正常運作了。
(my.ini 配置值建議依官方文件說明、使用環境及硬體做設定)

話說回來,這個暫存資料夾在設定後,每次重開機裡面其實只會出現這樣的檔案 /=.=/

可能有時間再研究整個 MySQL 的運作方式才會瞭解原因了。

另外,對岸的討論文章有提到要清除「C:\Windows\Temp\」目錄裡以「sess_」起頭字串為名的 PHP Session 暫存檔。

主要在於,假使沒有特別指定 MySQL 的暫存資料夾位置,則預設會以此目錄為主,但以運作很久的 Windows 並不會主動清除在此目錄中大量產生的 PHP Session 暫存檔,相對導致 MySQL 啟動時運作不順利。所以另外指定暫存位置,似乎就能稍微避掉這個狀況。

為什麼說大量?上面那張圖為星期一半夜下指令刪除後,今天早上再擷取該目錄狀況的圖片,可以發現已經產生了超過一千個 34位元大小的檔案,而且那天改用指令送這些東西上路,是因為我用檔案總管開啟該目錄後,造成大量的硬碟 IO 讀取且檔案總管無回應,最後決定在命令提示字元處理掉這些暫存檔。說實話,我也不清楚他清了多久,或已經放了多大量的垃圾暫存檔,只知道我半夜等到超愛睏,還是去睡覺隔天起床再檢查結果。

可以的話,建議大家寫個批次檔定期執行清除動作,相信能清出不少使用空間。 /:P/

之前一直以為開機後 MySQL 要等很久才會正常,是硬體效能問題;因為過去曾有段時間,部落格並沒有讓我感覺到類似問題,回想當時的部落格主機 ( 虛擬機器 ) 是寄生在一台硬體規格很不錯的 Hyper-V 主機上測試,直到 VM 搬到 HP ProLiant MicroServer 正式運作後才將狀況整個浮現。但這次認真去研究才發現不是這麼一回事,其實只要動點設定就改善了。

用強悍硬體硬幹效能是治標不治本的方法,相信總有一天還是會被拖垮,認真探究問題根源才是上策。

2 則留言

  1. ㄟ踢唉

    Session Handler可以考慮用Wincache API,以IUSR登入會用記憶體儲存Session

    改用InnoDB之後,啟動速度確實比較慢些,但通常10秒內還是會搞定

  2. YvonneKo

    蘇老,有急事要與您聯絡,關於廣告,可否請您回mail給我。
    讓我知道您的聯絡方式。謝謝~ Yvonne

發佈回覆給「ㄟ踢唉」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

© 2024 蘇老碎碎唸

Theme by Anders NorenUp ↑