MySQL-Innodb-批量刷臟的場景

buf_flush_page_cleaner_coordinator協(xié)調線程的主循環(huán)主線程以最多1s的間隔或者收到buf_flush_event事件就會觸發(fā)進行一輪的刷臟蜻拨。
批量刷臟主要有3個場景。

  1. 同步刷臟
    如果 buf_flush_sync_lsn > 0, 則因為redo log free space 不夠了, 那么我們需要進入同步刷臟階段了练般。同步刷臟場景下,所有需要寫臟數(shù)據(jù)庫的用戶線程都會堵塞少孝,這是很嚴重的情況邑退。
  2. 正常刷臟
    最常見邏輯 srv_check_activity(last_activity), 也就是系統(tǒng)有正持袼危活動,有DML/DDL, 這個時候會通過 page_cleaner_flush_pages_recommendation() 函數(shù)去合理的判斷應該刷多少個page, 既不抖動, 也能夠滿足刷臟需求
  3. 空閑刷臟
    如果系統(tǒng)沒有DML\DDL活動地技,且ret_sleep == OS_SYNC_TIME_EXCEEDED蜈七,說明比較空閑∧#空閑的情況下因為服務器IO比較空閑飒硅,所以Innodb使用buf_flush_page_cleaner_coordinator線程本身進行刷新,刷新的塊數(shù)計算比較簡單就是innodb_io_capacity設置的值作谚。
/******************************************************************//**
page_cleaner thread tasked with flushing dirty pages from the buffer
pools. As of now we'll have only one coordinator.
@return a dummy parameter */
extern "C"
os_thread_ret_t
DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(
/*===============================================*/
    void*   arg MY_ATTRIBUTE((unused)))
            /*!< in: a dummy parameter required by
            os_thread_create */
{
    /* 忽略一些邏輯 */
    while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
        if (ret_sleep != OS_SYNC_TIME_EXCEEDED
            && srv_flush_sync
            && buf_flush_sync_lsn > 0) {
            /* 場景1 */
        } else if (srv_check_activity(last_activity)) {
            ulint   n_to_flush;
            lsn_t   lsn_limit = 0;

            /* Estimate pages from flush_list to be flushed */
            if (ret_sleep == OS_SYNC_TIME_EXCEEDED) {
                last_activity = srv_get_activity_count();
                n_to_flush =
                    page_cleaner_flush_pages_recommendation(
                        &lsn_limit, last_pages);
            } else {
                n_to_flush = 0;
            }
            /* 場景2 */
        } else if (ret_sleep == OS_SYNC_TIME_EXCEEDED) {
            /* 場景3 */
            /* no activity, slept enough */
            }
        } else {
            /* no activity, but woken up by event */
            n_flushed = 0;
        }
    }
」

三種場景下的具體工作

同步刷臟
pc_request(ULINT_MAX, lsn_limit),會把lsn小于lsn_limit的都flush到硬盤三娩,同時coordinator線程本身也會參與刷臟。

            /* woke up for flush_sync */
            mutex_enter(&page_cleaner->mutex);
            lsn_t   lsn_limit = buf_flush_sync_lsn;
            buf_flush_sync_lsn = 0;
            mutex_exit(&page_cleaner->mutex);

            /* Request flushing for threads */
            pc_request(ULINT_MAX, lsn_limit);

            ib_time_monotonic_ms_t tm = ut_time_monotonic_ms();

            /* Coordinator also treats requests */
            while (pc_flush_slot() > 0) {}

            /* only coordinator is using these counters,
            so no need to protect by lock. */
            page_cleaner->flush_time += ut_time_monotonic_ms() - tm;
            page_cleaner->flush_pass++;

            /* Wait for all slots to be finished */
            ulint   n_flushed_lru = 0;
            ulint   n_flushed_list = 0;
            pc_wait_finished(&n_flushed_lru, &n_flushed_list);

            if (n_flushed_list > 0 || n_flushed_lru > 0) {
                buf_flush_stats(n_flushed_list, n_flushed_lru);

                MONITOR_INC_VALUE_CUMULATIVE(
                    MONITOR_FLUSH_SYNC_TOTAL_PAGE,
                    MONITOR_FLUSH_SYNC_COUNT,
                    MONITOR_FLUSH_SYNC_PAGES,
                    n_flushed_lru + n_flushed_list);
            }

            n_flushed = n_flushed_lru + n_flushed_list;

