MySQL資料庫伺服器逐漸層慢分析

來源:互聯網
上載者:User

標籤:style   blog   io   color   ar   os   使用   for   sp   

第一步 檢查系統的狀態

1.1 使用sar來檢查作業系統是否存在IO問題

#sar -u 2 10 — 即每隔2秒檢察一次,共執行20次。

     

[[email protected] tester]# sar -u 2 1010:51:22 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle10:51:24 AM     all     13.74      0.00      5.60     42.49      0.00     38.1710:51:26 AM     all     20.15      0.00     11.99     43.37      0.00     24.4910:51:28 AM     all     14.07      0.00      9.72     56.78      0.00     19.4410:51:30 AM     all     37.24      0.00     11.99     30.61      0.00     20.1510:51:32 AM     all     33.25      0.00     10.23     44.50      0.00     12.0210:51:34 AM     all     22.76      0.00     12.28     49.10      0.00     15.8610:51:36 AM     all     17.97      0.00      8.10     43.29      0.00     30.6310:51:38 AM     all     19.44      0.00      9.21     53.20      0.00     18.1610:51:40 AM     all     26.85      0.00     12.53     38.36      0.00     22.2510:51:42 AM     all     22.25      0.00      9.21     42.46      0.00     26.09Average:        all     22.77      0.00     10.08     44.41      0.00     22.74

其中:
%usr指的是使用者進程使用的cpu資源的百分比;
%sys指的是系統資源使用cpu資源的百分比;
%wio指的是等待io完成的百分比,這是值得觀注的一項;
%idle即閒置百分比。
如果wio列的值很大,如在35%以上,說明系統的IO存在瓶頸,CPU花費了很大的時間去等待I/O的完成。Idle很小說明系統CPU很忙。像以上的樣本,可以看到wio平均值為11,說明I/O沒什麼特別的問題,而idle值為零,說明cpu已經滿負荷運行了。

1.2 使用vmstat監控記憶體 cpu資源

# vmstat

[[email protected] tester]# vmstatprocs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  5      0 2654300 181588 2070476    0    0     0    31    4    0  0  0 99  0  0

vmstat 的輸出那些資訊值得關注?
io bo: 磁碟寫的資料量稍大,如果是大檔案的寫,10M以內基本不用擔心,如果是小檔案寫2M以內基本正常

 

1.3 使用iostat查看io讀寫情況

#iostat -x -k -d 1 10 

-d 採樣時間為1秒,採樣2次

-x 顯示更詳細的io裝置統計資訊

-k 以kB為單位顯示讀寫資訊

linux # iostat -x -k -d 1 10Linux 2.6.16.60-0.21-smp (linux)     06/13/12……Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %utilsda               0.00  9915.00    1.00   90.00     4.00 34360.00   755.25    11.79  120.57   6.33  57.60

以上各列的含義如下:

  • rrqm/s: 每秒對該裝置的讀請求被合并次數,檔案系統會對讀取同塊(block)的請求進行合并
  • wrqm/s: 每秒對該裝置的寫請求被合并次數
  • r/s: 每秒完成的讀次數
  • w/s: 每秒完成的寫次數
  • rkB/s: 每秒讀資料量(kB為單位)
  • wkB/s: 每秒寫資料量(kB為單位)
  • avgrq-sz:平均每次IO操作的資料量(扇區數為單位)
  • avgqu-sz: 平均等待處理的IO請求隊列長度
  • await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
  • svctm: 平均每次IO請求的處理時間(毫秒為單位)
  • %util: 採用周期內用於IO操作的時間比率,即IO隊列非空的時間比率

 

對於以上樣本輸出,我們可以擷取到以下資訊:

  1. 每秒向磁碟上寫30M左右資料(wkB/s值)
  2. 每秒有91次IO操作(r/s+w/s),其中以寫操作為主體
  3. 平均每次IO請求等待處理的時間為120.57毫秒,處理耗時為6.33毫秒
  4. 等待處理的IO請求隊列中,平均有11.79個請求駐留

1.4網路問題

telnet一下MySQL對外開放的連接埠,如果不通的話,看看防火牆是否正確設定了。

看看MySQL是不是開啟了skip-networking的選項,如果開啟請關閉。

 

第二步 檢查mysql參數

2.1.1 max_connect_errors

max_connect_errors預設值為10,如果受信帳號錯誤串連次數達到10則自動堵塞,需要flush hosts來解除。如果你得到象這樣的一個錯誤:
Host ’hostname’ is blocked because of many connection errors.
Unblock with ’mysqladmin flush-hosts’
這意味著,mysqld已經得到了大量(max_connect_errors)的主機’hostname’的在中途被中斷了的串連請求。在max_connect_errors次失敗請求後,mysqld認定出錯了(象來字一個駭客的攻擊),並且阻止該網站進一步的串連,直到某人執行命令mysqladmin flush-hosts。
內網串連的話,建議設定在10000以上,已避免堵塞,並定期flush hosts。

2.1.2 connect_timeout

