mysql master thread_mysql innodb master_thread伪代码整理
void master_thread()
{
int innodb_io_capacity = 200 ;//表示磁盤IO吞吐量
int innodb_max_dirty_pages_pct = 75 ;//最大臟頁百分比
goto loop;
loop:
//1秒循環
for(int i = o; i<10; i++)
{
thread_sleep(1);//innodb 優化,壓力大時不總是等待1秒
//日志緩沖刷新到磁盤
do log buffer flush to disk;
//如果磁盤壓力小,合并插入緩沖
if ( last_one_second_ios < innodb_io_capacity*5% ?)
{
do merge at most innodb_io_capacity*5% insert buffer;
}
//判斷臟頁比例
if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct )
{
do buffer pool flush innodb_io_capacity*100% dirty page;
}
//如果開啟自適應刷新,通過判斷產生重做日志的速度來判斷合適的刷新臟頁數量
else if enable adaptive flush
{
do buffer pool flush desired amount dirty page;
}
//如果無用戶活動,切換到 backgroud loop
if ( no user activity )
{
goto backgroud loop;
}
}
//10秒循環
//如果磁盤壓力小,刷新innodb_io_capacity*100%的臟頁到磁盤
if ( last_ten_second_ios < innodb_io_capacity )
{
do buffer pool flush innodb_io_capacity*100% dirty page;
}
//合并插入緩沖
do merge at most innodb_io_capacity*5% insert buffer;
//日志緩沖刷新到磁盤
do log buffer flush to disk;
//刪除無用undo頁,每次最多刪除20個undo頁
do full purge;
//判斷臟頁比例
if ( buf_get_modified_ratio_pct >70% )//---------
{
do buffer pool flush innodb_io_capacity*100% dirty page;
}
else
{
do buffer pool flush innodb_io_capacity*10% dirty page;
}
//產生一個模糊檢查點,只是將最老日志序列號的頁寫入磁盤
do fuzzy checkpoint;
goto loop;
//backgroud
backgroud loop:
//刪除無用undo頁
do full purge;
//合并插入緩沖
do merge innodb_io_capacity*100% insert buffer;
//不空閑跳回主循環,空閑則進入flush loop
if not idle
{
goto loop;
}
else
{
goto flush loop;
}
//flush loop
flush loop:
//不斷刷新臟頁到磁盤,直到臟頁比例小于innodb_max_dirty_pages_pct,則進入suspend loop
do buffer pool flush innodb_io_capacity*100% dirty page;
while ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct );
goto suspend loop;
//suspend loop
suspend loop:
suspend_thread();
waiting event;
goto loop;
}
總結
以上是生活随笔為你收集整理的mysql master thread_mysql innodb master_thread伪代码整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL不能查看表_mysql roo
- 下一篇: mysql 外键有啥用途_Mysql外键