線上 Linux 環境 MySQL 磁盤 IO 高負載深度排查與性能優化實戰

目錄

一、線上告警

二、問題診斷

1.?系統層面排查

2. 數據庫層面分析

三、參數調優

1. sync_binlog 參數優化

2. innodb_flush_log_at_trx_commit 參數調整

四、其他優化建議

1.?日志文件位置調整

2. 生產環境核心參數配置模板

3. 突發 IO 高負載應急響應方案

五、風險提示

六、總結


一、線上告警

????????某一天,生產環境監控系統突然報警:MySQL 磁盤 IOPS 持續超過 15000,平均響應時間突破 500ms,慢查詢數量大量增加。登錄數據庫服務器發現:

  • 磁盤利用率長期維持在 98% 以上
  • iostat -x 1顯示%util持續 100%
  • MySQL 進程 CPU 使用率達 90%,但大部分時間處于iowait狀態

二、問題診斷

1.?系統層面排查

# 查看系統整體IO情況
$ iostat -x 1 10
Linux 5.4.0-150-generic (mysql-prod-01)  03/22/2025  _x86_64_  (32 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle7.2    0.00    4.5    12.3     0.0    76.0Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.0      0.0     0.0  14828.0      0.0  245440.0     33.1      7.5     0.5     0.0     0.5    0.0  99.8
sdb               0.0   4567.0   230.0   2800.0   18400.0  224000.0    152.8     12.5     4.1     2.8     4.2    0.3  99.9# 監控MySQL進程IO情況
$ pidstat -d 1
Linux 5.4.0-150-generic (mysql-prod-01)  03/22/2025  _x86_64_  (32 CPU)15:30:01      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
15:30:02        0     12345      0.00  245760.00      0.00  mysqld# 分析IO請求分布
$ iotop -o
Total DISK READ :       0.00 B/s | Total DISK WRITE : 240.00 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE: 240.00 M/sTID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
12345 be/4  mysql       0.00 B/s 240.00 M/s  0.00 % 99.99 % mysqld --defaults-file=/etc/mysql/my.cnf

通過上述命令發現:

  • MySQL 進程(PID 12345)占用了 92% 的磁盤寫 IO
  • 大部分 IO 集中在/var/lib/mysql/ib_logfile0/var/lib/mysql/mysql-bin.000001文件

2. 數據庫層面分析

-- 查看InnoDB日志等待情況
mysql> SHOW ENGINE INNODB STATUS\G
*************************** 1. row ***************************Type: InnoDBName: 
Status: 
=====================================
2025-03-22 15:35:23 0x7f8a1c000700 INNODB MONITOR OUTPUT
=====================================
[...]
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
288334 OS file reads, 1234567 OS file writes, 876543 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 245.00 writes/s, 120.00 fsyncs/s
[...]-- 分析慢查詢日志
$ pt-query-digest /var/log/mysql/slow.log > slow_query_report.txt

關鍵發現:

  • InnoDB 日志等待事件占比達 68%
  • 大量簡單 INSERT 語句執行時間超過 200ms
  • binlog 寫入等待成為性能瓶頸

三、參數調優

1. sync_binlog 參數優化

原配置

mysql> SHOW VARIABLES LIKE '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)

? ? sync_binlog=1?意味著每次事務提交都會強制將 binlog 寫入磁盤,這是導致高 IO 的主要原因。在高并發寫入場景下,這種配置會嚴重影響性能。

優化措施

-- 臨時調整(立即生效)
mysql> SET GLOBAL sync_binlog=1000;
Query OK, 0 rows affected (0.00 sec)-- 驗證修改結果
mysql> SHOW VARIABLES LIKE '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1000  |
+---------------+-------+
1 row in set (0.00 sec)-- 持久化配置(修改my.cnf)
$ sudo vi /etc/mysql/my.cnf
[mysqld]
sync_binlog=1000-- 重啟MySQL服務使配置永久生效
$ sudo systemctl restart mysql

調整后效果:

  • 磁盤 IOPS 從 15000 降至 8000
  • 寫入事務平均響應時間從 520ms 降至 85ms

2. innodb_flush_log_at_trx_commit 參數調整

原配置

mysql> SHOW VARIABLES LIKE '%innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

? ? innodb_flush_log_at_trx_commit=1?表示每次事務提交都要將日志寫入磁盤,這進一步加重了 IO 負擔。

優化措施

-- 臨時調整
mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)-- 驗證修改結果
mysql> SHOW VARIABLES LIKE '%innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout    | 1     |
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
2 rows in set (0.00 sec)-- 持久化配置
$ sudo vi /etc/mysql/my.cnf
[mysqld]
innodb_flush_log_at_trx_commit=2-- 重啟MySQL服務
$ sudo systemctl restart mysql

調整后效果:

  • 磁盤 IOPS 進一步降至 5500
  • 寫入吞吐量提升 42%

四、其他優化建議

1.?日志文件位置調整

將 InnoDB 日志文件和 binlog 文件移動到專用 SSD 磁盤:

# 創建新的日志目錄
$ sudo mkdir -p /data/mysql/logs /data/mysql/binlog
$ sudo chown -R mysql:mysql /data/mysql# 修改my.cnf
$ sudo vi /etc/mysql/my.cnf
[mysqld]
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_log_group_home_dir = /data/mysql/logs
log-bin = /data/mysql/binlog/mysql-bin# 停止MySQL服務
$ sudo systemctl stop mysql# 復制現有日志文件
$ sudo cp -a /var/lib/mysql/ib_logfile* /data/mysql/logs/
$ sudo cp -a /var/lib/mysql/mysql-bin.* /data/mysql/binlog/# 修改文件權限
$ sudo chown -R mysql:mysql /data/mysql/logs
$ sudo chown -R mysql:mysql /data/mysql/binlog# 啟動MySQL服務
$ sudo systemctl start mysql# 驗證日志文件位置
$ sudo lsof -p $(pgrep mysqld) | grep -E 'ib_logfile|mysql-bin'
mysqld  12345  mysql  mem       REG       8,17  536870912  123456789 /data/mysql/logs/ib_logfile0
mysqld  12345  mysql  mem       REG       8,17  536870912  123456790 /data/mysql/logs/ib_logfile1
mysqld  12345  mysql    4u      REG       8,17      12345  123456791 /data/mysql/binlog/mysql-bin.000001

2. 生產環境核心參數配置模板

[mysqld]
# 事務日志同步策略
sync_binlog = 1000                # 每1000次提交刷盤(平衡性能與可靠性)
innodb_flush_log_at_trx_commit = 2 # 每秒刷盤一次(減少redo日志IO)# 內存與日志配置
innodb_buffer_pool_size = 8G      # 緩沖池大小(建議為物理內存50-70%)
innodb_log_file_size = 512M       # 單個日志文件大小(根據寫入量調整)
innodb_log_files_in_group = 2     # 日志文件數量
innodb_io_capacity = 2000         # IO能力上限(SSD建議2000-5000)
innodb_write_io_threads = 16      # 異步寫線程數
innodb_read_io_threads = 16       # 異步讀線程數

3. 突發 IO 高負載應急響應方案

-- 突發IO高負載時臨時降低同步頻率
SET GLOBAL sync_binlog = 10000;
SET GLOBAL innodb_flush_log_at_trx_commit = 0;-- 查看當前線程狀態
SHOW FULL PROCESSLIST;-- 終止長時間運行的查詢
KILL 12345;

五、風險提示

  1. sync_binlog=1000意味著可能丟失最多 1000 個事務的 binlog 數據
  2. innodb_flush_log_at_trx_commit=2可能導致系統崩潰時丟失 1 秒內的事務
  3. 建議在實施前進行壓測驗證,確保業務可接受數據丟失風險

六、總結

????????MySQL 磁盤 IO 高負載是生產環境常見問題,通過合理調整sync_binloginnodb_flush_log_at_trx_commit參數,結合架構優化措施,可以顯著提升數據庫性能。本次優化實踐證明:

  • 合理的參數調優可帶來 60% 以上的 IO 性能提升
  • 批量操作優化能有效減少日志寫入次數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84351.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

