per-file DAX 工作日志(1)

博主计划在Ubuntu18.04上部署并跑通PMFS,复现其实现和测试部分,区分DAX和mmap关系。今日完成部署PMDK并调通,区分二者关系。还分享了mm_struct计数器区别、页缓存策略、flusher线程机制、避免拥塞方法等Linux内核内存管理相关知识,以及需解决优先搜索树知识。

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

今天决定了下周的计划:

  1. 在Ubuntu18.04上部署并跑通PMFS;
  2. 复现《非易失内存文件系统PMFS的性能优化设计与实现》的PMFS实现和测试部分;
  3. 区分DAX和mmap之间的关系。

今天完成了:

  1. 在Ubuntu18.04上部署PMDK并调通;
  2. 区分DAX和mmap之间的关系。

一些小知识点:

mm_struct中mm_count与mm_users的区别

为什么mm_struct的撤销取决于mm_count,主要是为了支持内核进程借用mm_struct。

mm_count是针对进程的,而mm_users是针对线程的,其实在linux中进程和线程之间的区别比较模糊,不如通过上面的例子理解更为直观:比如一个用户进程A有3个线程,那么此时mm_count是1,mm_users是3,这时内核将进程A调出,将一个内核线程B调入,这时系统线程B的task_struct->mm是NULL,因为内核线程并不需要访问用户空间,而mm_struct描述的是用户空间的情况。那么这个时候内核线程B会借用上一个进程A的mm_struct中的页表访问内核空间。

在代码上表现为:
内核线程:task_struct -> mm = NULL, task_struct -> active_mm = <last process task struct> -> mm
用户进程:task_struct -> mm = task_struct -> active_mm

因为内核空间也在页表中,且内核空间对进程来说都是共享的,因此借用并不存在问题。这个时候mm_user为3,mm_count为2,如果此时另一个CPU调度进程A且A执行完退出,那么mm_user为0,mm_count为1,此时B借用A的mm_struct,所以A的mm_struct不会被撤销。如果不维护两个计数器,那么A退出之后,mm_struct就会被撤销,B就无法通过A的mm_struct访问内核空间。

页缓存(page cache)相关

由内存中的空闲页面组成,对应磁盘上的物理块,可以动态调整容量大小,称被缓存的存储设备为后备存储。此时如果使用read这个系统调用,会首先在页缓存中找是否存在对应的页面,如果不命中再访问存储设备,并把读来的数据放到页缓存中。

写页缓存策略:write-through、write-back

缓存回收策略:LRU,LRU的局限显而易见(比如LRU容量为2,页面访问序列为ABC循环,此时命中率为零),但是Linux实现的是双LRU策略,维护一个活跃链表和一个不活跃链表,只换出不活跃链表中的页面,两个链表的维护规则是伪LRU:尾部加入,头部移除。同时动态平衡两个队列的大小,这样避免了只访问一次的页面在页缓存中保存太长的时间而换出访问次数多,但是时间上比较久远的页面。这里其实就是一种折中思想的体现,LRU考虑了时间局部性(访问间隔时间)也考虑了空间局部性(访问次数),其实这种LRU策略就是降低了时间局部性的要求,较为重视空间局部性(访问次数)。

Linux页缓存使用struct address_space来管理缓存和页面IO,address_space其实是vm_area_struct的物理地址对等体,即文件可以拥有多个虚拟地址,但是在物理内存中的地址只有一个。一般address_space会与内核对象相关联,与inode关联时,host就指向inode。

后备存储通过自己的address_space_operation描述自己与页缓存的交互。

老版本内核中struct address_space的page_tree与最近的内核中的i_pages都指向radix tree。

在很早之前的版本中,buffer cache和page cache还是分开管理的,在2.4之后的版本中则统一为page cache进行管理,

flusher线程

在以下几种情况下,脏页写回存储设备:

  1. 空闲内存低于特定阈值,此时需要将脏页写回腾出内存空间;
  2. 脏页驻留在内存空间达一定时间后,脏页不会无限储存在内存中;
  3. 用户进程使用系统调用sync或者fsync时。

以下涉及的具体参数均在2.6内核为基准,更高级的内核可能会有所变动。

在第一种情况下,内存阈值通过dirty_background_ratio设置,低于dirty_background_ratio时flusher_threads唤醒一个或多个flusher线程,线程进一步调用bdi_writeback_all开始将脏页写回磁盘。直到写回的页数满足已经等于传递的参数或者空闲内存数高于dirty_background_ratio才停止。在第二种情况下,flusher线程会在后台定期唤醒,确保内存中不会有长期存在的脏页,这也是一个保证内存一致性的机制。为了尽可能减少磁盘功耗,linux采用一种特殊的页写回机制:laptop_mode,主要是为了避免磁盘旋转仅仅是为了写回页面,尽可能在磁盘运转的过程中完成尽可能多的任务。

bdflush、kupdated和pdflush

简单讲,pdflush thread一定程度上可以说是bdflush和kupdated的结合。

在2.6之前,bdflush负责将dirty buffer写回磁盘,系统后台只有一个bdflush线程,kupdated负责周期性调用bdflush(可能)。
而在2.6之后,pdflush(page dirty flush)则会周期性的动态调整线程数目,之后调整为每个存储设备一个刷新线程,这样简化了拥塞逻辑,flusher线程之后替代了pdflush线程,二者主要区别是针对每个磁盘独立执行回写操作。

避免拥塞

最早的bdflush系统中只有一个,很显然会在回写任务重时导致拥塞,很可能拥塞在一个请求队列中而无法响应其它设备的回写队列。

