---
title: 如何判断 OBServer 是否存在 IO 限流?-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 如何判断 OBServer 是否存在 IO 限流?相关的常见问题和使用技巧，帮助您快速解决 如何判断 OBServer 是否存在 IO 限流?的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 如何判断 OBServer 是否存在 IO 限流?

更新时间：2026-05-18 01:51

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x 内容类型：How-to  

​ 本文介绍 IO 限流的诊断方法和调优策略。

OceanBase 数据库在 `observer.log` 日志中定时打印 IO statistics 的统计信息，可以据此来判断是否发生了 IO 限流。

## 系统 IO

根据操作的不同，系统 IO 可以简单分为以下几类：

- 写 SSTable：2M， 随机写、顺序写。
 - 读 SSTable：16K，随机读、顺序读。
 - 写事务日志：4K，顺序写。
 - 写程序日志：4K，顺序写。

## IO 隔离

- OceanBase 数据库在存储层采用 deadline 算法调度 IO 请求，并支持基于响应时间（RT）的负反馈机制。
 - 没有真正的 Resource Manager 框架，未实现基于 IOPS and MBPS 的调度，因此不支持租户间的 IO 隔离以及 sys IO 与 user IO 的隔离。

## 限速分析

搜索 OBServer 日志关键字： Current io stat（2.x 版本） 或 current io status（3.x 版本）。

