天天看點

MySQL5.6 Performance_schema 深入淺出

22.1 performance schema 快速入門

22.2 performance schema 配置

22.2.1 mysql編譯的時候 修改performance schema配置

22.2.2 mysql啟動的時候 修改performance schema配置

22.2.3 mysql運作過程中 修改performance schema配置

22.3 performance schema 查詢

22.4 performance schema instrument naming conventions

22.5 performance schema status 監控

22.6 performance schema 原子性,分子性 事件

22.7 performance schema statement 診斷

22.8 performance schema 基本表特征

22.9 performance schema 表的描述

22.9.1 performance schema 表的索引

22.9.2 performance schema setup 類型的表

22.9.3 performance schema instance 類型的表

22.9.4 performance schema wait event 類型的表

22.9.5 performance schema stage event 類型的表

22.9.6 performance schema statement event 類型的表

22.9.7 performance schema connection 類型的表

22.9.8 performance schema connection attribute 類型的表

22.9.9 performance schema summary 類型的表

22.9.10 performance schema 其他類型的表

22.10 performance schema 變量與選項

22.11 performance schema 指令選項

22.12 performance schema 系統變量

22.13 performance schema status變量

22.14 performance schema 與插件

22.15 使用performance schema 來診斷問題

22.15.1 使用performance schema來替代profiling

心得: performance_schema的使用

MySQL5.6 Performance_schema 深入淺出
MySQL5.6 Performance_schema 深入淺出
MySQL5.6 Performance_schema 深入淺出
MySQL5.6 Performance_schema 深入淺出
MySQL5.6 Performance_schema 深入淺出

這一節簡單的講解如何使用performance schema,并附上例子。如: section 22.15, “using the performance schema to diagnose problems”

如果要讓mysql可用,必須在mysql編譯的時候built進來。通過檢查伺服器的幫助資訊,你也可以确認一下perf 是否可用。如果可用,會有一些提示如:

如果以上變量沒有出現在你的output上,那麼說明你的mysql不支援performance schema。

請關注 section 22.2, “performance schema configuration”.

如果你performance schema被支援,那麼在mysql5.6.6開始就已經預設打開的。

如果要顯示打開關閉ps,那麼就在mysql啟動的時候加上performance_schema變量,

并且給予适當的值。比如:在你的my.cnf檔案中

一旦這樣配置後,當mysql啟動時,就會自動初始化performance schema。為了驗證初始化是否成功,

可以使用這樣的語句:

on表示成功,off表示有錯誤,請檢視相關error log 定位錯誤。

performance schema 是以存儲引擎的方式實作的,你可以通過information_schema.engines 或者

show engines來确認:

你可以像使用正常database一樣使用performance schema。

比如:use performance_schema, 以及show文法。

performance_schema資料庫名必須是小寫。可以使用show create table 檢視表:

也可以查詢 information_schema.columns來檢視列。

performance_schema裡面的表可以根據名字分類為:

current events

event histories

summaries

object instances

setup (configuration)

下面有些例子來簡單的使用這些表,詳細的使用請看:section 22.9, “performance schema table descriptions”.

一開始,不是所有的instrument 和 consumer 都會被enable , 是以一開始他們不會收集所有的事件。

為了讓他們都enable 或者 enable event timing。 執行以下兩條語句

如果想檢視某個時刻的等待事件,可以查詢 events_waits_current表。它記錄了每個thread最近的監控資訊。

這個事件說明 thread 0 在等待86526皮秒 來獲得一個鎖thr_lock::mutex,而這個鎖是mysys子系統中。

以下是列的一些描述

id: thread id

event name:别監控的instrument名字

timer 類型的列: 時間,以皮秒為基準機關

history 表包含了一些列相同僚件的曆史記錄,就如同current-events 一樣,不同的是,

有更多的記錄來說明伺服器最近做了什麼,而不是目前做了什麼。events_waits_history & events_waits_history_long 記錄了每個thread最近10條和10000條event。

如果這個表滿了,那麼新的event會被加進來,踢掉最老的那個。

summary 表提供了整個時間段的一些統計資訊。他們統計事件的處理方式和之前都不一樣。

如果想知道某個instrument 被執行的最頻繁,或者發生的頻率非常高,可以通過排序 events_waits_summary_global_by_event_name表,根據 count_star 或者 sum_timer_wait列。

以上說明thr_lock_malloc 非常hot。

instance 表記錄了什麼類型的object被instrumented。一個被instrumented的object,當被server使用時就會産生一個event。這些表提供了event名以及簡單的闡述。

