使用pt-stalk分析MySQL的效能波動

G8bao7發表於2016-03-18
轉發: 
其他: https://www.percona.com/blog/2013/01/03/percona-toolkit-by-example-pt-stalk/



簡介
在MySQL伺服器出現短暫(5~30秒)的效能波動的時候,一般的效能監控工具都很難抓住故障現場,也就很難收集對應較細粒度的診斷資訊。另外,如果這種波動出現的頻率很低,例如幾天才一次,我們也很難人為的抓住現場,收集資料。這正是pt-stalk所解決的問題。


引數
–function:設定觸發條件,包括status、processlist、自定義指令碼,詳細見觸發條件部分。
–dest:設定collect資訊的儲存目錄,預設/var/lib/pt-stalk/。
另外設定–dest /u01/mysql選項到mysql目錄之後,pt-stalk在清理超過期限的日誌時,會暴力的將該目錄下所有修改時間超過一定日期的檔案全部刪掉,
因此在設定dest目錄時必須慎重(如果設定最好是一個獨立的目錄,而不是跟mysql或者其他設定在同一個目錄)。–dest預設值是
檢視pt-stalk的原始碼:
            # Delete collect files which more than --retention-time days old. find "$dir" -warn -type f -mtime +$retention_time -exec rm -f '{}' \;
–iterations:該引數指定pt-stalk在收集幾次故障現場後就退出。預設pt-stalk會一直執行。
–run-time:觸發收集後,該引數指定收集多長時間的資料。預設是30秒,比如show processlist會連續收集30次。
–sleep:為防止一直觸發收集資料,該引數指定在某次觸發後,必須sleep一段時候才繼續觀察並觸發收集。預設是300秒
–interval:預設情況pt-stalk會每隔一秒檢查一次狀態資料,判斷是否需要觸發收集。該引數指定間隔時間,預設是1秒。
–cycles:預設情況pt-stalk只有連續觀察到五次狀態值滿足觸發條件時,才觸發收集。該引數控制,需要連續幾次滿足條件,收集被觸發,預設是5次。
–verbose:設定log的輸出級別,預設是2;第一次執行可以設定為3,方便觀察情況。
LEVEL PRINTS
===== =====================================
0     Errors
1     Warnings
2     Matching triggers and collection info
3     Non-matching triggers
–plugin:和–function引數類似,可以指定一個包含before_collect、after_collect等函式的shell指令碼。

pt-stalk的觸發條件
三種觸發條件,透過引數function設定:
  1. status
    –function status –variable Threads_connected –threshold 2500,表示MySQL狀態值Threads_connected超過2500時觸發資料收集。常用的觸發條件還可以使用Threads_running等。
  2. processlist
    –function processlist –variable State –match statistics –threshold 10,表示,show processlist中State列的值為statistics的執行緒數超過10則觸發收集。
  3. 自定義指令碼
    包含 trg_plugin函式的shell指令碼, trg_plugin 函式必須返回一個int值,比如下面的指令碼,因為slow log的status是一個累加值,不能分析差值,因此寫小指令碼來獲取差值,對slow突然出現的尖刺進行分析。
function trg_plugin(){ current_slow=`mysql -uroot -pxxx -P5002 -S/opt/tmp/mysql5002.sock -e"show global status like 'Slow_queries'" -B -N|awk '{print $2}'` current_timestamp=`date '+%s'` #when first execute,the last_timestamp is empty if [ ! -e Slow_queries ];then echo "$current_timestamp $current_slow">Slow_queries echo "0" exit 0 fi last_timestamp=`cat Slow_queries|awk '{print $1}'` last_slow=`cat Slow_queries|awk '{print $2}'` echo "$current_timestamp $current_slow">Slow_queries let diff_timestamp=$current_timestamp-$last_timestamp let diff_slow=$current_slow-$last_slow #echo "$diff_timestamp $diff_slow" if [ $diff_timestamp -gt 11 ];then echo "0" else echo $diff_slow fi }


實際例子
pt-stalk --daemonize --function=slow_log_status.sh --variable=my_custemed_condition --cycles=1 --threshold=2 --interval=10 --socket=/opt/tmp/mysql5002.sock --verbose=3


收集結果
可以看到收集的資訊非常的全面,包括大量的系統狀態(IO、CPU、網路卡)等以及大量MySQL資訊(processlist、innodb status、variables等)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-2059636/,如需轉載,請註明出處,否則將追究法律責任。

相關文章