innodb data written / read
計算每秒questions
數據庫性能變化趨勢判斷服務器資源是否足夠
select benchmark(100000000, 'call mysp()'); #第一個函數調用多少次,第二個函數執行的sql。 注意響應時間
select benchmark(100000000, ‘select 1+1'); #判斷服務器性能,做基准測試。然后監控系統監控每秒指標,響應時長。
mysqladmin ext | grep -i trx #判斷事物id,percona版本才有,官方版本查看information_schema查看trx信息&innodb status
select * from QUERY_RESPONSE_TIME; percona查看sql區間響應耗時
idle = 100% - %user - %sys - %iowait
iowait越高說明當前IO性能差,io負載高。
真正可用的內存有:free + cached + buffer
IOwait高可能是buffer poll太小導致讀盤多,或者沒索引走全表掃描。
常用工具:top、free、ps、df、sysstat、(sar、mpstat、iostat)\dstat\omstaat、netstat、oprofile、systemtap、perf
iotop
sysstat(sar、mpstat、iostat)\ dstat \ omstaat \ iotop
select case when sum(DATA_LENGTH)+sum(INDEX_LENGTH) is NULL then 0 else sum(DATA_LENGTH)+sum(INDEX_LENGTH) end as innodb_tabsize from information_schema.TABLES where TABLE_SCHEMA not in ('information_schema','mysql','performance_schema','test') and ENGINE = 'InnoDB';#統計is庫
實際可用內存為buffer/cache + free
釋放 swap:swapoff/swapon #負載高容易hang
sar -u #CPU利用率
sar -d #塊設備,IO利用率,rd_sec/s wr_sec/s (讀寫扇區)每個扇區是512字節 ,可計算相應多少字節,可用iotop定位。await,io等待。 svctm本次io響應時間, util使用率ssd不用太擔心,機械是串行寫入,ssd可並行寫入。
sar -r #磁盤利用率 %memused 查看是否平穩。
vmstat:
vmstat -S m 1 #只是內存用兆方式顯示,1秒刷新。
r:在運行隊列中等待未執行的進程數 。
b:在等待io的進程數 ,不能被中斷的進程。
b:在等待io的進程數 ,不能被中斷的進程。
表示正在發生的swap
bi = block in to mem read from disk,io讀
bo = block out from mem write to disk,io寫
si = block in to swap in from disk,swap讀(單位是block 4kb)
so = block out from swap out to disk,swap寫(單位是block 4kb)
swpd列:總的swap
us = %user
sy = %sys
id = %idle #cpu空閑率
wa = %iowait
st = 虛擬機使用的cpu資源
cpu比較高基本是沒有索引引起的
iostat -d -x 1
r/s+w/s=iops
await:總的服務時間包括隊列時間。通常大於svctm
svctm:服務時間
util:util比較高說明當前io占比高。如果是磁盤陣列,因為可以並行,所以不太靠譜。ssd並行IO更好,每秒一兩百m,也不太靠譜。
io不高而svctm,util比較高,說明服務器性能比較差。
avgqu-sz是平均請求隊列的長度
iops \ iowait \ util #查看io瓶頸
計算機械盤iops 10000轉/60s=167(iops),多盤可以並行*盤數*Linux(4kb)
配置最大連接數,如果每個線程配置的cache比較大,內存溢出導致服務不可用。
mysql監控:
1. 每秒活躍DML(sql)數,/事物數/請求數/當前並發連接數/平均響應時長
2.鎖:表鎖,行鎖,鎖等待,死鎖。#最大行鎖時間,發生次數。
3,內存:buffer/cache命中率、內存如果等待釋放(如果內存等待釋放,mysqld可能需要增加buffer)。
4.事物:事物ID增長,有沒有持續穩定增長。unpurged 未清除的歷史事物積壓有多少。
5.慢查詢:平均耗時,平均次數
mysqladmin ext|grep -i 'Innodb_buffer_pool_wait_free'
3個等待事件狀態,如果有發生需要關注:
1.Innodb_buffer_pool_wait_free #innodb等待更多的buffer、page釋放,比較嚴重,說明當前buffer使用很厲害,沒有空閑。
2.innodb_log_waits #redo log 需要切換,沒有足夠空間。
3.table_locks_waited #請求表鎖的時候沒有立刻獲得表鎖,需要等待。
慢日志,看哪種sql發生最多,優先解決,其次解決耗時最長。
查看mysql狀態:
1,show 【full processlist】 #sending data,超過1秒請求數據量太大。
2,show 【global】 status like"handler%" #讀隨機下一行,發生全表掃描或者全表join, 產生臨時表甚至臨時文件,發生多少次。
鎖監控:
表鎖
1.table_locks_immediate #立刻獲得的表鎖
2.table_locks_waited #發生的請求需要等待
行鎖
1.innodb_row_lock_current_waits #當前等待的行鎖數量
2.innodb_row_lock_time #從實例啟動到當前,請求行鎖總耗時
3.innodb_row_lock_time_avg #請求行鎖平均耗時
4.innodb_row_lock_time_max #請求行鎖最久耗時(ms,可以對此事物加監控)
5.innodb_row_lock_waits #行鎖發生次數
show processlist;
copying to tmp table #沒有索引(條件鏈沒有合適索引)

總耗時,是否發生全表掃描,全表join,掃描的數據頁有12252
select count(*) 通常優先訪問輔助索引。
dstat\orzdba.pl #mysql兩個不錯的監控工具
監控事物ID的增長

這兩種表示沒有利用索引發生的讀
show global status;或者mysqladmin extended-status 縮寫、簡寫模式 mysqladmin ext
Aborted_clients #由於客戶端沒有正確關閉連接導致客戶端終止而中斷的連接數。
Binlog_cache_disk_use #無法使用內存保存binlog,需要使用基於磁盤的臨時文件次數。
binlog-cache-size #將內存中的binlog寫到磁盤之前緩沖,提升寫入。如果太小導致比較大的事物無法將binlog內存,會用到磁盤。
Binlog_stmt_cache_disk_use &Binlog_stmt_cache_use #非事務性的用到磁盤文件(以myisam為主)
Created_tmp_disk_tables #用到磁盤表
Binlog_cache_use #使用臨時二進制日志緩存的事務數量,越多越好。
Connections #試圖連接到(不管是否成功)MySQL 服務器的連接數
Created_tmp_tables #服務器執行語句時自動創建的內存中的臨時表的數量。如果 Created_tmp_disk_tables 較大,你可能要增加 tmp_table_size 值使臨時表基於內 存而不基於硬盤。
Created_tmp_disk_tables #服務器執行語句時在硬盤上自動創建的臨時表的數量。
tmp-table-size & max-heap-table-size #允許在內存里面最大的臨時內存是多少。
Created_tmp_disk_tables/(Created_tmp_disk_tables+Created_tmp_tables)*100% #高於10%的話,就需要注意,適當 調高 tmp_table_size ,但是不能設置太大,因為它是每個 session 都會分配的, 可能會導致 OOM
Handler_commit#內部交語句數。
Handler_read_first #索引中第一條記錄被讀的次數。如果較高,它表明服務器正執行大量全索引掃 ; 例如,SELECT id FROM table,假定 id 有索引。
Handler_read_key #根據索引讀取某一行的請求次數,例如:select … where id = 1024;
Handler_read_last #order by倒序讀總次數
Handler_read_next #按照索引順序讀下一行的請求數。如果你用范圍約束或如果執行索引掃描來查詢索引列,該值增加。
例如:select * from t where id = 1024 order by id limit 5; 先read-key 然后4條是read-next
Handler_read_prev,例如倒序:select id from t where id = 1024 order by id DESC limit 5;往回讀增加4
Handler_read_rnd #根據固定位置讀一行的請求數。如果你正執行大量查詢並需要對結果進行排序該值較高,說明可能使用了大量需要MySQL掃描整個表的查詢或沒有正確使用索引。例如select * from t limit 1000,1; 數據庫層面邏輯讀
Handler_read_rnd_next #在數據文件中讀下一行的請求數。如果你正進行大量的表掃描,該值會較高。通常說明你的表索引不正確或寫入的查詢沒有利用索引。例如根據非索引列排序后再讀取多少條記錄(甚至發生基於磁盤的臨時文件進行排序,先從數據庫取到數據,再進行二次排序 select * from t order by non_key_col limit 100;
Handler_read_rnd&Handler_read_rnd_next沒有利用索引應該重點關注下。
如果懷疑某些SQL效率比較差:
flush status;#先將session 值清空
select xxx; #show status like 'handler_read%';
Innodb_buffer_pool_pages_data #在innodb buffer_pool中有多少個page用來緩存熱點數據的,與InnoDB status的Database pages是同一個意思
Innodb_buffer_pool_pages_dirty #表示用來緩存臟頁的page 數量
Innodb_buffer_pool_pages_free #沒有用到的page數量
Innodb_buffer_pool_pages_total #page總數
Innodb_buffer_pool_read_requests #InnoDB已經完成的邏輯讀請求數。(Innodb所有讀操作的次數)
Innodb_buffer_pool_reads# 讀操作不能從Innodb buffer pool中完成讀取,需要從磁盤中讀取數據的次數。
Innodb_buffer_pool_wait_free #innodb buffer pool不夠用了等待把熱點數據或臟頁的buffer pool釋放次數,該參數大於0比較嚴重
Innodb_buffer_pool_write_requests #一共發生的寫請求次數
Innodb_data_writes #實際物理寫次數
Innodb_data_read #從啟動到現在已經讀取的數據數量(字節)
Innodb_data_written #從啟動到現在已經寫入的數據量(字節)。
Innodb_log_waits #我們必須等待的時間,因為redo日志緩沖區太小,我們在繼續前必須先等待對它清空。
所有帶wait關鍵字都需要引起注意。
鎖:
Innodb_row_lock_current_waits #當前等待行鎖的行數。
Innodb_row_lock_time #從啟動到現在,行鎖定花費的總時間,單位毫秒。
Innodb_row_lock_time_avg #行鎖定的平均時間,單位毫秒。
Innodb_row_lock_time_max #行鎖定等待的最長時間,單位毫秒(一般建議設置為10秒)。這個值太大的話,可以考慮調低 innodb_lock_wait_timeout 值
Open_tables #當前正在用打開表空間文件,打開表的數量。如果當前1個表被並發10個線程訪問,每個線程打開次數都算1.
Open_table_definitions #被緩存的.frm文件數量,一般該值就是表的數量。
table-open-cache,table-definition-cache #如果表cache不夠大,需要關閉歷史表才可以打開新表。
flush tables #把正在打開的表關閉,這種操作會產生mdl鎖,盡量不要操作。備份時的FTWRL也是將所有表重新打開一遍
Opened_tables #歷史總共打開次數,如果Opened_tables較大,table_open_cache 值可能太小。
no-auto-rehash #如果表太多,客戶端沒使用該參數,每次打開都會統計表信息。
Queries #已經發送給服務器的查詢的個數,通常指DML
Questions #發送到服務器的請求次數。
和性能有關:
Select_full_join #沒有使用索引的聯接的數量。如果該值不為0,你應仔細檢查表的索引,可以查慢日志。
Select_scan #對一個表進行完全掃描的聯接的數量
Slow_queries #查詢時間超過 long_query_time秒的查詢的個數
Sort_merge_passes #對一個結果進行排序時,又不能基於索引排序,需要多次 遞進排序才能得到最終結果。排序算法已經執行的合並的數量,每次合並都要加1。如果這個變量值較大,應考慮增加sort_buffer_size系統變量的值,盡量不要產生基於磁盤的臨時文件。
default_tmp_storage_engine #5.6開始可以強制定義產生的臨時表使用引擎
Table_locks_immediate #立即獲得的表的鎖的次數,絕大多數指的是myisam引擎,innodb 發生dml時做DDL操作也會發生表鎖。
Table_locks_waited #不能立即獲得的表的鎖的次數。如果該值較高,並且有性能問題,你應首先優化查詢,然后拆分表
Threads_cached #當前緩存了多少個線程
Threads_connected #當前正在打開的連接的數量。
Threads_created #創建用來處理連接的線程數。如果Threads_created較大,你可能要增加thread_cache_size值。緩存訪問率的計算方法Threads_created/Connections。
Threads_running #激活的(非睡眠狀態)線程數
innodb_thread_concurrency #innodb內部可以允許並發的數量,設置為邏輯CPU數量即可。