比如:file_instances 就列出了file io相關的instance of instrument。

setup表用來配置和顯示監控資訊的。 例如:什麼樣的timer 被使用,

請查詢setup_timers

setup_instruments 列出了哪些event會被收集與監控:

相應了解如何翻譯這些instrument 的名字,請看:section 22.4, “performance schema instrument naming conventions”.

為了控制哪些event是不是instrument,可以給enabled設定yes or no。

performance schema 使用收集的events 來更新performance_schema 資料庫的那些表,這些表扮演着事件資訊消費者的角色。setup_consumers 列出了可用的消費者 以及哪些是enabled。

目前,一般的binary版本都會預設支援ps,不過最後還是想官方的provider 确認一下。

如果使用的是源碼包,用cmake with_perfschema_storage_engine 使其ok

如何check是否支援performance schema?

第一:

也可以

注意:show engines 中即便包含了performance_schema,隻能說明已經支援,不代表已經開啟。

如果要開啟,必須在start up階段設定,請看下一章節。

假設編譯的時候已經支援ps,那麼mysql5.6.6 版本以及以上版本都會預設enable 。

開啟,隻需要在my.cnf中

如果server沒有足夠多的記憶體用于初始化performance schema,那麼它會自己disable 掉,然後沒有instrument相關資訊。

mysql5.6.4版本開始,允許instrument 和 consumer在server startup階段配置。之前的版本都

隻能在runtime階段用update配置。

在startup階段控制instrument,可以用這種形式:

這裡面instrument_name 指的是類似wait/synch/mutex/sql/lock_open這種instrument,

value 就是下面其中一種:

off,false, or 0 關閉這個instrument

on,true,or 1 開啟這個instrument

counted:開啟并且統計這個instrument

--performance-schema-instrument 隻能指定一個instrument名字。多個instances可以在多instrument中配置。另外:模式也是被允許的。如:

關閉所有instrument,使用:

在startup階段控制consumer

這裡面$consumer_name 指的是consumer 如:events_waits_history,

$value 為:

off,false,or 0: 不收集這個consumer相關的事件

on,true,or 1 : 收集這個consumer相關的事件

例如:開啟events_waits_history consumer,

合法的consumer的名字可以在setup_consumers表中找到。模式比對是不允許的。

consumer的名字在setup_consumers中以下劃線表示,但是在starup 階段的my.cnf配置檔案中,

下劃線和橫線都是被允許的。

performance schema的預設系統變量:

performance_schema on 和 off 表示是否開啟和關閉。其他變量表示:表sizes(number of rows)以及記憶體配置設定

一旦開啟了performance schema,mysql就會配置設定記憶體,這個記憶體表示最小值,可能會更大,是以

需要根據自己的情況設定一個合理的值。

如果要改變系統變量的值,目前隻能在startup階段修改。如:在my.cnf中:

mysql5.6.6 以及以上版本,如果你不顯示的設定系統變量,那麼mysql自己會設定預設的值。

setup表:如果你有update權限,可以直接更改監控行為。

如果要檢視哪些事件選擇了哪些時間,可以檢視setup_timers

setup_instruments 列出了哪些instrument事件被收集

setup_consumers 列出了某一類consumer的instrument事件實際被收集

這是一個典型的生産者-消費者模式,即便你設定了setup_instruments=xx,

但是如果setup_consumers沒有設定對應的内容(即沒有消費者),那麼實際的instrument

也不會收集資料到performance schema的表中。

計時事件,主要用于提供事件到底話費了多少時間。當然,你也可以配置不開啟計時功能。

以下兩個表主要提供timer資訊:

performance_timers: 列出了可用的timers和他們的特點

setup_timers : 描述了哪些instrument對應哪些timers

setup_timer是裡面的每一條記錄都必須是performance_timers裡面定義好的内容。

一般都采用picsecond皮秒 作為基準機關。

事件處理是一種典型的生産者-消費者模式

instrument 生産事件,然後被收集。setup_instruments表列出來哪些instrument 可以被收集。

setup_instruments 提供了最基本的形式來控制事件的産生。其他的事件産生形式(如:基于某一個object或者thread)可以參考:section 22.2.3.3, “event pre-filtering”

performan schema裡面的那些表,就是用來事件的目的地和消費事件用的。setup_consumers表列出了很多類型的consumer

對于監控事件的過濾分為不同的階段:

pre-filtering: 修改performance schema的配置(開啟或者關閉相應的 instrument 或者 consumer),可以讓一部分事件從生産者中收集然後隻影響部分consumer. pre-filtering 完成後

