MySQL監控&性能瓶頸排查


監控的意義&目的

業務/數據庫服務是否可用

通過事務實時性能數據變化感知業務的變化

數據庫性能變化趨勢判斷服務器資源是否足夠

數據可靠性

業務數據是否可靠

服務可用,不代表數據就是正確的

有可能誤操作刪除數據,或者其他意外原因丟失數據

或者主從復制延遲,導致在從數據庫無法讀取到最新數據

通過模擬隨機業務邏輯來驗證數據可靠性

服務可用性

是否可對外提供服務

進程在運行,但沒監聽網絡,或者授權不正確,或者網絡出故障

因此不能只監控進程啟動與否,是否監聽網絡

最好能模擬業務邏輯進行監控

這個業務邏輯除了能完成可用性監控外,還可以進行數據可靠性監控

服務器&MySQL實例出現高負載

服務可用,但響應很慢,其實等於不可用

響應很慢時,用戶不耐煩一直刷屏,更容易引起風暴

需要及時關注整個系統響應時長、每秒處理事務數

可用性告警

快速報告線上服務宕掉及恢復情況

歷史趨勢

了解線上計算資源使用情況

作為計算資源擴容/收縮的參考

作為優化工作的成果展示記錄

 

監控之關鍵指標

常規運行情況匯總

CPU:%user,%sys,%idle,%iowait,是否發生中斷不均衡

內存:free,cached,swap,是否有內存泄漏和OOM

I/O:iops、吞吐、時延、利用率(%util)

網卡:吞吐、注意小包發送頻率

 

系統監控

常規工具

top、free、ps、df

sysstat(sar、vmstat、mpstat、iostat)、dstat、iotop

netstat

其他工具

perf

pstack

top負載大於5要注意

free詳解

used,已經使用的內存總量

free,剩余物理內存

shared,已廢棄不用

buffers,寫緩沖

cached,讀緩沖

實際可再分配內存:total = used + free + shared + buff/cache

對比cache和used = (total - free)的差異大小

used和cache相差太大第一感覺就是內存泄漏

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

cpu消耗高的原因大概有幾個 1)函數的運算 2)排序的進行 3)鎖等待和爭用

sar詳解

-u,Report CPU utilization

-d,Report activity for each block device

-r,memory utilization statistics

vmstat -S m 1 50

iostat -dmx 1

iotop -oP

 

看iops,iowait,%util

dstat 1

xfs要預留10%磁盤空間,用來存xfs的日中,小心,否則容易丟數據

 

MySQL監控

MySQL服務性能,是否有瓶頸

tps,qps,慢查詢,rt,鎖,等待,表緩存,線程緩存,臨時表,臨時文件

鎖:表鎖,行鎖,鎖等待,死鎖

內存:buffer/cache命中率、等待釋放

事務:事務ID增長率,unpurge歷史事務,checkpoint lag,大事務,長事務

慢查詢:平均耗時、平均次數,slow query重點關注distinct page特別多的

ibp監控

purge lag -- History list length

checkpoint lag

活躍時間最長的事務

select * from I_S.innodb_trx order by trx_started asc limit 1;

等待時間最長的事務

select * from sys.innodb_lock_waits order by wait_age_secs desc limit 1;

要特別關注的大事務

select * from I_S.innodb_trx where

    trx_lock_structs >= 5 or           -- 超過5把鎖

    trx_rows_locked >= 100 or      -- 超過100行被鎖

    trx_rows_modified >= 100 or   -- 超過100行被修改

    time_to_sec(timediff(now(),trx_started)) > 100;    -- 事務活躍超過100秒

監控大SQL、慢SQL

監控SQL注入風險

MySQL鎖監控

表級鎖

table_locks_immediate

table_locks_waited

行級鎖

innodb_row_lock_current_wait   -- 當前等待的行鎖數量

innodb_row_lock_time   -- 請求行鎖總耗時(ms)

innodb_row_lock_time_avg   -- 請求行鎖平均耗時(ms)

innodb_row_lock_time_max   -- 請求行鎖最久耗時(ms)

innodb_row_lock_waits   -- 行鎖發生次數

等待事件

innodb_buffer_pool_wait_free/innodb_log_wait等

臨時表/臨時文件

created_tmp_disk_tables/created_tmp_files等

打開表/文件數

open_files/open_table_definitions/open_tables等

並發連接

threads_running/threads_created/threads_cached等

查看MySQL狀態

show [full] processlist; 查看不良狀態

show [global] status;

show engine innodb status\G

tail -f slow.log

perf top 神器

數據緩存buffer (data page)

innodb_buffer_pool_pages_data_b = innodb_page_size * innodb_buffer_pool_pages_data

待刷新buffer

innodb_buffer_pool_pages_dirty_b = innodb_page_size * innodb_buffer_pool_pages_dirty

空閑buffer

innodb_buffer_pool_pages_free_b = innodb_page_size * innodb_buffer_pool_pages_free

緩存命中率

innodb_buffer_pool_hit_ratio = (innodb_buffer_pool_read_requests/(innodb_buffer_pool_read_requests+innodb_buffer_pool_reads)) * 100

MySQL服務可用性

不僅能連上,還能正常查詢&及時返回結果

MySQL復制是否終止,延遲多大

高一致性要求的場景,復制幾乎不能有延遲

如何衡量平均響應時長(average rt) 

通過模擬N次隨機業務邏輯判斷響應耗時,或通過MySQL的基准測試函數BENCHMARK()來判斷

select benchmark(100000000,'call mysp()');

select benchmark(100000000,'select 1+1'); 

 

業務監控

業務狀態監控

是否正常、tps、平均響應時長、自定義錯誤代碼

接口響應延遲

在監控系統調用應用接口,探測其響應延遲,該接口實現一些基本的業務邏輯 

 

flush status;

selec ...;

show status like 'handler_read%';

set profiling = 1;

select ...;

show profiles;

show profile for query N;

 

MySQL關鍵選項

key_buffer_size = 8M

sort/join/read/read rnd buffer = 4M

tmp/heap table = 96M

binlog_format = row

sync_binlog = 1

long_query_time = 0.01~0.05

log_queries_not_using_indexes = 1 & log_throttle_queries_not_using_indexes = 10

interactive_timeout = wait_timeout = 600

lock_wait_timeout = 3600

log_error_verbosity = 3

time_zone = "+8:00"

thread_handling, 能支持時,若有大量短連接場景就啟用

sql_safe_updates = 1

innodb_data_file_path = ibdata1:1G:autoextend

innodb_buffer_pool_size,建議物理內存的50%~80%

innodb_max_dirty_pages_pct,建議不超過50%

innodb_log_buffer_size,建議32M左右

innodb_thread_concurrency = 0

innodb_lock_wait_timeout = 5~10

innodb_log_file_size = 1G

innodb_log_files_in_group = 4~8

innodb_flush_log_at_trx_commit = 1

innodb_io_capacity, innodb_io_capacity_max 根據I/O子系統性能調整

innodb_flush_sync = 0

innodb_autoinc_lock_mode = 1

推薦使用my.cnf生成工具

 

MySQL關鍵狀態

aborted_*

created_tmp_*

handler_read_*

*_wait_*

open_tables, opened_tables

select_full_join

select_scan

sort_merge_passes

threads_*

*copy*, *copying*

creating sort index, sorting result

creating tmp table

closing tables, opening tables

converting HEAP to ondisk

altering table / creating index

preparing / query end

sending data / sending to client

waiting for ... lock

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM