日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 重启io线程_MySQL IO线程及相关参数调优

發布時間:2025/3/12 数据库 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 重启io线程_MySQL IO线程及相关参数调优 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、關于一個SQL的簡單的工作過程

1、工作前提描述

1、啟動MySQL,在內存中分配一個大空間innodb_buffer_pool(還有log_buffer)

2、多用戶線程連接MySQL,從內存分配用戶工作空間(其中排序空間)

3、磁盤上有數據庫文件、ib_logfile、tmp目錄、undo

2、SQL的簡易流程

1、DQL操作

1、首先進行內存讀

2、如果buffer pool中沒有所需數據,就進行物理讀

3、物理讀數據讀入buffer pool,再返回給用戶工作空間

2、DML操作(例update)

1、內存讀,然后進行物理讀,讀取所需修改的數據行

2、從磁盤調入undo頁到buffer pool中

3、修改前的數據存入undo頁里,產生redo

4、修改數據行(buffer pool中數據頁成臟頁),產生redo

5、生成的redo先是存于用戶工作空間,擇機拷入log_buffer中

6、log線程不斷的將log_buffer中的記錄寫入redo logfile中

7、修改完所有數據行,提交事務,刻意再觸發一下log線程

8、待log_buffer中的相關信息都寫完,響應事務提交成功

至此,日志寫入磁盤,內存臟塊還在buffer pool中(后臺周期寫入磁盤,釋放buffer pool空間)。

二、影響SQL執行性能的因素,及具體看方式

1、大量物理讀

mysql> show global status like 'i%read%';| Innodb_buffer_pool_reads | 647 |

| Innodb_data_read | 48402944 |

| Innodb_data_reads | 2996 |

| Innodb_pages_read | 2949 |

| Innodb_rows_read | 1002172 |

1、Innodb_buffer_pool_reads:物理讀次數

2、Innodb_data_read:物理讀數據字節量

3、Innodb_data_reads:物理讀IO請求次數

4、Innodb_pages_read:物理讀數據頁數

5、Innodb_rows_read:物理讀數據行數

2、Log寫性能

mysql>show engine innodb status \G---

LOG

---

Log sequence number 144064129//已經生成的日志量(累計值)/單位:字節

Log flushed up to 144064129//已經寫入的日志量(累計值)Pages flushed upto 144064129//已經寫入的臟頁量(累計值)Lastcheckpoint at 144064120//檢查點

0 pending log flushes, 0pending chkp writes92 log i/o's done, 0.00 log i/o's/second

關于redo log的寫入:

1、Innodb_os_log_written:日志刷盤的字節數,如果在commit不怎么變化的情況下,這個值出現暴增,說明系統出現大事務了(處理:kill線程,必要情況kill掉mysql進程);

2、Innodb_log_writes:日志寫的次數。

3、磁盤排序

mysql> show status like 'Sort_merge_passes';+-------------------+-------+

| Variable_name | Value |

+-------------------+-------+

| Sort_merge_passes | 0 |

+-------------------+-------+

1 row in set (0.00 sec)

用戶所需數據,如果沒有內存buffer pool中,就發生物理讀;

如果需要過濾掉很多數據,就會影響物理讀和內存讀,因為返回很多的數據(物理讀),在內存中需要過濾掉很多數據(內存讀);

如果涉及到group/order by,會在用戶工作空間完成排序等,如果結果集過大,用戶空間過小,進行磁盤排序,Sort_merge_passes>0 ,這就很影響數據庫性能了。

三、MySQL線程及其工作

MySQL的工作機制是單進程多線程:IO線程=一個log線程+四個read線程+四個write線程

mysql>show engine innodb status \G--------

FILE I/O--------

I/O thread 0 state: waiting for i/o request (insertbuffer thread) I/O thread 1 state: waiting for i/o request (logthread) I/O thread 2 state: waiting for i/o request (readthread) I/O thread 3 state: waiting for i/o request (readthread) I/O thread 4 state: waiting for i/o request (readthread) I/O thread 5 state: waiting for i/o request (readthread) I/O thread 6 state: waiting for i/o request (write thread) I/O thread 7 state: waiting for i/o request (write thread) I/O thread 8 state: waiting for i/o request (write thread) I/O thread 9 state: waiting for i/o request (write thread)

1、讀操作:innodb_read_io_threads

1、發起者:用戶線程發起讀請求

2、完成者:讀線程執行請求隊列中的讀請求操作

3、如何調整讀線程的數量

mysql> show variables like 'innodb_read_io_threads';+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| innodb_read_io_threads | 4 |

