容器内部运行sync命令,脏页回收是容器内部还是整个物理机回收

Docker容器脏页操作与sync命令验证
博客介绍了在Docker容器中的操作步骤。先启动容器并查看脏页情况,接着在主机创建大量脏页后再次查看容器脏页,最后在容器运行sync命令回写脏页并验证结果,表明sync是全局行为,会遍历全局的super block list。

步骤一:启动一个容器

[host]#docker run -t -i centos:latest /bin/bash

在容器里运行:

[docker]#grep Dirty /proc/meminfo

Dirty:               168 kB

步骤二:在主机里创建大量的脏页

[host]#dd if=/dev/zero of=testfile bs=1048576 count=4096

 

在容器里运行:

[docker]#grep Dirty /proc/meminfo

Dirty:           4194460 kB #创造了大量的脏页

步骤三:

在容器里运行命令

[docker]#sync

此命令会阻塞一会,因为要回写脏页

 

[docker]#grep Dirty /proc/meminfo

Dirty:                40 kB

 

验证结果:sync是全局的行为。内核代码里sync会遍历superlock list,这个super block list是全局不是每个容器的

F2FS(Flash-Friendly File System)是一种专为NAND闪存设计的日志结构文件系统,其设计目标是提高固态硬盘(SSD)和嵌入式存储设备的性能和寿命。在F2FS中,回收是垃圾回收(Garbage Collection, GC)机制的一部分,用于管理文件系统中不再使用的数据块,从而优化存储空间的使用并提升性能。 ### F2FS中的回收机制 #### 1. **的定义** 在F2FS中,指的是已经被修改但尚未写入磁盘的数据。这些数据通常存在于内存中的缓存中,等待被持久化到磁盘上。的产生主要来源于文件的写操作。 #### 2. **触发回收的时机** F2FS通过多种机制来触发回收过程: - **周期性触发**:系统会定期检查是否有大量的需要回收,以避免内存中积累过多未写入磁盘的数据。 - **手动触发**:用户可以通过`fsync()`或`sync()`等系统调用来强制将写入磁盘。此外,`umount`命令在卸载文件系统时也会触发一次完整的回收[^3]。 - **内存压力触发**:当系统内存不足时,内核会主动触发回收,以释放内存资源。 #### 3. **回收的具体流程** F2FS的回收主要依赖于其垃圾回收(GC)机制。GC的主要任务是清理那些包含无效数据的段(Segment),并将有效数据迁移到新的段中,从而腾出空闲段供后续写操作使用。回收的过程可以分为以下几个步骤: 1. **选择Victim Segment**:F2FS首先会选择一个包含最多无效数据的段作为“受害者”段。这一选择基于SIT(Segment Information Table)中的信息,SIT记录了每个段中有效数据的比例[^1]。 2. **迁移有效数据**:从Victim Segment中读取所有有效的数据,并将它们迁移到一个新的空闲段中。这一过程中,会被标记为需要写入磁盘。 3. **更新元数据**:迁移完成后,F2FS会更新相关的元数据结构(如NAT、SIT等),以反映数据迁移后的状态。 4. **释放Victim Segment**:Victim Segment被标记为空闲段,可供后续的写操作使用。 #### 4. **CheckPoint机制与回收** F2FS的CheckPoint机制在回收中也起到了重要作用。CheckPoint通常在系统启动时被读取,用于数据恢复。而在运行过程中,CheckPoint会在某些同步操作(如`fsync`或`umount`)中被触发,确保所有和元数据被正确写入磁盘。具体来说,CheckPoint机制会执行以下操作: - 将缓存中的`node`和`dentry`块写回磁盘。 - 挂起其他写操作(如`create`、`unlink`、`mkdir`等),以保证数据一致性。 - 更新CheckPoint的状态信息,包括版本号、NAT和SIT的位图以及日志信息等[^3]。 #### 5. **性能优化与策略** 为了优化回收的性能,F2FS采用了以下策略: - **异步写入**:F2FS支持异步写入机制,允许在后台逐步写入磁盘,而不是一次性阻塞所有写操作。 - **优先级调度**:F2FS根据的“老化”程度(即距离上次修改的时间)进行调度,优先处理那些长时间未被写入磁盘的。 - **段级别的垃圾回收**:F2FS的GC机制以段为单位进行操作,确保每次回收的粒度适中,既能有效清理无效数据,又不会对系统性能造成过大影响。 #### 6. **代码示例:触发回收** 以下是一个简单的代码示例,展示了如何通过`fsync`系统调用来触发F2FS中的回收: ```c #include <fcntl.h> #include <unistd.h> int main() { int fd = open("example.txt", O_WRONLY | O_CREAT, 0644); if (fd == -1) { // 处理错误 return 1; } // 写入数据到文件 const char *data = "This is a test."; write(fd, data, strlen(data)); // 触发回收 fsync(fd); close(fd); return 0; } ``` 在这个示例中,`fsync()`调用会强制将文件描述符`fd`对应的写入磁盘,从而触发F2FS的回收机制。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值