解決MySQL導致的寶塔占用100%,網站緩慢問題

目前我們發現有個別客戶在使用過程中出現CPU跑滿占用100%的情況,以及負載100%的顯示。一般來說這種問題的可能性很多,有可能是服務器負載能力低、木馬病毒、被植入了挖礦程序、程序有嚴重的Bug、網站被攻擊、突發大流量進入等等。

我在檢查中發現,這種情況在PHP+MySQL這種組合架構的網站在日常運行過程中,通常會遇到各式各樣的性能問題。目前,可以通過使用 Redis、Memcached 等緩存軟件來緩存網站內容,這確實是最優的解決方案之一;但這需要網站程序的支持,然而個別網站程序會出現不支持或者不能完美支持這些緩存軟件。那麽我們就需要通過優化MySQL的配置來調整MySQL性能,以緩解MySQL瓶頸問題。

通常MySQL調整優化的時候可以分以下幾部分:

1、MySQL配置參數調整優化(參考網站運行情況進行調整)
2、數據表索引調優 (效果明顯,通常情況下一般優秀的開源程序都不需要額外調整)
3、SQL語句調整優化 (這個需要程序員或DBA進行優化)

首先我們如何檢查是何種原因導致的CPU占用100%,負載100%的問題

服務器環境如下:
1、寶塔Linux面板 正式版 7.9.0
2、MySQL 5.6.50

檢查步驟:

1、首先考慮使用 TOP 查看一下當前的負載情況,或使用SHELL工具連接到命令行操作界面,或通過寶塔面板->終端進入命令行操作也可。

2、進入終端後,輸入 TOP 查看一下負載情況,如下圖:

3、檢查發現目前是MySQL的占用比較多,並且一直居高不下。目前的情況可能是由於進程數一直在增長以及占用,沒有自動關閉舊請求導致的內存占用;然後檢查硬盤讀寫發現一直有大量的磁盤IOPS請求。

4、上面我們看到是 MySQL 的原因 ,那就查詢 MySQL 的語句,看一下是哪些命令在一直執行的 SQL 語句,然後我們對占用過高的語句進行優化。

1、輸入mysql -u root -p 進入mysql
2、輸入命令show full processlist,進行查看當前正在執行的sql語句

5、搜索出來基本都是 where 條件 這些詞語字段 ,這種原因可能是沒加上索引查詢。知道原因後我們找到這個表,給該 where字段加上索引就好了。(PS:這個where查詢是例子,各位以實際情況進行調優)

6、現在我們返回寶塔首頁刷新下,可以看到負載狀態、CPU使用率都已經降下去了。

7、剛才在檢查中同時也發現磁盤IO過高,通過系統 IOTOP 命令查看,發現進程為 MySQL 的讀寫數據操作很高。 原因是在 MySQL 執行查詢操作時,其中有Order By進程在排序時或查詢時都會生成臨時數據表。正常情況下會存在內存裏,但是如果設置的內存過小或者內存不足時會存在磁盤上。

這樣的情況下我們要對寶塔面板的MySQL進行性能優化。在面板的軟件管理,打開 MySQL 的設置,我們可以看到 MySQL 的性能調整使用的默認配置。

默認配置一般設置都較小,我們需要調整個別內存參數。既然這樣,調大這個內存值就可以解決這個問題了。然後,保存,再重啟數據庫。執行此操作前,首先將數據庫全部備份了一下,數據安全最重要,不管如何操作都會存在風險,所以一定要備份一下!!!!)

參考如下圖:

這樣的情況下我們需要調整到與服務器實際內存容量的參數,調整後相應的數值會發生變化。

重啟後,在網站並發量約5000的時候,我們可以在寶塔看到硬盤的iops數值已經明顯降低到正常範圍