MTS性能監控你知道多少

来源:https://www.cnblogs.com/greatsql/archive/2023/08/02/17599760.html
-Advertisement-
Play Games

### 前言 說到MySQL的MTS,相信很多同學都不陌生,從5.6開始基於schema的並行回放,到5.7的LOGICAL_CLOCK支持基於事務的並行回放,這些內容都有文章講解,在本篇文章不再贅述。今天要講的是,你知道如何查看並行回放是否存在性能瓶頸嗎,是由於主庫事務行為導致無法並行回放,還是由 ...


前言

說到MySQL的MTS,相信很多同學都不陌生,從5.6開始基於schema的並行回放,到5.7的LOGICAL_CLOCK支持基於事務的並行回放,這些內容都有文章講解,在本篇文章不再贅述。今天要講的是,你知道如何查看並行回放是否存在性能瓶頸嗎,是由於主庫事務行為導致無法並行回放,還是由於worker線程不足,限制了並行回放的天花板?這都得從一個Note信息說起。

MY-010559

在開啟了多線程回放的從庫error log,我們經常能看到Note級別的日誌信息MY-010559

file
讓我們來看看這些日誌的含義

Seconds elapsed:當前時間與上次輸出日誌時間的間隔秒數

Events assigned:自slave協調線程啟動後,累計處理分發給worker線程的event數量。簡單理解為slave啟動後處理的event數量。

Worker queues filled over overrun level:worker線程處理的event隊列長度超過最大隊列數(目前代碼硬編碼16384)的90%的次數,如果0則說明未發生該情況。

Waited due to worker queue full:worker線程處理的event隊列長度達到最大(目前代碼硬編碼16384)的次數,如果為0則說明未發生該情況,是前面Worker queues filled over overrun level的情況升級。

Waited due to the total size:協調線程分發event大小達到replica_pending_jobs_size_max或者slave_pending_jobs_size_max限制而產生等待的次數。前面兩個參數是限制worker線程處理event隊列能夠申請的最大記憶體(即大事務)。如果遇到此種大事務,在回放該大事務之前,會等待其他worker線程處理完已分配event,然後再進行該大事務的回放,回放過程中,後續的event回放,也會進入等待狀態。總之,大事務回放特別影響並行回放的性能,只能串列回放。

Waited at clock conflicts:由於不能並行回放的累計等待時間,單位納秒。如果並行回放策略設置的是DATABASE而不是LOGICAL_CLOCK,該值一直為0。

Waited (count) when workers occupied:協調線程休眠次數。有兩種情況會累加此狀態值:1、worker線程達到最大隊列數(目前代碼硬編碼16384)的90%,此種情況協調線程最多休眠1毫秒;2、並行回放策略設置為LOGICAL_CLOCK時,由於沒有空閑的worker線程導致無法分配事務的第一個event而產生的等待,此種情況協調線程會一直處於等待狀態直到有空閑的worker線程能夠處理回放。

Waited when workers occupied:等待空閑的worker線程累計時間,單位納秒,對應Waited (count) when workers occupied的第二種等待情況。

代碼分析

在8.0.26版本的代碼中,我們通過錯誤信息關鍵字waited at clock conflicts查找,發現信息記錄在變數ER_RPL_MTS_STATISTICS中,

file
繼續按變數查找,發現其使用在rpl_replica.cc文件的apply_event_and_update_pos函數中,主要邏輯代碼如下

file
可以看到,滿足如下幾個條件,日誌信息就會輸出

  1. 並行回放為開啟狀態
  2. 並行回放的累計event數量對1024取模餘1
  3. 當前時間減去上次日誌時間間隔大於mts_online_stat_period(硬編碼120)秒
  4. error log日誌級別為info(log_error_verbosity=3)

上述幾個條件,和並行回放的事務繁忙程度並沒有太大的關係,滿足條件即會記錄日誌。假如一個事務有4個event,參數設置正常,每兩分鐘執行256個事務,就會輸出一條日誌信息,一秒鐘3個事務不到。

日誌解析觀察

在我的日誌文件中,取瞭如下兩條連續的信息

2023-07-09T08:58:01.001019+08:00 909 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel 'group_replication_applier': seconds elapsed = 180; events assigned = 11515905; worker queues filled over overrun level = 8314; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 136628031500 waited (count) when Workers occupied = 242457 waited when Workers occupied = 2223254351900
2023-07-09T09:00:01.648124+08:00 909 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel 'group_replication_applier': seconds elapsed = 120; events assigned = 11518977; worker queues filled over overrun level = 8314; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 136644607700 waited (count) when Workers occupied = 242491 waited when Workers occupied = 2223755727800

第一條解析信息如下:

. 本次日誌輸出時間點為2023-07-09T08:58:01.001019
. 與上次日誌輸出間隔時間為180秒
. 累計處理event數量為11515905
. worker線程處理的event隊列長度超過最大隊列數(目前代碼硬編碼16384)的90%的累計次數8314次
. worker線程處理的event隊列長度達到最大隊列數(目前代碼硬編碼16384)的累計次數為0次
. 回放event大小達到replica_pending_jobs_size_max或者slave_pending_jobs_size_max的次數為0
. 由於不能並行回放而產生的累計等待時間為136628031500納秒(約136.62秒)
. 協調線程累計休眠242457次
. 累計等待空閑worker線程的時間為2223254351900納秒(約2223.33秒)

第二條解析信息如下:

. 本次日誌輸出時間點為2023-07-09T09:00:01.648124
. 與上次日誌輸出間隔時間為120秒
. 累計處理event數量為11518977,新增處理event數量3072(為1024的3倍)
. worker線程處理的event隊列長度超過最大隊列數(目前代碼硬編碼16384)的90%的累計次數8314次,新增0次
. worker線程處理的event隊列長度達到最大隊列數(目前代碼硬編碼16384)的累計次數為0次
. 回放event大小達到replica_pending_jobs_size_max或者slave_pending_jobs_size_max的次數為0
. 由於不能並行回放而產生的累計等待時間為136644607700納秒(約136.64秒,新增等待約0.02秒)
. 協調線程累計休眠242457次,新增34次
. 累計等待空閑worker線程的時間為2223755727800納秒(約2223.38,新增等待約0.05秒)

通過上述信息,可以看出,在日誌階段,系統處於空閑狀態,處理事務數不多。 對比各個參數,在系統繁忙時,因為不能並行回放產生的等待時間為136.64秒,等待空閑的worker線程累計時間為2223.38,因此增大slave_parallel_workers的參數值,可以提升並行回放性能。

總結

[Note] [MY-010559]在我剛開始接觸時,以為是系統出現了異常產生的日誌,待真正瞭解其內容後,才發現通過該日誌可以幫助我們瞭解MTS運行情況,針對性的做優化調整。

參考鏈接https://dev.mysql.com/doc/refman/8.0/en/replication-threads-monitor-worker.html


Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • module_init是linux內核提供的一個巨集, 可以用來在編寫內核模塊時註冊一個初始化函數, 當模塊被載入的時候, 內核負責執行這個初始化函數. 在編寫設備驅動程式時, 使用這個巨集看起來理所應當, 沒什麼特別的, 但畢竟我還是一個有點追求的程式員嘛:P, 這篇文章是我學習module_init... ...
  • 第一種 每打開一次終端都輸入一次 source /etc/profile,這樣就可以載入配置文件,環境變數自然就有了 第二種 輸入vim ./bashrc,在底部添加配置在/etc/profile里的配置,這樣就可以無需使用source命令載入了 也可以在./bashrc底部添加 source /e... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230802124620904-1514854566.png) # 1. 示例數據 ## 1.1. student ```sql insert into student val ...
  • 當企業的業務發展到一定的階段時,在系統中引入[監控告警系統](https://www.dtstack.com/dtengine/easymr?src=szsm)來對系統/業務進行監控是必備的流程。沒有監控或者沒有一個好的監控,會導致開發人員無法快速判斷系統是否健康;告警的實質則是“把人當服務用”,用 ...
  • 開發者的技術能力良莠不齊,DBA對資料庫知識的局限性導致爛SQL無處不在,而且隨著資料庫的不斷變更或演進,一些好的SQL也可能逐步變成需要優化的爛SQL, 我們要時刻不斷地找尋它們的蹤跡。 ...
  • ### 分享技術,用心生活 >背景:系統中有一個統計頁面載入特別慢,前端設置的40s超時時間都載入不出來數據,因為是個統計頁面,基本上一猜就知道是mysql的語句有問題,遺留了很久沒有解決,正好趁不忙的時候,下定決心一定把它給搞定! ## 1. 分析原因 (mysql5.7) 執行一下問題sql,可 ...
  • MySQL8_SQL語法 SQL 全稱 Structured Query Language,結構化查詢語言。操作關係型資料庫的編程語言,定義了一套操作關係型資料庫統一標準 。 一、SQL通用語法 在學習具體的SQL語句之前,先來瞭解一下SQL語言的同於語法。 1). SQL語句可以單行或多行書寫,以 ...
  • 複製,即在不同的節點上保存相同的副本,提供數據冗餘。如果一些節點不可用,剩餘的節點仍然可以提供數據服務,這些節點可能部署在不同的地理位置,以此來改善系統性能 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...