首批通过分布式安全可靠测评,为关键业务系统打造
如何判断 OBServer 是否存在 IO 限流?
更新时间:2026-05-18 01:51
本文介绍 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 版本日志解读
[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 版本日志解读
[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 使用率。 在以上 io stat 信息中,可以通过以下方法来判断是否发生了 IO 限流。
如果
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 的限流。
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文件的例子。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 版本。