+------------------------+-------+

1 row in set (0.01 sec)

默認是開啟4個讀線程,

靜態參數,修改至配置文件中

4、如何確定是否需要增加讀線程的數量

查看線程的狀態:

I/O thread 2 state: waiting for i/o request (read thread)

2、寫操作:innodb_write_io_threads

1、發起者:page_cleaner線程發起

2、完成者:寫線程執行請求隊列中的寫請求操作

3、如何調整寫線程的數量

mysql> show variables like 'innodb_write_io_threads';+-------------------------+-------+

| Variable_name | Value |

+-------------------------+-------+

| innodb_write_io_threads | 4 |

+-------------------------+-------+

1 row in set (0.01 sec)

默認是開啟4個寫線程,

靜態參數,修改至配置文件中

4、如何確定是否需要增加寫線程的數量

查看線程的狀態:

I/O thread 6 state: waiting for i/o request (write thread)

關于innodb_purge_threads:page cleaner 線程

作用:

1、負責對 undo 數據頁的清空

2、數據頁中 delete 標志行的清除

3、清理 innodb buffer pool,負責把內存中的臟頁發起寫請求,write 線程負載把臟頁刷新到磁盤上。

3、日志線程

3.1、只有一個日志線程

1、是否繁忙

I/O thread 1 state: waiting for i/o request (log thread):閑

2、日志寫性能

mysql> show global status like 'Innodb_log_waits';+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| Innodb_log_waits | 0 |

+------------------+-------+

1 row in set (0.00 sec)

如果log buffer太小,就很容易滿,導致無法寫入,產生日志等待。

3、日志寫壓力

1、每秒吞吐量

mysql> show global status like 'Innodb_os_log_written';  #redo log寫的字節數+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| Innodb_os_log_written | 57856 |

+-----------------------+-------+

1 row in set (0.01 sec)

2、每秒寫入次數

mysql> show global status like 'Innodb_log_writes';+-------------------+-------+

| Variable_name | Value |

+-------------------+-------+

| Innodb_log_writes | 59 |

+-------------------+-------+

1 row in set (0.01 sec)

3.2、對于日志監控來說,三個經典參數

1、Innodb_log_waits  #redo寫入的等待次數

2、Innodb_log_writes  #redo寫入的次數

3、Innodb_os_log_written  #寫入redo logfile中的字節量

3.3、日志寫入異常判斷

mysql> show engine innodb status \G

Pending flushes (fsync) log: 0;

mysql> show global status like 'Innodb_os_log_pending_fsyncs';+------------------------------+-------+

| Variable_name | Value |

+------------------------------+-------+

| Innodb_os_log_pending_fsyncs | 0 |

+------------------------------+-------+

1 row in set (0.00 sec)

1、fsync:繞過文件系統緩存,直接將內存中的數據寫入存儲中,實現數據真正寫入可靠的介質磁盤里。(對于redo log來說,通過fsync方式寫入磁盤才是可靠的保證,因為寫入文件系統緩存的提交成功響應并不是真正的將redo寫入磁盤的logfile中)(sync:同步)

2、pending:掛起(寫不動),redo寫入存儲cache過程中,某種原因io繁忙,cache被占滿,超時響應,就會被掛起;

3、>0就說明系統IO出現問題,=0說明is OK。

四、log buffer調整依據

log buffer:日志緩存,一般都很小,調整100M足夠使用

mysql> show variables like "%log_buffer%";+------------------------+----------+

| Variable_name | Value |

+------------------------+----------+

| innodb_log_buffer_size | 16777216 |

+------------------------+----------+

5.7默認是16M,5.6默認是8M

1、文件中(log file):每次寫的時候全局都寫,不會挑著撿著寫

1、日志寫線程每一秒redo日志緩沖刷新到重做日志文件

2、每個事務提交時會將重做日志緩沖刷新到重做日志文件

3、每當重做日志緩沖池剩余空間小于1/2時,重做日志緩沖刷新到重做日志文件。

2、在企業中往往設置50-100M,最多設置為2、300M,調整依據:

1、內存空間足夠大

2、日志產生量大,系統io阻塞了,系統的io占用的是一個帶寬,log_writes線程被阻塞,log buffer滿了,數據庫會hang住。

3、Innodb_log_waits(狀態值)

The?number?of?times?that?the?log?buffer?was?too?small?and?a?wait?was?required?for?it?to?be?flushed?before?continuing.

總結

以上是生活随笔為你收集整理的mysql 重启io线程_MySQL IO线程及相关参数调优的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。