当前位置: 首页 > news >正文

Apache Ignite 的 Pages Writes Throttling(页面写入节流)


🌟 一、什么是 Checkpointing(检查点机制)?

在 Apache Ignite 中:

  • 数据是先保存在内存中(RAM),然后异步写入磁盘。
  • 当数据被修改时,它首先被更新在内存中的“页”上(称为 Dirty Page 脏页)。
  • 这些脏页最终需要被持久化到磁盘文件中,以确保数据不会因节点宕机而丢失。
  • 这个将脏页从内存同步到磁盘的过程就叫做 Checkpointing(检查点机制)

📌 简单来说:Checkpointing 是把内存中修改过的数据定期刷到磁盘上。


⚠️ 二、为什么 Checkpointing 可能导致写性能下降甚至归零?

情况1:脏页在写入前又被修改了

  • 如果一个脏页在等待 checkpoint 写入磁盘的过程中再次被修改:
    • 它的旧状态会被复制到一个叫 Checkpointing Buffer(检查点缓冲区) 的特殊区域。
    • 这样做的目的是为了保证 WAL(Write-Ahead Logging)机制的一致性。

🔁 举个例子:
假设你修改了一个页 A,它变成脏页;
在它还没被 checkpoint 到磁盘前,你又改了一次;
那么第一次修改的内容必须被保留下来(放到 checkpoint buffer),以便将来恢复使用。

问题来了:

  • 如果很多页都在频繁修改,checkpoint buffer 就会迅速被填满。
  • 一旦 buffer 溢出(overflow),Ignite 就会 暂停所有写操作,直到当前 checkpoint 完成。
  • 结果就是:写入性能骤降为 0!

情况2:脏页比例达到阈值

  • 即使 checkpoint 正在运行,如果又有大量新的脏页产生,达到了系统设定的阈值:
    • Ignite 会 再次触发一个新的 checkpoint
    • 并且会 阻塞所有写操作,直到第一个 checkpoint 完成。

📌 所以,如果磁盘慢或写入压力大,就会不断出现这种情况,形成一种类似“链锯”的行为(Checkpointing Chainsaw)——不停触发 checkpoint、阻塞写入、再触发…


🧠 三、Pages Writes Throttling 是怎么解决这个问题的?

为了解决上面提到的写入性能骤降问题,Ignite 提供了 Pages Writes Throttling(页面写入节流) 机制。

它的工作原理如下:

  • 当 checkpoint buffer 快满了 或者 dirty page 比例快速上升时:
    • Ignite 主动 降低写入速度,让写入的速度不超过磁盘可以处理的能力。
  • 相当于给写入操作加上了一个“限速器”,不让它们太快地堆积在 checkpoint buffer 中。

类比理解:

想象你在高速公路上开车(写入操作),前方施工(checkpoint 处理慢)。如果不减速,就会堵死(buffer overflow → 停止写入)。

Throttling 就像是交通管制,告诉你:“别开太快,前面来不及处理。”


✅ 四、总结一下关键点:

概念含义
Dirty Page已在内存中修改但尚未写入磁盘的数据页
Checkpointing定期将内存中的脏页写入磁盘,用于持久化和恢复
Checkpointing Buffer存放脏页的旧版本,用于 WAL 日志一致性
Checkpointing Chainsaw不断触发 checkpoint 导致写入阻塞的现象
Pages Writes Throttling当写入速度过快时,自动限制写入速率,避免系统崩溃

💡 五、建议做法

如果你遇到写入性能波动剧烈、甚至中断的问题,可以尝试:

  1. 启用 Pages Writes Throttling(默认已启用)
  2. 调整相关参数
    • setCheckpointWriteOrder():控制是否顺序写
    • setThrottlingEnabled(true):显式启用节流
  3. 优化磁盘性能
    • 使用更快的 SSD
    • 避免磁盘 IO 成为瓶颈
  4. 合理设置 Checkpointing 时间间隔
  5. 监控脏页数量和 checkpoint buffer 使用情况

如果你有具体的配置、日志内容或性能表现,我可以帮你进一步分析和调优。

http://www.dtcms.com/a/283810.html

相关文章:

  • C++ - 仿 RabbitMQ 实现消息队列--C++11 异步操作实现线程池
  • InfluxDB 3与Apache Parquet:打造高性能时序数据存储与分析解决方案
  • Apache DolphinScheduler介绍与部署
  • UE5 Nanite使用
  • 下班倒计时
  • 链路聚合实训
  • 管家婆价格折扣跟踪管理:查询、新增、修改、删除
  • JAVA中的Map集合
  • 【01背包】P1466 [USACO2.2] 集合 Subset Sums
  • 华为云容器产品分析
  • HTML表格基础
  • 【Linux】第一个小程序—进度条
  • HikariCP数据库连接池高性能优化实战指南
  • Spring Boot 参数校验:@Valid 与 @Validated
  • 线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革
  • 【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑
  • Fair-code介绍(Fair code)(一套新型软件模型:旨在“开源”“商业可持续性”中找到平衡)
  • Spring Boot Jackson 序列化常用配置详解
  • redis速记
  • Jenkins Git Parameter 分支不显示前缀origin/或repo/
  • 【37】MFC入门到精通——MFC中 CString 数字字符串 转 WORD ( CString, WORD/int 互转)
  • 我爱学算法之—— 前缀和(下)
  • 破局 Meme 币永续:跨界融合 Ormer + AI + 舆情监控 的颠覆性框架
  • 日志采集——ZeroMQ的配置
  • MyBatis 之配置与映射核心要点解析
  • 林曦词典|文质彬彬
  • 如何查询pg账号权限 能否创建模式 删表建表
  • Vim多列打开不同文件操作指南
  • 什么是AI-AIGC-AGI-Agent?基本概念与区别的详细解析
  • 【SAP SD】跨公司销售、第三方销售、STO采购(公司间合同配件)