會所有使用者産生全局影響。

post-filtering: 需要用到一些查詢語句(where子句)來過濾。post-filtering是基于使用者的不同使用者不一樣。

pre-filtering 既可以用在 producer , 也可以用在 consumer 中

配置pre-filtering用在 producer上,主要有這些表

setup_instruments : 如果對應的instrument關閉了,那麼就不會收集對應event的資訊,即便是production-related setup 表。

setup_objects : 控制了是否監控特定對象

threads : 是否每一個thread都會被監控

setup_actors: 決定了哪些host,user,role的foreground thread被監控。

配置pre-filtering用在 consumer上,主要是setup_consumers 這張表。這決定了被收集的event會被發送的目的地。setup_consumers 也會潛在影響production。如果給定的事件沒有被配置發送到任何地方(沒有consumer),那麼performance schema 也不會produce 它。

修改以上表,基本上都會立刻生效。但是也有一些例外:

某些setup_instruments 隻在server startup階段生效,即便你在running 階段設定也是沒有用的。

他們就是: mutexes, conditions, and rwlocks

setup_actors 隻影響foreground thread,并且隻會對新進來的thread有影響。已經存在的thread不受影響。

即便你修改了以上配置,performance schema不會flush 資訊到history表。原來的記錄還是存在current-events and history tables ,直到被新的event替換。關閉instrument,也是一樣。

當然,你可以truncate table 來情況history曆史表。

你也許也想使用truncate 來清空summary類型的表。遺憾的是truncate summary類型的表隻會将summary列設定為0或者null,不會删除資料。 events_statements_summary_by_digest例外。

更改立刻生效,部分必須在startup階段(mutexes, conditions, and rwlocks)

例子:

更改後,立刻生效。

例子1:

例子2:

略。。。

配置修改,立刻生效

關于setup_consumer 的幾個基本原則:

和consumer相關的destination 不會接收任何event,除非對于的consumer都開啟了

consumer隻有等待他所依賴的consumer都enable,才會被check。

如果一個consumer沒有被checked通過,或者check了,但是被disable了,那麼依賴它的那些consumer不會被check.

如果一個event沒有對應的destination(沒有對應的consumer),那麼會被自動disable.

以下列出consumer的等級關系圖:

也就是post-filtering,隻不過多了where 從句

名字基本都由‘/’分割,從左到右基本都是從普通粒度到精細粒度。

最上層的instrument 元件

idle

stage

statement

wait

idle instrument 元件

idle event描述來自:socket_instances.state 列: section 22.9.3.5, “the socket_instances table”.

stage instrument 元件

組成形式: stage/code_area/stage_name , code_area 一般是sql or myisam。

stage name 一般來自: show processlist,如:sorting result ,sending data

statement instrument 元件

statement/abstract/* : 一般都是早期的stage,在抽象sql都還沒來得及解析的時候。

statement/com: sql 指令操作 如:statement/com/connect

statement/sql: sql語句操作 如:statement/sql/create_db

wait instrument元件

wait/io : io 等待事件

wait/io/file : 檔案io等待事件。等待檔案操作完成的時間如:fwrite()。

但是實體io有可能因為緩存的原因調用fwrite時不會寫磁盤。

wait/io/socket: socket相關的io等待

wait/io/table : 表相關的io等待。一般對于記錄rows來說有fetch,insert,update,delete四種操作。

不像其他等待事件,table i/o 還包含了其他的等待事件。比如:table io可能包含了檔案io和記憶體io。因為讀取table rows的時候,有可能會去從檔案讀取資料。

show status like 'perf%'

這些狀态表明了由于記憶體限制,有哪些instrument不能被load或者create。

show engine performance_schema status

這個可以檢視status的最大值(.size),以及目前以及達到多少量了(.count)

如:

使用心得: 當(table_share_hash).count=(table_share_hash).size,那麼就會增加performance_schema_table_instances_lost的值。這樣新的表監控就不會被collect。這時候

可以drop 掉一些不用的表,那麼(table_share_hash).count 就會下降。

基本表隻允許truncate,select,其他操作都不允許。

variables目前隻能重新開機才能重新配置

重新開機mysql後,所有狀态都會重置

<a href="https://dev.mysql.com/doc/refman/5.6/en/performance-schema.html">https://dev.mysql.com/doc/refman/5.6/en/performance-schema.html</a>

<a href="http://www.markleith.co.uk/2011/04/18/monitoring-table-and-index-io-with-performance_schema/">http://www.markleith.co.uk/2011/04/18/monitoring-table-and-index-io-with-performance_schema/</a>