OB写入超时,如何解决

一个OceanBase集群在业务高峰期,所有租户突然出现大面积写入超时。
监控显示:

  1. freeze_trigger_percentage和 memstore_limit_percentage水位线持续高位。
  2. IO 延迟飙升,avg_fsync_time超过100ms。
  3. 但是,CPU利用率并不高。
    最可能导致这种“内存写满、IO卡住、CPU空闲”异常现象的原因是什么,如何解决?
1 个赞

最有可能是磁盘写入延迟导致的,查看磁盘IO

1 个赞

坐等回复

也是

@论坛小助手

在这种情况下,OceanBase 集群面临的主要问题是租户的 MemStore 内存写满,同时伴随着 IO 延迟激增。尽管 CPU 利用率不高,但仍然发生了大规模的写入超时。这通常是由于以下原因造成的:

  1. MemStore 内存写满:当 freeze_trigger_percentagememstore_limit_percentage 水位线持续高位时,MemStore 内存可能已经接近或达到了其容量限制。这会导致写入操作被阻塞,因为 MemStore 没有足够的空间来存储新的数据。
  2. IO 延迟飙升avg_fsync_time 超过 100ms 表明 IO 操作变得非常缓慢。这可能是由于磁盘压力过大、网络延迟或其他 IO 相关的问题导致的。
  3. CPU 利用率不高:尽管 CPU 利用率不高,但这并不意味着系统没有其他瓶颈。CPU 利用率低可能是因为写入操作被 IO 延迟和内存限制所阻塞。

解决方案:

  1. 开启写入限速
    • 通过设置 writing_throttling_trigger_percentagewriting_throttling_maximum_duration 来开启写入限速功能,以防止 MemStore 内存进一步被写满。
    obclient> ALTER SYSTEM SET writing_throttling_trigger_percentage = 80;
    obclient> ALTER SYSTEM SET writing_throttling_maximum_duration = '2h';
    
  2. 调整转储阈值
    • 调整 freeze_trigger_percentagememstore_limit_percentage,以减少 MemStore 内存的压力,使其能够更快地转储数据。
    obclient> ALTER SYSTEM SET freeze_trigger_percentage = 70;
    obclient> ALTER SYSTEM SET memstore_limit_percentage = 70;
    
  3. 优化 IO 性能
    • 检查磁盘和网络的健康状况,确保没有硬件故障或网络延迟。
    • 考虑增加磁盘的读写带宽,或者优化 IO 调度策略。
  4. 监控和调优
    • 使用 oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY 表来监控集群的运行情况,及时发现并解决问题。
    SELECT `TIMESTAMP`,module,EVENT,name1,value1,name2,value2,rs_svr_ip 
    FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY 
    WHERE module IN ( 'server', 'root_service', 'balancer' ) AND `TIMESTAMP` > SUBDATE( now(), INTERVAL 1 HOUR ) 
    ORDER BY `TIMESTAMP` DESC LIMIT 50;
    
  5. 增加资源
    • 如果上述措施仍无法解决问题,可以考虑增加集群的资源,如增加节点、扩展磁盘空间等。

通过以上步骤,可以有效缓解和解决写入超时的问题。

检索到的文档如下:

  1. 在您开始前
  2. 租户内存写满
  3. oceanbase数据库运行过程中手动删除clog日志
  4. oceanbase clog盘如何瘦身
  5. SQL 性能问题的典型场景和排查思路