1. 程式人生 > >Mysql佔用過高CPU時的優化手段

Mysql佔用過高CPU時的優化手段

Mysql佔用CPU過高的時候,該從哪些方面下手進行優化?
佔用CPU過高,可以做如下考慮:
1)一般來講,排除高併發的因素,還是要找到導致你CPU過高的哪幾條在執行的SQL,show processlist語句,查詢負荷最重的SQL語句,優化該SQL,比如適當建立某欄位的索引;
2)開啟慢查詢日誌,將那些執行時間過長且佔用資源過多的SQL拿來進行explain分析,導致CPU過高,多數是GroupBy、OrderBy排序問題所導致,然後慢慢進行優化改進。比如優化insert語句、優化group by語句、優化order by語句、優化join語句等等;
3)考慮定時優化檔案及索引;
4)定期分析表,使用optimize table;
5)優化資料庫物件;
6)考慮是否是鎖問題;
7)調整一些MySQL Server引數,比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;
8)如果資料量過大,可以考慮使用MySQL叢集或者搭建高可用環境。
9)可能由於記憶體latch(洩露)導致資料庫CPU高
10)在多使用者高併發的情況下,任何系統都會hold不住的,所以,使用快取是必須的,使用memcached或者redis快取都可以;
11)看看tmp_table_size大小是否偏小,如果允許,適當的增大一點;
12)如果max_heap_table_size配置的過小,增大一點;
13)mysql的sql語句睡眠連線超時時間設定問題(wait_timeout)
14)使用show processlist檢視mysql連線數,看看是否超過了mysql設定的連線數(

http://www.cnblogs.com/kevingrace/p/6226324.html

下面分享一例遇到過的案例:
網站在高峰時段訪問,點選頁面有點卡。登陸伺服器,發現機器負載有點高,並且mysql佔用了很高的CPU資源,如下圖:

MySQL負載居高不下,如果打開了慢查詢日誌功能,最好的辦法就是針對慢查詢日誌裡執行慢的sql語句進行優化,如果sql語句用了大量的group by等語句,union聯合查詢等肯定會將mysql的佔用率提高。所以就需要優化sql語句

除了優化sql語句外,也可以做一些配置上的優化。在mysql中執行show proceslist;出現下面回顯結果:
1.查詢有大量的Copying to tmp table on disk狀態


明顯是由於臨時表過大導致mysql將臨時表寫入硬碟影響了整體效能。

Mysql中tmp_table_size的預設值僅為16MB,在當前的情況下顯然是不夠用的。
mysql> show variables like "%tmp%";
+-------------------+----------+
| Variable_name | Value |
+-------------------+----------+
| max_tmp_tables | 32 |
| slave_load_tmpdir | /tmp |
| tmp_table_size | 16777216 |
| tmpdir | /tmp |
+-------------------+----------+
4 rows in set (0.00 sec)

解決辦法:調整臨時表大小
1)進mysql終端命令修改,加上global,下次進mysql就會生效
mysql> set global tmp_table_size=33554432;
Query OK, 0 rows affected (0.00 sec)

再次登陸mysql
mysql> show variables like "%tmp%";
+-------------------+----------+
| Variable_name | Value |
+-------------------+----------+
| max_tmp_tables | 32 |
| slave_load_tmpdir | /tmp |
| tmp_table_size | 33554432 |
| tmpdir | /tmp |
+-------------------+----------+
4 rows in set (0.01 sec)

2)my.cnf配置檔案修改
[[email protected] ~]# vim my.cnf
.....
tmp_table_size = 32M

重啟mysql
[[email protected] ~]# /etc/init.d/mysqld restart

2.show processlist;命令的輸出結果顯示了有哪些執行緒在執行,可以幫助識別出有問題的查詢語句。比如下面結果:
Id User Host db Command Time State Info
207 root 192.168.1.25:51718 mytest Sleep 5 NULL
先簡單說一下各列的含義和用途,第一列,id,不用說了吧,一個標識,你要kill一個語句的時候很有用。user列,顯示單前使用者,如果不是root,這個命令就只顯示你許可權範圍內的sql語句。host列,顯示這個語句是從哪個ip的哪個埠上發出的。呵呵,可以用來追蹤出問題語句的使用者。db列,顯示這個程序目前連線的是哪個資料庫 。command列,顯示當前連線的執行的命令,一般就是休眠(sleep),查詢(query),連線(connect)。time列,此這個狀態持續的時間,單位是秒。state列,顯示使用當前連線的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個sql語句,已查詢為例,可能需要經過copying to tmp table,Sorting result,Sending data等狀態才可以完成,info列,顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。
常見問題:
一般是睡眠連線過多,嚴重消耗mysql伺服器資源(主要是cpu, 記憶體),並可能導致mysql崩潰。

