单步调试Linux内核论证水位线watermark

本文作者子牙分享了Linux内核内存模块中的重要概念——水位线,用于控制内存回收。文章通过实例解释了水位线的工作原理,以及与内存回收线程、zone的关系,并介绍了如何通过调整参数进行内存优化。同时,文章还提及了作者的硬核内核课程,旨在实操学习而非理论讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈喽,我是子牙,一个很卷的硬核男人

深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了这些课程:手写JVM、手写OS、带你用纯汇编写OS、手写64位多核OS、实战Linux内核…

这篇文章给大家分享Linux内核内存模块一个很重要的知识点:水位线,就是这玩意

这玩意干啥的呢?控制内存回收的。这玩意是理解Linux内核物理内存管理模块一个非常重要的知识点,还有一个就是lowmem_reserve,这个后面写文章详谈

关于水位线,能搜到的资料还是蛮多的,有的讲得蛮好的,但是我没有看到一篇文章是单步调试Linux内核给出证明的,如所有讲底层的文章还是一样,只是讲原理。所以我准备取其精华去其糟粕,结合自己的理解,再结合我能做到的单步调试Linux内核,写一篇通俗易懂、有理有据的文章。如果你觉得有收获,用你的小手点下分享就是对我最大的支持,创作不易……

我会分享这些:

  1. 水位线是个什么东东,机制是怎样的?

  2. Linux内核中有几条水位线,水位线的值是如何算出来的

  3. Linux内核是如何基于水位线控制内存回收线程的

  4. NUMA架构中,水位线是如何工作的

  5. 如果证明你说的都是对的

  6. 我想根据业务需求调整内存,怎么做

关注公众号【硬核子牙】,阅读更多我写的硬核文章,关于操作系统、Linux内核、Java虚拟机…

本文是基于64位Linux内核写的,以下,enjoy

01   水位线watermark

如果你是做Java、Python、PHP的,你肯定听过垃圾收集器(GC),你写程序时不用考虑内存的申请与回收,都是由虚拟机帮你完成的。那虚拟机如何知道何时回收呢?有个阈值对吧,内存使用达到那个阈值就启动回收线程进行回收。这里说的水位线就相当于是这个阈值

那Linux内核中有几条水位线呢?三条。对应的阈值就是三个:

这三条水位线与内存回收线程之间是如何协同工作的呢?如图

### Flink 中水位线Watermark)机制及实现 #### 概念介绍 在流处理框架中,事件时间和处理时间之间存在差异。为了有效管理这些不同步现象并支持基于事件时间窗口的操作,Flink引入了水位线Watermark)这一概念[^1]。 水位线用于表示数据流中的某个时刻,在该时刻之前的所有记录都已经到达系统。对于有序的数据流而言,水位线等于最大观察到的时间戳;而对于乱序数据,则需采用更复杂的策略来估算合理的水位线位置[^2]。 #### 实现方式 针对不同的应用场景,可以采取多种方法设置水位线: - **周期性生成**:通过定时器定期创建固定间隔的水位线; - **随业务逻辑动态调整**:依据实际接收到的消息内容灵活设定; - **预估未来可能的最大延迟量**:允许一定程度上的无序到来,并据此构建容忍范围内的水位线[^3]。 具体来说,在实践中通常会利用`assignTimestampsAndWatermarks()`函数指定如何从输入元素中抽取时间戳以及相应的水位线规则。例如当使用Kafka作为数据源时,可以通过如下代码片段配置带有最大三秒内乱序容忍度的水位线策略[^4]: ```java env.fromSource( kafkaSource, WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(3)), "kafkasource" ); ``` 此外,还需注意防止因个别异常值导致的整体进度停滞问题。为此可以在定义水位线的同时加入空闲检测功能(`withIdleness`),使得长时间未更新的状态能够得到适当清理。 最后值得注意的是,在面对完全随机分布甚至可能出现逆向排列的情形下,应确保新产生的水位线始终不低于已有水平,从而维持整体流程的一致性和稳定性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值