正常刷臟
通過page_cleaner_flush_pages_recommendation計算需要刷新的頁妹懒。

            ulint   n_to_flush;
            lsn_t   lsn_limit = 0;

            /* Estimate pages from flush_list to be flushed */
            if (ret_sleep == OS_SYNC_TIME_EXCEEDED) {
                last_activity = srv_get_activity_count();
                n_to_flush =
                    page_cleaner_flush_pages_recommendation(
                        &lsn_limit, last_pages);
            } else {
                n_to_flush = 0;
            }

            /* Request flushing for threads */
            pc_request(n_to_flush, lsn_limit);

            ib_time_monotonic_ms_t tm = ut_time_monotonic_ms();

            /* Coordinator also treats requests */
            while (pc_flush_slot() > 0) {
                /* No op */
            }

            /* only coordinator is using these counters,
            so no need to protect by lock. */
            page_cleaner->flush_time += ut_time_monotonic_ms() - tm;
            page_cleaner->flush_pass++ ;

            /* Wait for all slots to be finished */
            ulint   n_flushed_lru = 0;
            ulint   n_flushed_list = 0;

            pc_wait_finished(&n_flushed_lru, &n_flushed_list);

            if (n_flushed_list > 0 || n_flushed_lru > 0) {
                buf_flush_stats(n_flushed_list, n_flushed_lru);
            }

            if (ret_sleep == OS_SYNC_TIME_EXCEEDED) {
                last_pages = n_flushed_list;
            }

            n_evicted += n_flushed_lru;
            n_flushed_last += n_flushed_list;

            n_flushed = n_flushed_lru + n_flushed_list;

            if (n_flushed_lru) {
                MONITOR_INC_VALUE_CUMULATIVE(
                    MONITOR_LRU_BATCH_FLUSH_TOTAL_PAGE,
                    MONITOR_LRU_BATCH_FLUSH_COUNT,
                    MONITOR_LRU_BATCH_FLUSH_PAGES,
                    n_flushed_lru);
            }

            if (n_flushed_list) {
                MONITOR_INC_VALUE_CUMULATIVE(
                    MONITOR_FLUSH_ADAPTIVE_TOTAL_PAGE,
                    MONITOR_FLUSH_ADAPTIVE_COUNT,
                    MONITOR_FLUSH_ADAPTIVE_PAGES,
                    n_flushed_list);
            }

空閑刷臟
空閑刷臟是coordinator自己進行雀监,直接按照PCT_IO(100)來生成刷新數(shù)量。
#define PCT_IO(p) ((ulong) (srv_io_capacity * ((double) (p) / 100.0)))

            buf_flush_lists(PCT_IO(100), LSN_MAX, &n_flushed);

            n_flushed_last += n_flushed;

            if (n_flushed) {
                MONITOR_INC_VALUE_CUMULATIVE(
                    MONITOR_FLUSH_BACKGROUND_TOTAL_PAGE,
                    MONITOR_FLUSH_BACKGROUND_COUNT,
                    MONITOR_FLUSH_BACKGROUND_PAGES,
                    n_flushed);

            }

http://mysql.taobao.org/monthly/2018/09/02/
http://www.reibang.com/p/6991304a8e26
https://mp.weixin.qq.com/s/o2OlvRiybIsqi7WU_Kvhiw

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眨唬,一起剝皮案震驚了整個濱河市会前,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匾竿,老刑警劉巖瓦宜,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搂橙,居然都是意外死亡歉提,警方通過查閱死者的電腦和手機笛坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門区转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苔巨,“玉大人,你說我怎么就攤上這事废离≈对螅” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵蜻韭,是天一觀的道長悼尾。 經(jīng)常有香客問我,道長肖方,這世上最難降的妖魔是什么闺魏? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮俯画,結果婚禮上析桥,老公的妹妹穿的比我還像新娘。我一直安慰自己艰垂,他們只是感情好泡仗,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猜憎,像睡著了一般娩怎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胰柑,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天截亦,我揣著相機與錄音,去河邊找鬼柬讨。 笑死崩瓤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的姐浮。 我是一名探鬼主播谷遂,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卖鲤!你這毒婦竟也來了肾扰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蛋逾,失蹤者是張志新(化名)和其女友劉穎集晚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體区匣,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡偷拔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莲绰。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡欺旧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤签,到底是詐尸還是另有隱情辞友,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布震肮,位于F島的核電站称龙,受9級特大地震影響,放射性物質發(fā)生泄漏戳晌。R本人自食惡果不足惜鲫尊,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沦偎。 院中可真熱鬧疫向,春花似錦、人聲如沸扛施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疙渣。三九已至匙奴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妄荔,已是汗流浹背泼菌。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啦租,地道東北人哗伯。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像篷角,于是被迫代替她去往敵國和親焊刹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351