- 2.x 版本日志解读

  ```shell
  [2022-12-27 17:28:19.298670] INFO [COMMON] ob_io_disk.cpp:497 [47844][406][Y0-0000000000000000] [lt=59] [dc=0] Current io stat, (fd={fd:875, disk_id:{disk_idx:0, install_seq:0}}, io_conf={sys_io_low_percent:90, sys_io_high_percent:90, user_iort_up_percent:2000, cpu_high_water_level:7680, write_failure_detect_interval:60000000, read_failure_black_list_interval:300000000, data_storage_warning_tolerance_time:10000000, data_storage_error_tolerance_time:300000000, disk_io_thread_count:8, callback_thread_count:8, large_query_io_percent:0, data_storage_io_timeout_ms:10000}, sys_io_percent=90, sys_iops_up_limit=266, user_max_rt=1.151363996887207031e+04, cpu_estimator={avg_usage:378}, user_read_io_stat={average_size:18245, average_rt_us:"4.766969696969696884e+02", old_stat:{io_cnt:5435154700, io_bytes:92266120699904, io_rt_us:2896942021380}, new_stat:{io_cnt:5435154733, io_bytes:92266121302016, io_rt_us:2896942037111}}, user_write_io_stat={average_size:0, average_rt_us:"0.000000000000000000e+00", old_stat:{io_cnt:790, io_bytes:1568509952, io_rt_us:1369408}, new_stat:{io_cnt:790, io_bytes:1568509952, io_rt_us:1369408}}, sys_read_io_stat={average_size:0, average_rt_us:"0.000000000000000000e+00", old_stat:{io_cnt:29673855, io_bytes:62197411557376, io_rt_us:62528978207}, new_stat:{io_cnt:29673855, io_bytes:62197411557376, io_rt_us:62528978207}}, sys_write_io_stat={average_size:0, average_rt_us:"0.000000000000000000e+00", old_stat:{io_cnt:24420687, io_bytes:51213892583424, io_rt_us:56376648298}, new_stat:{io_cnt:24420687, io_bytes:51213892583424, io_rt_us:56376648298}}, large_query_read_io_stat={average_size:0, average_rt_us:"0.000000000000000000e+00", old_stat:{io_cnt:0, io_bytes:0, io_rt_us:0}, new_stat:{io_cnt:0, io_bytes:0, io_rt_us:0}}, large_query_write_io_stat={average_size:0, average_rt_us:"0.000000000000000000e+00", old_stat:{io_cnt:0, io_bytes:0, io_rt_us:0}, new_stat:{io_cnt:0, io_bytes:0, io_rt_us:0}})

  ```

  日志解读：

  | 日志信息 | 说明 |
  | --- | --- |
  | fd 和 disk_id | 这部分包含了文件描述符的编号（fd）和磁盘的索引号（disk_idx）以及安装序列号（install_seq）。 |
  | io_config | 这部分包含了系统的 I/O 配置参数，如系统 I/O 的低和高百分比（sys_io_low_percent 和 sys_io_high_percent），用户 I/O 的上限（user_iort_up_percent），CPU 的高水位线（cpu_high_water_level），磁盘 I/O 线程数（disk_io_thread_count），回调线程数（callback_thread_count），大查询 I/O 百分比（large_query_io_percent），数据存储 I/O 超时毫秒数（data_storage_io_timeout_ms）等。 |
  | sys_io_percent | 系统 I/O 的使用百分比上限。 |
  | sys_iops_up_limit | 系统 2M 大小的 IOPS 上限，应与 IO bench 测试结果（io_resource.conf）一致。 |
  | user_max_rt | 用户 IO 的最大响应时间。 |
  | cpu_estimator(avg_usage) | 用户 IO 的平均 CPU 使用率。 |
  | - user_read_io_stat   - user_write_io_stat   - sys_read_io_stat   - sys_write_io_stat   - large_query_read_io_stat   - large_query_write_io_stat | 这些部分包含了不同类型的 I/O 的统计信息，包括平均大小（average_size），平均响应时间（average_rt_us），以及旧的和新的统计数据（包括 I/O 操作数（io_cnt），I/O 字节数（io_bytes）和 I/O 响应时间（io_rt_us））。 |
  | io_ability | 这部分包含了系统的 I/O 性能测量结果，包括不同模式（读/写）和不同大小的 I/O 操作的 IOPS（输入/输出操作每秒）和响应时间（rt_us）。 |
  | - log_io   - user_io   - sys_io   - prewarm_io   - large_query_io | 这些部分包含了不同类型的 I/O 的状态和设备能力，包括是否初始化（is_inited_），设备能力（device_ability_），共享百分比（share_percentage_）和最后截止时间戳（last_deadline_ts_）。 |
  | - log_read/log_write   - user_read/user_write   - sys_read/sys_write   - prewarm_read/prewarm_write   - large_query_read/large_query_write | 这部分包含了不同类型的 I/O 操作的统计信息，包括开始的 IOPS（start_iops），取消的 IOPS（cancel_iops），失败的 IOPS（fail_iops），成功的 IOPS（succ_iops），平均字节（avg_byte），设备响应时间（device_rt_us）和队列响应时间（queue_rt_us）。 |
  | avg_cpu | 这部分显示了系统的平均 CPU 使用率。 |

  OceanBase 数据库的 I/O 速度限制由 `sys_bkgd_io_low_percentage` 与 `sys_bkgd_io_high_percentage` 控制，分别表示 `sys_io_percent` 的下限与上限。

  在以上 io stat 信息中，可以通过以下方法来判断是否发生了 IO 限流。

     - 如果 `sys_io_high_percent`、`sys_io_low_percent` 与配置项 `sys_bkgd_io_high_percentage`、`sys_bkgd_io_low_percentage` 不一致，则说明存在 I/O 限流。
     - 如果 `user_read_io_stat` 的 `average_size =0`，则说明 IO 出现限流。
 - 3.x 版本日志解读

  ```shell
  [2023-06-21 16:54:14.212314] INFO [COMMON] ob_io_struct.cpp:2129 [89617][0][Y0-0000000000000000-0-0] [lt=19] [dc=0] current io status(io_config={sys_io_low_percent_:70, sys_io_high_percent_:90, user_iort_up_percent_:100, cpu_high_water_level_:2560, write_failure_detect_interval_:60000000, read_failure_black_list_interval_:300000000, data_storage_warning_tolerance_time_:30000000, data_storage_error_tolerance_time_:300000000, disk_io_thread_count_:8, callback_thread_count_:8, large_query_io_percent_:0, data_storage_io_timeout_ms_:120000, io_memory_limit_:2147483648, enable_io_tracer_:false}, io_ability={measure_items:[[{mode:0, size:4096, iops:120191.00, rt_us:180.58}, {mode:0, size:8192, iops:155470.00, rt_us:198.67}, {mode:0, size:16384, iops:122040.00, rt_us:259.74}, {mode:0, size:32768, iops:76429.00, rt_us:416.30}, {mode:0, size:65536, iops:41826.00, rt_us:762.89}, {mode:0, size:131072, iops:21994.00, rt_us:1452.21}, {mode:0, size:262144, iops:11247.00, rt_us:2841.93}, {mode:0, size:524288, iops:5649.00, rt_us:5658.40}, {mode:0, size:1048576, iops:2828.00, rt_us:11302.68}], [{mode:1, size:4096, iops:127929.00, rt_us:247.71}, {mode:1, size:8192, iops:120343.00, rt_us:263.40}, {mode:1, size:16384, iops:115208.00, rt_us:275.45}, {mode:1, size:32768, iops:76882.00, rt_us:414.05}, {mode:1, size:65536, iops:39596.00, rt_us:805.95}, {mode:1, size:131072, iops:20989.00, rt_us:1522.00}, {mode:1, size:262144, iops:10634.00, rt_us:3004.64}, {mode:1, size:524288, iops:5355.00, rt_us:5970.53}, {mode:1, size:1048576, iops:2692.00, rt_us:11877.67}, {mode:1, size:2097152, iops:1309.00, rt_us:24402.57}]]}, log_io={is_inited_:true, device_ability_:null, share_percentage_:100, last_deadline_ts_:0}, user_io={is_inited_:true, device_ability_:null, share_percentage_:100, last_deadline_ts_:0}, sys_io={is_inited_:true, device_ability_:0x32bb7ba8, share_percentage_:90, last_deadline_ts_:1687334746495760}, prewarm_io={is_inited_:true, device_ability_:0x32bb7ba8, share_percentage_:100, last_deadline_ts_:0}, large_query_io={is_inited_:true, device_ability_:0x32bb7ba8, share_percentage_:100, last_deadline_ts_:0}, log_read={}, log_write={start_iops:29.93, cancel_iops:0.00, fail_iops:0.00, succ_iops:29.93, avg_byte:5461.33, device_rt_us:140.00, queue_rt_us:7.33}, user_read={}, user_write={}, sys_read={}, sys_write={}, prewarm_read={}, prewarm_write={}, large_query_read={}, large_query_write={}, avg_cpu=2.126034912718204453e+02)

  ```

  日志解读：

  | 日志信息 | 说明 |
  | --- | --- |
  | io_config | 这部分包含了系统的 I/O 配置参数，如系统 I/O 的低和高百分比（sys_io_low_percent_ 和 sys_io_high_percent_），用户 I/O 的上限（user_iort_up_percent_），CPU 的高水位线（cpu_high_water_level_），磁盘 I/O 线程数（disk_io_thread_count_），回调线程数（callback_thread_count_），大查询 I/O 百分比（large_query_io_percent_），数据存储 I/O 超时毫秒数（data_storage_io_timeout_ms_），I/O 内存限制（io_memory_limit_）等。 |
  | io_ability | 这部分包含了系统的 I/O 性能测量结果，包括不同模式（读/写）和不同大小的 I/O 操作的 IOPS（输入/输出操作每秒）和响应时间（rt_us）。 |
  | - log_io   - user_io   - sys_io   - prewarm_io   - large_query_io | 这些部分包含了不同类型的 I/O 的状态和设备能力，包括是否初始化（is_inited_），设备能力（device_ability_），共享百分比（share_percentage_）和最后截止时间戳（last_deadline_ts_）。 |
  | - log_read/log_write   - user_read/user_write   - sys_read/sys_write   - prewarm_read/prewarm_write   - large_query_read/large_query_write | 这部分包含了不同类型的 I/O 操作的统计信息，包括开始的 IOPS（start_iops），取消的 IOPS（cancel_iops），失败的 IOPS（fail_iops），成功的 IOPS（succ_iops），平均字节（avg_byte），设备响应时间（device_rt_us）和队列响应时间（queue_rt_us）。 |
  | avg_cpu | 这部分显示了系统的平均 CPU 使用率。 |

     - 如果 `sys_io_high_percent`、`sys_io_low_percent` 与配置项 `sys_bkgd_io_high_percentage`、`sys_bkgd_io_low_percentage` 不一致，则说明存在 I/O 限流。
     - 如果 `last_deadline_ts_` 比日志打印时间大，表示 IO 被限流了。

