佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)

Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)

熱門(mén)標(biāo)簽:AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) Linux服務(wù)器 服務(wù)外包 地方門(mén)戶網(wǎng)站 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求

Mysql占用CPU過(guò)高的時(shí)候,該從哪些方面下手進(jìn)行優(yōu)化?

占用CPU過(guò)高,可以做如下考慮:

1)一般來(lái)講,排除高并發(fā)的因素,還是要找到導(dǎo)致你CPU過(guò)高的哪幾條在執(zhí)行的SQL,show processlist語(yǔ)句,查找負(fù)荷最重的SQL語(yǔ)句,優(yōu)化該SQL,比如適當(dāng)建立某字段的索引;

2)打開(kāi)慢查詢?nèi)罩?,將那些?zhí)行時(shí)間過(guò)長(zhǎng)且占用資源過(guò)多的SQL拿來(lái)進(jìn)行explain分析,導(dǎo)致CPU過(guò)高,多數(shù)是GroupBy、OrderBy排序問(wèn)題所導(dǎo)致,然后慢慢進(jìn)行優(yōu)化改進(jìn)。比如優(yōu)化insert語(yǔ)句、優(yōu)化group by語(yǔ)句、優(yōu)化order by語(yǔ)句、優(yōu)化join語(yǔ)句等等;

3)考慮定時(shí)優(yōu)化文件及索引;

4)定期分析表,使用optimize table;

5)優(yōu)化數(shù)據(jù)庫(kù)對(duì)象;

6)考慮是否是鎖問(wèn)題;

7)調(diào)整一些MySQL Server參數(shù),比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;

8)如果數(shù)據(jù)量過(guò)大,可以考慮使用MySQL集群或者搭建高可用環(huán)境。

9)可能由于內(nèi)存latch(泄露)導(dǎo)致數(shù)據(jù)庫(kù)CPU高

10)在多用戶高并發(fā)的情況下,任何系統(tǒng)都會(huì)hold不住的,所以,使用緩存是必須的,使用memcached或者redis緩存都可以;

11)看看tmp_table_size大小是否偏小,如果允許,適當(dāng)?shù)脑龃笠稽c(diǎn);

12)如果max_heap_table_size配置的過(guò)小,增大一點(diǎn);

13)mysql的sql語(yǔ)句睡眠連接超時(shí)時(shí)間設(shè)置問(wèn)題(wait_timeout)

14)使用show processlist查看mysql連接數(shù),看看是否超過(guò)了mysql設(shè)置的連接數(shù)

下面分享一例遇到過(guò)的案例:

網(wǎng)站在高峰時(shí)段訪問(wèn),點(diǎn)擊頁(yè)面有點(diǎn)卡。登陸服務(wù)器,發(fā)現(xiàn)機(jī)器負(fù)載有點(diǎn)高,并且mysql占用了很高的CPU資源,如下圖:

MySQL負(fù)載居高不下,如果打開(kāi)了慢查詢?nèi)罩竟δ?,最好的辦法就是針對(duì)慢查詢?nèi)罩纠飯?zhí)行慢的sql語(yǔ)句進(jìn)行優(yōu)化,如果sql語(yǔ)句用了大量的group by等語(yǔ)句,union聯(lián)合查詢等肯定會(huì)將mysql的占用率提高。所以就需要優(yōu)化sql語(yǔ)句

除了優(yōu)化sql語(yǔ)句外,也可以做一些配置上的優(yōu)化。在mysql中運(yùn)行show proceslist;出現(xiàn)下面回顯結(jié)果:

1.查詢有大量的Copying to tmp table on disk狀態(tài)

明顯是由于臨時(shí)表過(guò)大導(dǎo)致mysql將臨時(shí)表寫(xiě)入硬盤(pán)影響了整體性能。

Mysql中tmp_table_size的默認(rèn)值僅為16MB,在當(dāng)前的情況下顯然是不夠用的。
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)

解決辦法:調(diào)整臨時(shí)表大小

1)進(jìn)mysql終端命令修改,加上global,下次進(jìn)mysql就會(huì)生效

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配置文件修改

[root@www ~]# vim my.cnf
.....
tmp_table_size = 32M

重啟mysql
[root@www ~]# /etc/init.d/mysqld restart

2.show processlist;命令的輸出結(jié)果顯示了有哪些線程在運(yùn)行,可以幫助識(shí)別出有問(wèn)題的查詢語(yǔ)句。比如下面結(jié)果:

