現在的位置: 首頁 > 綜合 > 正文

Percona-Server/MySQL響應時間統計

2018年05月03日 ⁄ 綜合 ⁄ 共 4456字 ⁄ 字型大小 評論關閉

在Percona的5.1.53和5.5.8版本,開始將RT的統計內置到MySQL Server端。Thanks, Percona.

Percona在提供了tcprstat工具統計RT時間之後,很快就在Percona Server中集成了響應時間統計的功能。這裡介紹一下該功能,各位看官如果在猶豫選擇Percona
Server
還是MySQL Community Server,這裡給Percona Server加一個籌碼。

"響應時間"(Response time,後面簡稱RT)在資料庫應用中,特別是OLTP的場景,可以說非常重要,不過,MySQL官方版本中一直沒有加上這個統計功能。最早,社區開始嘗試tcmdump+perl腳本的方式查看RT,後來告警一點用tcpdump+mk-query-digest,再後來Ignacio
Nin和Baron Schwartz完成了tcprstat。

在Percona的5.1.53和5.5.8版本,開始將RT的統計內置到MySQL Server端。

1. 配置該功能

這個是功能默認是關閉的,可以通過設置參數query_response_time_stats=1打開這個功能,這是一個動態參數,所以在伺服器上可以很方便的打開或者關閉這個功能。可以通過命令SHOW QUERY_RESPONSE_TIME查看響應時間統計。

默認關閉狀態:
SHOW QUERY_RESPONSE_TIME; +----------------+---+----------------+ | | | | +----------------+---+----------------+ | 0.000001 | 0 | 0.000000 | | 0.000010 | 0 | 0.000000 | | 0.000100 | 0 | 0.000000 | | 0.001000 | 0 | 0.000000 | ...... | 1000000.00000 | 0 | 0.000000 | | TOO LONG | 0 | TOO LONG | +----------------+---+----------------+
打開參數後:
set global query_response_time_stats=1; Query OK, 0 rows affected (0.00 sec) 08:23:13>SHOW QUERY_RESPONSE_TIME; +----------------+-------+----------------+ | | | | +----------------+-------+----------------+ | 0.000001 | 7982 | 0.000000 | | 0.000010 | 13927 | 0.014511 | | 0.000100 | 43811 | 1.553811 | | 0.001000 | 29 | 0.007936 | | 0.010000 | 1 | 0.001711 | | 0.100000 | 0 | 0.000000 |

這裡可以看到,響應時間小於0.000001的SQL有7982個,0.000001 < RT < 0.000010有13927個, 0.000010 < RT < 0.000100有43811 ...... 。這樣整個系統的響應時間就清晰了。

2. INFORMATION_SCHEMA.QUERY_RESPONSE_TIME

除了用命令SHOW QUERY_RESPONSE_TIME,還可以通過INFORMATION_SCHEMA裡面的表QUERY_RESPONSE_TIME來查看MySQL的響應時間。

08:25:16>SELECT * from INFORMATION_SCHEMA.QUERY_RESPONSE_TIME; +----------------+--------+----------------+ | time | count | total | +----------------+--------+----------------+ | 0.000001 | 33824 | 0.000000 | | 0.000010 | 59222 | 0.060457 | | 0.000100 | 186003 | 6.659908 | | 0.001000 | 117 | 0.025163 | | 0.010000 | 8 | 0.014534 |

使用INFORMATION_SCHEMA.QUERY_RESPONSE_TIME,就可以稍微定製一下輸出結果了:

SELECT time, CONCAT(ROUND(100*count/query_count,2),"%") as percent,count FROM( SELECT c.count, c.time, ( SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0 ) as query_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count > 0 ) d; +----------------+---------+--------+ | time | percent | count | +----------------+---------+--------+ | 0.000001 | 12.64% | 81557 | | 0.000010 | 20.69% | 133440 | | 0.000100 | 66.62% | 429705 | | 0.001000 | 0.05% | 339 | | 0.010000 | 0.00% | 10 | | 1000.000000 | 0.00% | 1 | +----------------+---------+--------+
3. 高端一點的功能:定製化時間區間

