本文目錄一覽:
- 1、mysql經常佔用cpu100%以上,該怎麼解決
- 2、Mysql佔用CPU過高如何優化
- 3、Mysql數據庫CPU佔用過高原因排查 show processlist
- 4、MySQL CPU佔用過高怎麼辦
- 5、Mysql佔用CPU達100%,怎麼解決!! – PHP進階討論
mysql經常佔用cpu100%以上,該怎麼解決
有多個原因可至CPU高佔用,當訪問數量非常高的時候,安裝程序沒有完成,自身的更新進行過程,都會發生。
可將網絡斷開,讓數據庫在無訪問情況下,看佔用高不高,
再就是大的訪問量的情況,如果是此原因引起的,那隻能優化訪問的語句,降低訪問次數,我也見過一些人,無限制地任意使用SQL語句,至數據庫負荷重。
Mysql佔用CPU過高如何優化
CPU佔用過高診斷思路
mpstat -P ALL 1,查看cpu使用情況,主要消耗在sys即os系統調用上
perf top,cpu主要消耗在_spin_lock
生成perf report查看詳細情況
CPU主要消耗在mutex爭用上,說明有鎖熱點。
採用pt-pmp跟蹤mysqld執行情況,熱點主要集中在mem_heap_alloc和mem_heap_free上。
Pstack提供更詳細的API調用棧
Innodb在讀取數據記錄時的API路徑為
row_search_for_mysql –》row_vers_build_for_consistent_read –》mem_heap_create_block_func –》mem_area_alloc –》malloc –》 _L_unlock_10151 –》__lll_unlock_wait_private
row_vers_build_for_consistent_read會陷入一個死循環,跳出條件是該條記錄不需要快照讀或者已經從undo中找出對應的快照版本,每次循環都會調用mem_heap_alloc/free。
而該表的記錄更改很頻繁,導致其undo history list比較長,搜索快照版本的代價更大,就會頻繁的申請和釋放堆內存。
Linux原生的內存庫函數為ptmalloc,malloc/free調用過多時很容易產生鎖熱點。
當多條 SQL 並發執行時,會最終觸發os層面的spinlock,導致上述情形。
解決方案
將mysqld的內存庫函數替換成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高並發調用。
修改my.cnf,添加如下參數並重啟
[mysqld_safe]malloc-lib=tcmalloc
上周五早上7點執行的操作,到現在超過72小時,期間該實例沒有再出現cpu長期飆高的情形。
以下是修改前後cpu使用率對比
Mysql數據庫CPU佔用過高原因排查 show processlist
mysql服務器最近偶爾出現cpu百分百居高不下的情況,所以需要進行分析
兄弟命令 show processlist;只列出前100條,如果想全列出請使用show full processlist;
先 簡單說一下各列的含義和用途:
正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經滿了或者磁盤是否正處於重負中。
Connect Out
複製從服務器正在連接主服務器。
Copying to tmp table on disk
由於臨時結果集大於 tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。
Creating tmp table
正在創建臨時表以存放部分查詢結果。
deleting from main table
服務器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables
服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables
正在執行 FLUSH TABLES,等待其他線程關閉數據表。
Killed
發送了一個kill請求給某線程,那麼這個線程將會檢查kill標誌位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標誌 位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那麼kill請求會在鎖釋放時馬上生效。
Locked
被其他查詢鎖住了。
Sending data
正在處理 SELECT 查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group
正在為 GROUP BY 做排序。
Sorting for order
正在為 ORDER BY 做排序。
Opening tables
這個過程應該會很快,除非受到其他因素的干擾。例如,在執 ALTER TABLE 或 LOCK TABLE 語句行完以前,數據表無法被其他線程打開。 正嘗試打開一個表。
Removing duplicates
正在執行一個 SELECT DISTINCT 方式的查詢,但是MySQL無法在前一個階段優化掉那些重複的記錄。因此,MySQL需要再次去掉重複的記錄,然後再把結果發送給客戶端。
Reopen table
獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。
Repair by sorting
修復指令正在排序以創建索引。
Repair with keycache
修復指令正在利用索引緩存一個一個地創建新索引。它會比 Repair by sorting 慢些。
Searching rows for update
正在講符合條件的記錄找出來以備更新。它必須在 UPDATE 要修改相關的記錄之前就完成了。
Sleeping
正在等待客戶端發送新請求.
System lock
正在等待取得一個外部的系統鎖。如果當前沒有運行多個 mysqld 服務器同時請求同一個表,那麼可以通過增加 –skip-external-locking參數來禁止外部系統鎖。
U pgrading lock
INSERT DELAYED 正在嘗試取得一個鎖表以插入新記錄。
Updating
正在搜索匹配的記錄,並且修改它們。
User Lock
正在等待 GET_LOCK()。
Waiting for tables
該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然後,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾種 情況下會產生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。
waiting for handler insert
INSERT DELAYED 已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鐘,那麼可能是有問題發生了,需要檢查一下。
還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看服務器是否有存在錯誤是才用得着。
文章轉自:
MySQL CPU佔用過高怎麼辦
MySQL CPU佔用高辦
簡單面幾步驟解決問題:
1、mysql運行能同步設置問題導致
2、mysql運行php些sql語句導致問題發現用root用戶進入mysql管理
mysql -u root -p
輸入密碼
mysql:show processlist 語句查找負荷重 SQL 語句優化該SQL比適建立某字段索引
–
Mysql佔用CPU達100%,怎麼解決!! – PHP進階討論
1.檢查數據關鍵字段是否建立索引2.檢查是否太多未關閉鏈接3.索引是否被頻繁更新4.被查詢表記錄的數量是否過多5.表與表關聯查詢,是否數據量過多6.檢查緩衝設置7.優化SQL語句8.你用PHP5,可能也用了MYSQL5,盡量使用存儲過程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/243278.html