国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

mysql commit 引起的性能問題

IT那活兒 / 3483人閱讀
mysql commit 引起的性能問題


概述



對于支持事務的關系型數據庫來說,事務的完成需要執行commit命令,用于保存該事務操作的相關日志、標記該事務已完成,確保數據的一致性。通常情況下,commit命令執行很快,但也會存在commit是性能瓶頸,影響整體數據庫性能的情況發生。




案例分析



慢日志分析

對慢日志分析可見,commit操作平均耗時近1分鐘是非正常現象。


MySQL commit機制

mysql數據庫為了保證binlog、redolog中事務的一致性,事務采用了兩階段提交(2pc)機制:

  • prepare階段

innodb write/sync事務redo、undolog,binlog不做任何操作。


  • commit階段

mysql層write/syncbinlog,innodb寫 commit 至redolog。

從這個機制可以看出,commit操作包括binlog的落地動作。這就延長了commit動作的時間,也成了一個性能瓶頸,為了優化這一性能問題,mysql5.6推出了組提交機制。


binlog組提交的基本思想是,引入隊列機制保證innodb commit順序與binlog落盤順序一致,并將事務分組,組內的binlog刷盤動作交給一個事務進行,實現組提交目的。


binlog提交將提交分為了3個階段,FLUSH階段,SYNC階段和COMMIT階段。基本流程如下:


FLUSH 階段

  1. 持有Lock_log mutex [leader持有,follower等待]

  2. 獲取隊列中的一組binlog(隊列中的所有事務)

  3. 將binlog buffer到I/O cache

  4. 通知dump線程dump binlog


SYNC階段

  1. 釋放Lock_log mutex,持有Lock_sync mutex[leader持有,follower等待]

  2. 將一組binlog 落盤(sync動作,最耗時,假設sync_binlog為1)


COMMIT階段

  1. 釋放Lock_sync mutex,持有Lock_commit mutex[leader持有,follower等待]

  2. 遍歷隊列中的事務,逐一進行innodb commit

  3. 釋放Lock_commit mutex

  4. 喚醒隊列中等待的線程


組提交就是每次sync一組binlog,從而提升效率,而一組binlog的數量則由以下兩個參數決定:


  • binlog_group_commit_sync_delay=N:在等待N μs后,開始事務刷盤

  • binlog_group_commit_sync_no_delay_count=N:如果隊列中的事務數達到N個,就忽視binlog_group_commit_sync_delay的設置




數據庫參數分析



參數名

參數值

sync_binlog

1

binlog_group_commit_sync_delay

1

binlog_group_commit_sync_no_delay_count

1000


以上參數為故障發生時數據庫的參數設置,可以看binlog_group_commit_sync_delay設置為1微妙,即1微妙內sync一組binlog,這對于高并發的dml操作而言對IO壓力相對比較大;sync_binlog參數在組提交機制下其意義也發生了變化,官方文檔如下:


當sync_binlog設置為0或1時,binlog_group_commit_sync_delay時間后sync一組binlog;當sync_binlog設置N(N>1)時binlog_group_commit_sync_delay時間后syncN組binlog。


所以整體上看,故障發生時有大量的dml操作,且因為數據庫的參數設置1微妙sync一組binlog,對IO造成了很大壓力,再加上同時有大量的select查詢,此刻IO已經達到極限,最終造成commit提交阻塞,事務不能及時釋放資源,其它dml操作因不能及時獲取事務鎖、io等資源而延長執行時間。




總結


由于數據庫設置為1微妙sync一組binlog,在大并發dml操作時對IO造成很大壓力,造成commit阻塞和其它dml操作執行延長。由于binlog的sync操作代價相對較高,因此可以增加每組binlog的數量、每次syncbinlog組的數量,減輕對IO的壓力。


設置sync_binlog為1,則commit操作需要等待binlog_group_commit_sync_delay時間才能完成,阻塞了commit操作,設置太大的值(如:1000),則一次syncbinlog量比較大,很容易造成IO波動,如果存大大事務,則IO波動會更大。


binlog_group_commit_sync_delay設置太小,則每組中binlog數量較小,起不到組提交帶來的性能優化,設置太大則阻塞了commit操作很長時間且binlog事務太大。


binlog_group_commit_sync_delay最好設置為10的倍數,不然會引起如下bug:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130192.html

相關文章

  • Java知識點總結(JDBC-事務)

    摘要:隔離級別個等級的事務隔離級別,在相同的數據環境下,使用相同的輸入,執行相同的工作,根據不同的隔離級別,可以導致不同的結果。不同事務隔離級別能夠解決的數據并發問題的能力是不同的。 Java知識點總結(JDBC-事務) @(Java知識點總結)[Java, JDBC] 事務 事務基本概念 一組要么同時執行成功,要么同時執行失敗的 SQL 語句。是數據庫操作的一個執行單元! 事務開始于:...

    Zachary 評論0 收藏0
  • JavaWEB開發13——事務與連接池

    摘要:一致性一個事務中,事務前后數據的完整性必須保持一致。持久性持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。 一、事務概述1.什么是事務一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗就是將n個組成單元放到一個事務中2.mysql的事務默認的事務:一條sql語句就是一個事務 默認就開啟事務并提交事...

    13651657101 評論0 收藏0
  • 記一次 Mybatis 一級緩存清理無效引起源碼走讀

    摘要:今天對象在學習時發現對象的方法并不能清理一級緩存同一下相同查詢條件返回的結果還是舊值。測試代碼如下上網搜索網上搜索找到了相同問題并沒有人解答。例如查看官方文檔實例有一個本地緩存在執行和時被清理。要明確地關閉它獲取打算做更多的工作你可以調用。 今天對象在學習 Mybatis 時發現 org.apache.ibatis.session.SqlSession 對象的 clearCache()...

    voyagelab 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<