多个flusher线程来解决这个问题,可以相互独立地将脏页刷回磁盘,但是也会出现多个flusher线程在同一个拥塞队列上挂起的情况,这样会增加内存开销,因此flusher采用拥塞回避策略,优先从那些没有拥塞的队列写回页。目前(2.6)flusher和具体块设备关联,即对应的线程收集对应设备上的脏页,并写回对应磁盘,这样提高了IO公平性,降低了饥饿风险,提高了写回性能。

DAX源码级分析

Linux 内存管理:DAX(Direct Access)机制的作用及实现原理DAX, mmap(), and a "go faster" flag

上面两篇文章讲的很清楚,不赘述了。

需要解决的知识:

  1. 优先搜索树:堆与radix tree的结合;
<think>好的,我需要帮助用户了解如何配置Yarn的per-job设置。首先,用户提到了Flink的Yarn Per Job模式,这可能涉及到Flink的配置和Yarn的资源管理。我需要回忆一下Flink在Yarn上的部署模式,尤其是Per Job模式的特点。 根据引用[2]中的内容,用户可能遇到了Hadoop配置路径的问题,比如HADOOP_CONF_DIR的设置。在Per Job模式中,正确配置Hadoop的环境变量是必要的,因为Flink需要与Yarn进行交互。因此,我应该先指导用户如何正确设置这些环境变量,确保Flink能够找到Yarn的配置文件。 接下来,用户可能需要配置Flink本身的参数,比如内存分配、并行度等。我需要提到在flink-conf.yaml中调整相关参数,例如jobmanager.memory.process.size和taskmanager.memory.process.size,这些对于资源分配很重要。此外,用户可能需要在提交作业时通过命令行参数指定资源,比如-ys表示每个TaskManager的slot数量。 然后,用户可能关心如何启用Yarn的安全功能,比如Kerberos认证。引用[1]提到了SecurityConfiguration的初始化,这可能涉及到安全模块的配置。这时候需要指导用户如何配置Kerberos的相关参数,如security.kerberos.login.keytab和principal。 另外,日志配置也是重要的一环,用户可能需要知道如何调整日志级别或路径,以便于调试和监控作业运行状态。应该提到修改log4j.properties文件的方法。 最后,用户可能需要一些常见问题的解决方法,比如资源不足、作业提交失败等。需要总结一些典型问题及其解决策略,帮助用户快速排查问题。 总结一下,回答的结构应该包括环境变量配置、Flink参数调整、安全设置、日志管理以及常见问题处理。同时,根据用户提供的引用内容,确保引用相关部分来支持配置建议,比如HADOOP_CONF_DIR的设置和SecurityConfiguration的相关初始化过程。这样用户能够系统地了解如何配置Yarn的Per Job模式,并解决可能遇到的问题。</think>### Yarn Per-Job 配置指南 在 Apache Flink 中,**Yarn Per-Job 模式**允许每个作业独立部署到 Yarn 集群,适合需要资源隔离的场景。以下是关键配置步骤和注意事项: --- #### 一、基础环境配置 1. **Hadoop 环境变量** 确保 `HADOOP_CONF_DIR` 或 `YARN_CONF_DIR` 正确指向 Hadoop 配置文件目录(如 `core-site.xml`, `yarn-site.xml`)[^2]。 ```bash # 示例:设置 Hadoop 配置路径 export HADOOP_CONF_DIR=/etc/hadoop/conf ``` 2. **Flink 与 Yarn 兼容性** 使用与 Hadoop/Yarn 版本匹配的 Flink 发行版,避免版本冲突。 --- #### 二、Flink 参数配置 1. **资源分配** 在 `flink-conf.yaml` 中配置基础资源参数: ```yaml # JobManager 内存 jobmanager.memory.process.size: 2048m # TaskManager 内存 taskmanager.memory.process.size: 4096m # 每个 TaskManager 的 Slot 数量 taskmanager.numberOfTaskSlots: 2 ``` 2. **作业提交参数** 通过命令行指定 Per-Job 模式资源: ```bash ./bin/flink run -m yarn-cluster \ -ys 2 \ # 每个 TaskManager 的 Slot 数 -yjm 2048 \ # JobManager 内存(MB) -ytm 4096 \ # TaskManager 内存(MB) -ynm "MyPerJob" \ # 作业名称 your_job.jar ``` --- #### 三、Yarn 集群优化 1. **队列资源限制** 在 `yarn-site.xml` 中配置队列资源容量和优先级: ```xml <property> <name>yarn.scheduler.capacity.root.myqueue.capacity</name> <value>40</value> </property> ``` 2. **容器超时设置** 调整 Yarn 容器超时时间,防止作业因资源不足被误杀: ```xml <property> <name>yarn.resourcemanager.am.liveness-monitor.expiry-interval-ms</name> <value>600000</value> </property> ``` --- #### 四、安全配置(可选) 若集群启用 Kerberos 认证,需在 `flink-conf.yaml` 中添加: ```yaml security.kerberos.login.keytab: /path/to/keytab security.kerberos.login.principal: user@DOMAIN ``` 并通过 `SecurityUtils.install()` 加载安全模块[^1]。 --- #### 五、日志与调试 1. **日志路径配置** 修改 `log4j.properties` 调整日志级别: ```properties rootLogger.level = INFO ``` 2. **Yarn 日志聚合** 启用 Yarn 日志聚合功能,便于查看历史作业日志: ```xml <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> ``` --- ### 常见问题与解决 | 问题类型 | 解决方案 | |-------------------|--------------------------------------------------------------------------| | 作业提交失败 | 检查 `HADOOP_CONF_DIR` 是否包含正确的 Yarn 配置 [^2] | | 资源不足 | 调整 `-yjm`/`-ytm` 参数或联系管理员扩容队列资源 | | Kerberos 认证失败 | 验证 keytab 文件权限和 principal 名称是否匹配 [^1] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值