監控的意義&目的
業務/數據庫服務是否可用
通過事務實時性能數據變化感知業務的變化
數據庫性能變化趨勢判斷服務器資源是否足夠
數據可靠性
業務數據是否可靠
服務可用,不代表數據就是正確的
有可能誤操作刪除數據,或者其他意外原因丟失數據
或者主從復制延遲,導致在從數據庫無法讀取到最新數據
通過模擬隨機業務邏輯來驗證數據可靠性
服務可用性
是否可對外提供服務
進程在運行,但沒監聽網絡,或者授權不正確,或者網絡出故障
因此不能只監控進程啟動與否,是否監聽網絡
最好能模擬業務邏輯進行監控
這個業務邏輯除了能完成可用性監控外,還可以進行數據可靠性監控
服務器&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