指定MySQL服務等待應答一個串連報文的最大秒數,超出該時間,MySQL向用戶端返回 bad handshake。預設值是5秒,在內網高並發環境中建議設定到10-15秒,以便避免bad hand shake。建議同時關注thread_cache_size並設定thread_cache_size為非0值,大小具體調整。

2.1.3 skip-name-resolve
skip-name-resolve能大大加快使用者獲得串連的速度,特別是在網路情況較差的情況下。MySQL在收到串連請求的時候,會根據請求包中獲得的ip來反向追查要求者的主機名稱。然後再根據返回的主機名稱又一次去擷取ip。如果兩次獲得的ip相同,那麼串連就成功建立了。在DNS不穩定或者區域網路內主機過多的情況下,一次成功的串連將會耗費很多不必要的時間。假如MySQL伺服器的ip地址是廣域網路的,最好不要設定skip-name-resolve。


2.1.4 slave-net-timeout=seconds
參數含義:當slave從主要資料庫讀取log資料失敗後,等待多久重建立立串連並擷取資料。預設值是3600秒,如果需要保證同步性,如此NC的參數請極力控制在10秒以下。


2.1.5 master-connect-retry
參數含義:當重建立立主從串連時,如果串連建立失敗,間隔多久後重試。預設是60秒,請按照合理的情況去設定參數。

 

第三步 檢查mysql 相關狀態值

3.1關注串連數
如果串連數達到了最大串連數,那不管有多少資源,使用者都會阻塞在外面。
修改mysql最大串連數:
開啟my.ini,修改max_connections=100(預設為100)。

mysql> show variables like ‘max_connections‘;


請根據硬體情況調整到合適的大小,一般經驗值可設為3000。Windows伺服器大概支援量為1500-1800個串連,linux伺服器可以支援到8000個左右。
請將max_user_connections設0——–這個0代表不限制單使用者的最大串連數,其最大串連值可以等於max_connections值。
mysql> show global status like ‘Max_used_connections‘;
檢查下最大的過往使用串連數,這個值在max_connections的85%左右是比較合適的,如果過高則是max_connections過少或者系統負荷過高了。

 

3.1.1 mysqladmin -uroot status

mysql> status;--------------Connection id:          1Current database:Current user:           [email protected]SSL:                    Not in useCurrent pager:          stdoutUsing outfile:          ‘‘Using delimiter:        ;Server version:         5.5.39-log MySQL Community Server (GPL)Protocol version:       10Connection:             Localhost via UNIX socketServer characterset:    latin1Db     characterset:    latin1Client characterset:    utf8Conn.  characterset:    utf8UNIX socket:            /tmp/mysql.sockUptime:                 2 min 17 secThreads: 1  Questions: 9  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.065

3.1.2 show full processlist   (show processlist state 只顯示100條,顯示全部用 show full processlist )


1.顯示所有進程

mysql> show full processlist;+—–+——+———–+——+———+——+——-+———————–+| Id  | User | Host      | db   | Command | Time | State | Info                  |+—–+——+———–+——+———+——+——-+———————–+| 629 | root | localhost | NULL | Query   |    0 | NULL  | show full processlist || 633 | root | localhost | NULL | Sleep   |   11 |       | NULL                  |+—–+——+———–+——+———+——+——-+———————–+2 rows in set (0.00 sec)

2.如果正在啟動並執行語句太多,已耗用時間太長,表示MySQL效率有問題。必要的時候可以將對應的進程kill掉。

殺死休眠的進程kill ID號
mysql> kill 633;
Query OK, 0 rows affected (0.00 sec)

 

3.2 關注慢查詢(slow query)日誌
日誌必然會拖慢系統速度,特別是CPU資源,所以如果CPU資源充分,可以一直開啟,如果不充足,那就在需要調整的時候,或者在replication從伺服器上開啟(針對select)
mysql> show variables like ‘%slow%’;
+———————+—————————————-+
| Variable_name       | Value                                  |
+———————+—————————————-+
| log_slow_queries    | OFF                                    |
| slow_launch_time    | 2                                      |
| slow_query_log      | OFF                                    |
| slow_query_log_file | /data0/mysql/3306/data/mysql1-slow.log |
+———————+—————————————-+
4 rows in set (0.00 sec)
 
mysql> set  GLOBAL slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)


3.2.1關注慢查詢涉及的表的相關狀態
1.       表內記錄數。盡量控制在500萬行以內(有索引),建議控制在200萬行
2.       表內索引的使用。
3.       表如果update,delete,insert頻繁,可以考慮optimize table最佳化下檔案存放,索引,儲存空間。
4.       表內update,insert,delete查詢的鎖定時間。
5.       select for update如果條件欄位無索引的話,會引起的是鎖全表而不是行鎖,請關注。
6.       如果查詢包括GROUP BY但你想要避免排序結果的消耗,你可以指定ORDER BY NULL禁止排序。

 

MySQL資料庫伺服器逐漸層慢分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.