window 顯示驅動開發-初始化和 DMA 緩沖區創建

若要指示 GPU 支持 GDI 硬件加速,顯示微型端口驅動程序的 DriverEntry 函數實現必須使用指向驅動程序實現的 DxgkDdiRenderKm 函數的指針填充 DRIVER_INITIALIZATION_DATA 結構的 DxgkDdiRenderKm 成員。 DirectX 圖形內核子系統調用 DxgkDdiRenderKm 函數&#xf…

Go語言實戰:使用 excelize 實現多層復雜Excel表頭導出教程

Go 實現支持多層復雜表頭的 Excel 導出工具 目錄 項目介紹依賴說明核心結構設計如何支持多層表頭完整使用示例總結與擴展 項目介紹 在實際業務系統中,Excel 文件導出是一項常見功能,尤其是報表類需求中常見的復雜多級表頭,常規表格組件往…

機器視覺6-halcon高級教程

機器視覺6-halcon高級教程 雙目立體視覺原理視差外極線幾何雙目標定 雙目立體視覺之Halcon標定一.標定結果二.Halcon標定過程1.獲取左右相機圖像中標定板的區域;2.提取左右相機圖像中標定板的MARK點坐標和攝像機外部參數;3.執行雙目標定;4.獲取非標準外極線幾何到標…

板凳-------Mysql cookbook學習 (六)

2025年Pytorch-gpu版本安裝(各種情況適用自己的安裝需求,親測絕對有效,示例安裝torch2.6.0,過程詳細面向小白)_torch gpu版本-CSDN博客 https://blog.csdn.net/OpenSeek/article/details/145795127 2.2 查錯 import s…

Spring boot和SSM項目對比

目錄對比 springboot目錄 project├─src│ ├─main│ │ ├─java│ │ │ ├─com.example.demo│ │ │ │ ├─config // 存放SpringBoot的配置類│ │ │ │ ├─controller // 存放控制器類│ │ │ │ ├─entity // 存…

《關于潯川社團退出DevPress社區及內容撤回的聲明》

《關于潯川社團退出DevPress社區及內容撤回的聲明》 尊敬的DevPress社區及讀者: 經潯川社團內部決議,我社決定自**2025年5月26日**起正式退出DevPress社區,并撤回所有由我社成員在該平臺發布的原創文章。相關事項聲明如下: …

Python性能優化利器:__slots__的深度解析與避坑指南

核心場景:當需要創建數百萬個屬性固定的對象時,默認的__dict__字典存儲會造成巨大內存浪費。此時__slots__能通過元組結構取代字典,顯著提升內存效率(實測節省58%內存)! 底層原理:為何能節省內…

Go 語言中的 Struct Tag 的用法詳解

在 Go 語言中,結構體字段標簽(Struct Tag) 是一種用于給字段添加元信息(metadata)的機制,常用于序列化(如 JSON、XML)、ORM 映射、驗證等場景。你在開發 Web 應用或處理數據交互時&a…

微軟正式發布 SQL Server 2025 公開預覽版,深度集成AI功能

微軟在今年的 Build 2025 大會上正式發布了 SQL Server 2025 公開預覽版,標志著這一經典數據庫產品在 AI 集成、安全性、性能及開發者工具方面的全面升級。 AI 深度集成與創新 原生向量搜索:SQL Server 2025 首次將 AI 功能直接嵌入數據庫引擎&#xff…

React從基礎入門到高級實戰:React 基礎入門 - React 的工作原理:虛擬 DOM 與 Diff 算法

React 的工作原理:虛擬 DOM 與 Diff 算法 引言 React 是現代前端開發的明星框架,它的出現徹底改變了我們構建用戶界面的方式。無論是動態的 Web 應用還是復雜的單頁應用(SPA),React 都能以高效的渲染機制和簡潔的組件…

解釋一下NGINX的反向代理和正向代理的區別?