## 调优方法

根据实际场景，可能采用的调优方法有以下两种。

- 修改系统参数。

     - `user_iort_up_percentage`：默认值 100，即当 user IO 的 RT 比基准值高 100% 时（2倍），OceanBase 数据库会主动对 sys IO 进行限流。
     - `sys_bkgd_io_low_percentage`：默认值 0，系统根据环境自动配置 sys IO 最少可使用的 IO 比例。

  如果当前系统 IO 没有达到瓶颈，可以调整以上参数来获取更好的 IO 性能，比如参照以下设置来解除 sys IO 的限流。

  ```shell
  obclient> alter system set user_iort_up_percentage = 200;
  obclient> alter system set sys_bkgd_io_low_percentage = 80;

  ```
 - 修改 `io_resource.conf`。

  安装 OceanBase 数据库时会进行 IO bench 测试来判断磁盘的 IO 性能，测试结果存入 `io_resource.conf` 文件（目录：`/home/admin/oceanbase/etc/`）。OBServer 启动时，会根据这个文件的数据来调整 OBServer 系统任务对对磁盘的使用，即对 sys IO 进行限流。 ​ 以下是 `io_resource.conf` 文件的例子。

  ```shell
  io_type    io_size_byte    io_ps           io_rt_us  
  0          4096            49782.00        711.81
  0          8192            49839.75        767.47
  0          16384           49845.25        831.02
  0          32768           49885.00        925.87
  0          65536           39726.25        1229.19
  0          131072          19985.50        1632.90
  0          262144          10025.25        1684.25
  0          524288          5020.25         1891.46
  1          2097152         1267.25         3276.28

  ```

  在 IO 限流打开（即 OBServer 安装目录中存在 `io_resource.conf` 文件且内容有效）的场景，如果 sys IO 限流配置严格，当系统存在大量访问磁盘数据的请求是（比如进行副本迁移的操作），可能导致 IO 延迟较高，影响后台任务的性能。在这种场景下，我们可以通过修改 `io_resource.conf` 文件，来让 OBServer 放松对 sys IO 的限流。

     - 通过修改调大 `io_size_byte` 为 524288 和 2097152 的 io_ps 和 io_rt_us，来“欺骗” OBServer，让 OBServer 认为磁盘能力很强大。​
     - 或者将 `io_resource.conf` 文件移走或删除，从而关闭 IO 限流，关闭后 `sys_bkgd_io_low_percentage`、`user_iort_up_percentage` 不再生效。  

  #### 注意

  OBServer 不会实时监控 `io_resource.conf` 文件的变动，以上修改后需要通过任一配置项的变更来触发重新加载配置，使得对 `io_resource.conf` 文件的修改生效。

## 适用版本

OceanBase 数据库 V2.x、V3.x 版本。

上一篇

[弱读从/只读副本遇到长事务切主场景下导致 CPU 使用率 100% 的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000261689)

下一篇

[GV$SYSSTAT 中租户 cpu_usage 的统计方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000297648) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