解決辦法 :
在mysql的配置my.cnf檔案中,有一項wait_timeout引數設定.即可設定睡眠連線超時秒數,如果某個連線超時,會被mysql自然終止。
wait_timeout過大有弊端,其體現就是MySQL裡大量的SLEEP程序無法及時釋放,拖累系統性能,不過也不能把這個指設定的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題。
通常來說,把wait_timeout設定為10小時是個不錯的選擇,但某些情況下可能也會出問題,比如說有一個CRON指令碼,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設定就有問題了(當然,這也不是不能解決的問題,你可以在程式裡時不時mysql_ping一下,以便伺服器知道你還活著,重新計算wait_timeout時間):

MySQL伺服器預設的“wait_timeout”是28800秒即8小時,意味著如果一個連線的空閒時間超過8個小時,MySQL將自動斷開該連線。
然而連線池卻認為該連線還是有效的(因為並未校驗連線的有效性),當應用申請使用該連線時,就會導致下面的報錯:
The last packet successfully received from the server was 596,688 milliseconds ago.
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

28800seconds,也就是8小時。
如果在wait_timeout秒期間內,資料庫連線(java.sql.Connection)一直處於等待狀態,mysql就將該連線關閉。這時,你的Java應用的連線池仍然合法地持有該連線的引用。當用該連線來進行資料庫操作時,就碰到上述錯誤。
可以將mysql全域性變數wait_timeout的預設值改大。
檢視mysql手冊,發現對wait_timeout的最大值分別是24天/365天(windows/linux)。

比如將其改成30天
mysql> set global wait_timeout=124800;
Query OK, 0 rows affected (0.00 sec)

相關推薦

Mysql佔用CPU優化手段

Mysql佔用CPU過高的時候,該從哪些方面下手進行優化? 佔用CPU過高,可以做如下考慮: 1)一般來講,排除高併發的因素,還是要找到導致你CPU過高的哪幾條在執行的SQL,show processlist語句,查詢負荷最重的SQL語句,優化該SQL,比如適當建立某欄位的

效能優化-CPU佔用問題排查

1. 效能優化是什麼? 1.1 效能優化就是發揮機器本來的效能 1.2 效能瓶頸在哪裡,木桶效應。   CPU佔用過高 1、現象重現 CPU佔用過高一般情況是程式碼中出現了迴圈呼叫,最容易出現的情況有幾種: a)遞迴呼叫,退出機制設計的不夠

MYSQL "ORDER BY rand()"的坑--容易導致機器負載、CPU佔用

在一次微信砍價活動營銷中,使用了4核16G10M頻寬的伺服器支撐業務,本來這個配置跑個PHP+MYSQL+nginx肯定輕輕鬆的事情,可是隨著活動的高潮,併發數一高,機器負載核CPU一下子就達到100% 始終找不到原因,只知道是mysql分配的記憶體不夠,一直給它加,但是重啟m

MySQL案例:一次單核CPU佔用問題的處理

客戶現場反饋,top的檢查結果中,一個CPU的佔用一直是100%。實際上現場有4個CPU,而且這個伺服器是mysql專屬伺服器。 我的第一反應是io_thread一類的引數設定有問題,檢查以後發現read和write的thread設定都是4,這和CPU數一致,因此可以斷定這並不是單顆CPU佔用過高的問題。

效能優化-Android之ANR問題分析解決 traces.txt檔案分析 CPU佔用

(由於公司專案特殊情況,需要使用一些小廠的三防功能手機,不能使用我們平時用的這些民用手機) 前期測試的時候是用民用手機測試的,有六七種機型(小米,華為,中興,oppo),使用過程中均沒有出現ANR的情況,但是在公司採購的一款工程機上面用了一段時間後肯定就會出現ANR,出現了

SQL Server效能優化案例分享(1)——CPU持續——CPU使用率的常見原因及處理方向

本系列屬於 SQL Server效能優化案例分享 專題     部分內容借用《SQL Server 2012實施與管理實戰指南》P592,如果SQL Server錯誤日誌裡面並沒有17883/17884這類錯誤,但是SQ

Sublime Text 3 CPU佔用率 && WebStorm記憶體佔用

  用Sublime Text 3或WebStorm進行前端開發時,遇到了同樣的問題:當專案檔案比較多或檔案比較大時,CPU佔用率或記憶體佔用持續比較高,後來經查閱發現是index files導致的,可以理解為:Sublime Text 3或WebStorm需要不斷重新整理檔案索引,不斷將專案檔案從硬碟中讀到