大家好,我是鋒哥。今天分享關于【解釋一下NGINX的反向代理和正向代理的區別?】面試題。希望對大家有幫助; 解釋一下NGINX的反向代理和正向代理的區別? NGINX的反向代理和正向代理的區別主要體現在它們的功能和使用場景上。下面我會詳細解釋它們的定義…

Python學習——執行python時,鍵盤按下ctrl+c,退出程序

在 Python 中,當用戶按下 CtrlC 時,程序默認會觸發 KeyboardInterrupt 異常并終止。 1. 捕獲 KeyboardInterrupt 異常(推薦) 使用 try-except 塊直接捕獲 KeyboardInterrupt 異常,適用于簡單場景。 示例代碼&#xff…

C++ 反向迭代器(Reverse Iterator)實現詳解

目錄 1. 反向迭代器概述 2. 代碼實現分析 3. 關鍵點解析 3.1 模板參數設計 3.2 核心操作實現 4. 使用示例 1. 反向迭代器概述 反向迭代器是STL中一種重要的適配器,它允許我們以相反的順序遍歷容器。本文將詳細講解如何實現一個自定義的反向迭代器模板類。 2.…

動態DNS管理:【etcd+CoreDNS】 vs【BIND9】便捷性對比

對比 BIND9 集群和 etcdCoreDNS 集群在便捷性方面,通常情況下,對于需要動態、頻繁變更 DNS 記錄以及追求云原生和自動化集成的場景,etcdCoreDNS 方案更加便捷。 然而,“便捷性”也取決于具體的應用場景、團隊的技術棧和運維習慣。…

基于大模型的短暫性腦缺血發作預測與干預全流程系統技術方案大綱

目錄 一、系統概述二、系統架構(一)數據采集層(二)大模型核心層(三)應用服務層(四)數據存儲與管理層三、全流程技術方案(一)術前階段(二)術中階段(三)術后階段(四)并發癥風險預測(五)手術方案制定(六)麻醉方案制定(七)術后護理(八)統計分析(九)技術驗…

MSP430通用電機控制代碼(Motor)設計與實現

一、代碼結構概覽 // Motor.h // Motor.h #ifndef __MOTOR_H_ #define __MOTOR_H_#include "A_include.h"void Motor_Init(void); // 初始化函數 void PWM_SET(int duty0, int duty1); // PWM設置函數#endif// Motor.c // Motor.c #include "Motor.h"…

25年軟考架構師真題(回憶更新中)

論文題: 系統負載均衡設計方法事件驅動架構多模型數據庫應用軟件測試架構案例分析: 必選題:1.1填寫質量屬性的質量屬性名 1.2解釋器風格架構的組成圖填空,以及解釋為什么該模型適用解釋器風格 選做題1redis2.1全量復制的流程圖 <

優化用戶體驗:攔截瀏覽器前進后退、刷新、關閉、路由跳轉等用戶行為并彈窗提示

&#x1f9d1;?&#x1f4bb; 寫在開頭 點贊 收藏 學會&#x1f923;&#x1f923;&#x1f923; 需求 首先列舉一下需要攔截的行為&#xff0c;接下來我們逐個實現。 瀏覽器前進后退標簽頁刷新和關閉路由跳轉 1、攔截瀏覽器前進后退 這里的實現是核心&#xff0c;涉及到大…

Docker:容器化技術

引言 傳統部署環境逐漸不適應現在的企業開發&#xff0c;為了追求更加輕量&#xff0c;更加容易管理項目&#xff0c;引入了docker容器化技術去實現更加高效的部署環境。 一.docker風光下的內核功能和常用命令 1.docker容器和虛擬機的區別 我們在底層和應用層之間引入了一層do…

ping命令常用參數以及traceout命令

在網絡故障排查和性能分析中&#xff0c;ping和 traceroute&#xff08;Windows中通常稱為 tracert&#xff09;是兩個極為重要的工具。它們幫助診斷網絡連接問題&#xff0c;了解數據在網絡中的傳輸路徑。下面將詳細介紹這兩個命令的常用參數及其應用。 ping命令 ping命令用…