Id User Host db Command Time State Info
207 root 192.168.1.25:51718 mytest Sleep 5 NULL
先簡(jiǎn)單說(shuō)一下各列的含義和用途,第一列,id,不用說(shuō)了吧,一個(gè)標(biāo)識(shí),你要kill一個(gè)語(yǔ)句的時(shí)候很有用。user列,顯示單前用戶,如果不是root,這個(gè)命令就只顯示你權(quán)限范圍內(nèi)的sql語(yǔ)句。host列,顯示這個(gè)語(yǔ)句是從哪個(gè)ip的哪個(gè)端口上發(fā)出的。呵呵,可以用來(lái)追蹤出問(wèn)題語(yǔ)句的用戶。db列,顯示這個(gè)進(jìn)程目前連接的是哪個(gè)數(shù)據(jù)庫(kù) 。command列,顯示當(dāng)前連接的執(zhí)行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。time列,此這個(gè)狀態(tài)持續(xù)的時(shí)間,單位是秒。state列,顯示使用當(dāng)前連接的sql語(yǔ)句的狀態(tài),很重要的列,后續(xù)會(huì)有所有的狀態(tài)的描述,請(qǐng)注意,state只是語(yǔ)句執(zhí)行中的某一個(gè)狀態(tài),一個(gè)sql語(yǔ)句,已查詢?yōu)槔?,可能需要?jīng)過(guò)copying to tmp table,Sorting result,Sending data等狀態(tài)才可以完成,info列,顯示這個(gè)sql語(yǔ)句,因?yàn)殚L(zhǎng)度有限,所以長(zhǎng)的sql語(yǔ)句就顯示不全,但是一個(gè)判斷問(wèn)題語(yǔ)句的重要依據(jù)。

常見(jiàn)問(wèn)題:

一般是睡眠連接過(guò)多,嚴(yán)重消耗mysql服務(wù)器資源(主要是cpu, 內(nèi)存),并可能導(dǎo)致mysql崩潰。

解決辦法 :

在mysql的配置my.cnf文件中,有一項(xiàng)wait_timeout參數(shù)設(shè)置.即可設(shè)置睡眠連接超時(shí)秒數(shù),如果某個(gè)連接超時(shí),會(huì)被mysql自然終止。
wait_timeout過(guò)大有弊端,其體現(xiàn)就是MySQL里大量的SLEEP進(jìn)程無(wú)法及時(shí)釋放,拖累系統(tǒng)性能,不過(guò)也不能把這個(gè)指設(shè)置的過(guò)小,否則你可能會(huì)遭遇到“MySQL has gone away”之類的問(wèn)題。
通常來(lái)說(shuō),把wait_timeout設(shè)置為10小時(shí)是個(gè)不錯(cuò)的選擇,但某些情況下可能也會(huì)出問(wèn)題,比如說(shuō)有一個(gè)CRON腳本,其中兩次SQL查詢的間隔時(shí)間大于10秒的話,那么這個(gè)設(shè)置就有問(wèn)題了(當(dāng)然,這也不是不能解決的問(wèn)題,你可以在程序里時(shí)不時(shí)mysql_ping一下,以便服務(wù)器知道你還活著,重新計(jì)算wait_timeout時(shí)間):

MySQL服務(wù)器默認(rèn)的“wait_timeout”是28800秒即8小時(shí),意味著如果一個(gè)連接的空閑時(shí)間超過(guò)8個(gè)小時(shí),MySQL將自動(dòng)斷開(kāi)該連接。

然而連接池卻認(rèn)為該連接還是有效的(因?yàn)椴⑽葱r?yàn)連接的有效性),當(dāng)應(yīng)用申請(qǐng)使用該連接時(shí),就會(huì)導(dǎo)致下面的報(bào)錯(cuò):

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小時(shí)。

如果在wait_timeout秒期間內(nèi),數(shù)據(jù)庫(kù)連接(java.sql.Connection)一直處于等待狀態(tài),mysql就將該連接關(guān)閉。這時(shí),你的Java應(yīng)用的連接池仍然合法地持有該連接的引用。當(dāng)用該連接來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),就碰到上述錯(cuò)誤。
可以將mysql全局變量wait_timeout的缺省值改大。

查看mysql手冊(cè),發(fā)現(xiàn)對(duì)wait_timeout的最大值分別是24天/365天(windows/linux)。

比如將其改成30天

mysql> set global wait_timeout=124800;
Query OK, 0 rows affected (0.00 sec)

以上這篇Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • MySQL 4G內(nèi)存服務(wù)器配置優(yōu)化
  • MYSQL開(kāi)發(fā)性能研究之批量插入數(shù)據(jù)的優(yōu)化方法
  • Mysql中基本語(yǔ)句優(yōu)化的十個(gè)原則小結(jié)
  • mysql處理海量數(shù)據(jù)時(shí)的一些優(yōu)化查詢速度方法
  • MySQL優(yōu)化之緩存優(yōu)化
  • MySQL優(yōu)化之InnoDB優(yōu)化
  • mysql如何優(yōu)化插入記錄速度
  • 簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢
  • 優(yōu)化 MySQL 3 個(gè)簡(jiǎn)單的小調(diào)整

標(biāo)簽:湖南 仙桃 衡水 銅川 湘潭 黃山 蘭州 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql占用過(guò)高CPU時(shí)的優(yōu)化手段(必看)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    遂宁市| 大方县| 嘉祥县| 大余县| 呼玛县| 舟山市| 吉林市| 舟曲县| 陇南市| 那坡县| 阜南县| 溧水县| 汨罗市| 治多县| 漠河县| 汶川县| 中超| 南阳市| 任丘市| 奉贤区| 黄梅县| 天镇县| 长治县| 普兰店市| 瑞安市| 淄博市| 玉环县| 吉水县| 五大连池市| 湘阴县| 广东省| 临沭县| 都昌县| 长春市| 拜城县| 绵阳市| 泰来县| 奎屯市| 海伦市| 诸城市| 新蔡县|