cpu佔用排查

top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員 內容解釋: PID:程序的ID USER:程序所有者 PR:程序的優先級別,越小越優先被執行 NInice:值 VIRT:程序佔用的虛擬記憶體 RES:程序佔用的實體記憶體 SHR:程

java執行CPU佔用追蹤

流程執行命令: 1.top  查到pid 28555 2.ps aux|grep 28555 確定到是tomcat的程序 3.顯示執行緒列表 ps -mp 28555 -o THREAD,tid,time   查到tid 28802 4. printf "%x\n" 2880

linux檢視java程序cpu佔用

 linux下查詢java程序佔用CPU過高原因1. 查詢程序top檢視程序佔用資源情況明顯看出java的兩個程序22714,12406佔用過高cpu. 2.查詢執行緒使用top -H -p <pid>檢視執行緒佔用情況 3.查詢java的堆疊資訊將執行緒id轉換成十

Win10 服務主機:本地系統 CPU佔用

這種情況,一般開機後,本地系統的CPU佔用就一直維持在30%左右,風扇一直轉很耗電。 可能是windows版本的問題,我在不同的機子上裝了四五個系統,都出現了這種情況。 解決方法如下: 1. 找到工作管理員中的“ 服務主機:本地系統”->“Windows Upda

vsCode剛開啟卡頓cpu佔用的原因

原因是:vscode剛開啟時預設搜尋路徑時陷入了死迴圈(也不能說死迴圈吧,就是大量搜尋導致的) 解決辦法:檔案->首選項->設定,然後搜尋“search.followSymlinks”改為false("search.followSymlinks": false,

C# WinForm CPU佔用

原因:程式中因為使用ThreadPool 多執行緒操作.Form.Invoke 用了很多,造成CPU佔用 90%以上,甚至程式假死..... 我一度去掉所有lock資料庫操作什麼的程式碼,都沒大的改善..... 解決方法: 每次呼叫完後. 讓她睡個300毫秒(System.Threading.Thre

解決win10系統CPU佔用【親測非常有效】

win10 系統的到來,讓使用者體驗到了更好的視覺效果和完善的服務,但是魚和熊掌不可兼得,這些良好的優點同時也帶給電腦更多的負荷,CPU各種100%燙的要命,風扇呼呼的吹。所以我們不得不對win10進行一丟丟的改造。 以下內容是我在網上尋找的資料,我稍作了整理

linux主機cpu 佔用分析

1.用top命令檢視哪個程序佔用CPU高 gateway閘道器程序14094佔用CPU高達891%,這個數值是程序內各個執行緒佔用CPU的累加值。 PID USER PR NI VIRT RES SHR S %CPU %MEM T

解決線上問題-定位CPU佔用

如果線上伺服器CPU佔用率過高,如何定位問題呢? 1.使用 top 命令檢視佔用CPU最高的pid 2.使用 top -H -p pid或 top -Hp pid命令檢視佔用cpu最大的執行緒id即 tid 3.使用命令 printf ‘%x/n’ tid

如何排查CPU佔用以及常見的幾種情況

在最近上線過程中遇到cpu佔用率過高問題由於問題已解決,此時僅重現操作方法1.先用top命令,找到cpu佔用最高的程序 PID  如上圖2.再用ps -mp pid -o THREAD,tid,time   查詢程序中,那個執行緒的cpu佔用率高 記住TID3.jstack

分析JAVA應用CPU佔用的問題

使用jstack分析java程式cpu佔用率過高的有關問題 使用jstack分析java程式cpu佔用率過高的問題 1,使用jps查找出java程序的pid,如3707 2,使用top -p 14292 -H觀察該程序中所有執行緒的CPU佔用。

java web伺服器cpu佔用的處理

平時專案中有時遇到cpu過高的情況,在此基於自己有限的經驗寫個分享,此處的伺服器都是基於linux平臺。 cpu的佔有執行緒型別總的來說分為兩種: us :使用者空間佔用CPU百分比 sy :核心空間佔用CPU百分比 一般來講CPU us高的解決方法: CPU us

MySQL 5.6記憶體佔用解決方案【總結】

最近把MySQL升級到了5.6版本,無意中在工作管理員發現MySQL記憶體佔用達到400+M,這是怎麼回事呢?以前的版本可沒有遇到過這種情況啊。開始的時候還以為是快取了某個資料量較大的表的資料。於是重啟MySQL服務,但結果出乎意料,MySQL服務一起啟動,記憶體就又飆