默認的時間區間是:

(0; 10 ^ -6], (10 ^ -6; 10 ^ -5], (10 ^ -5; 10 ^ -4], ..., (10 ^ -1; 10 ^1], (10^1; 10^2]...(10^

你可以通過修改參數query_response_time_range_base來縮小時間區間,默認該參數是10,時間區間如上。

例如我們修個set global query_response_time_range_base=2; 則區間如下:

(0; 2 ^ -19], (2 ^ -19; 2 ^ -18], (2 ^ -18; 2 ^ -17], ..., (2 ^ -1; 2 ^1], (2 ^ 1; 2 ^ 2]...(2 ^

第一個區間總是最接近0.000001區間開始(2^19次方最接近);最後一個區間是到最接近且小於10000000處結束。

具體的:

set global query_response_time_range_base=2;

flush QUERY_RESPONSE_TIME;

SHOW QUERY_RESPONSE_TIME;

| 0.000001 | 711 | 0.000000 |

| 0.000003 | 1456 | 0.001456 |

......

| 0.125000 | 0 | 0.000000 |

| 0.250000 | 0 | 0.000000 |

| 0.500000 | 0 | 0.000000 |

| 1.000000 | 0 | 0.000000 |

| 2.000000 | 0 | 0.000000 |

| 4.000000 | 0 | 0.000000 |

| 8.000000 | 0 | 0.000000 |

| 16.000000 | 0 | 0.000000 |

......

| 8388608.00000 | 0 | 0.000000 |

| TOO LONG | 0 | TOO LONG |
一些注意事項

在備庫上,只有打開了參數log_slow_slave_statements(這個參數也是Percona Server上特有的)時,slave
sql線程的SQL才會被統計。

啟動變數have_response_time_distribution,不能配置,該參數只表示該Server是否具有上述的RT統計功能。

設置了query_response_time_range_base,必須flush QUERY_RESPONSE_TIME後才生效。這裡flush做兩件事情,使得QUERY_RESPONSE_TIME生效,另外清空之前的統計結果。

累了,聽首歌,扭扭脖子吧:)

廣告:我們尋找靠譜的人 | 感謝作者

參考文獻:

1. Introducing tcprstat, a TCP response time tool

2. The tcprstat User's Manual

3. Using Tcpdump for MySQL query logging

4. How to use tcpdump on very busy hosts

5. Take a look at mk-query-digest

6. Implementation Details: Response Time Distribution

7. Percona Software Documentation :Response Time Distribution

【附錄】

既然上面讀取INFORMATION_SCHEMA的SQL已經有些複雜了,那就不怕再複雜一些:

SELECT case TRIM(time) when '0.000001' then '< 1us' when '0.000010' then '< 10us' when '0.000100' then '<100us' when '0.001000' then '< 1ms' when '0.010000' then '< 10ms' when '0.100000' then '<100ms' when '1.000000' then '< 1s' when '10.000000' then '< 10s' when '100.000000' then '<100s' else '>100s' END as `RT area`, CONCAT(ROUND(100*count/query_count,2),"%") as percent, count FROM( SELECT c.count, c.time, ( SELECT SUM(a.count) FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as a WHERE a.count != 0 ) as query_count FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME as c WHERE c.count > 0 ) d; +---------+---------+--------+ | RT area | percent | count | +---------+---------+--------+ | < 10us | 41.92% | 404409 | | <100us | 21.34% | 205881 | | < 1ms | 35.20% | 339574 | | < 10ms | 1.30% | 12586 | | <100ms | 0.18% | 1736 | | < 1s | 0.02% | 160 | | < 10s | 0.04% | 340 | +---------+---------+--------+
轉自:http://www.orczhou.com/index.php/2011/09/thanks-percona-response-time-distribution/

抱歉!評論已關閉.