[转帖]writeback mmap-ed dirty page

writeback,mmap,ed,dirty,page · 浏览次数 : 0

小编点评

对于mmap后直接对地址进行写数据的场景,系统可以主动写入back,因为对于mmap的page cache,系统会在页面初始化时自动进行dirty page标记,并在页面写入之前进行writeback。 当用户通过进程的虚拟地址直接对地址进行写时,由于系统已经自动进行了dirty page标记,因此,writeback操作可以直接进行,无需再次主动触发。

正文

https://zhuanlan.zhihu.com/p/517122285

 

问题

文件系统接口写脏的page cache, 因为主动调用了syscall, os知道该dirty page并在inode上进行标记, 之后合适的时间会进行writeback, 那么对于mmap后直接对地址进行写的数据, os是否一样能主动writeback, 而不需要应用主动触发?

过程

使用MAP_SHARED映射一个文件, 并对返回地址直接赋值.

fd = open("4k", O_RDWR);
addr = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0); 
printf("addr: %p\n", addr);
while (1) {
    *addr = 'a';
    c = getchar();
}

执行如下, 可以通过敲键盘重新dirty page

$ ./mem
addr: 0x7f985beff000

在敲完键盘后, 马上执行

$ sudo ./page-types -f /mnt/4k
             flags      page-count       MB  symbolic-flags                     long-symbolic-flags
0x0000000000000838               1        0  ___UDl_____M_______________________________        uptodate,dirty,lru,mmap
             total               1        0

可以看到页面是dirty的, 过一会会写回, 配置不同时间会不一样

$ sudo ./page-types -f /mnt/4k 
             flags      page-count       MB  symbolic-flags                     long-symbolic-flags
0x0000000000000828               1        0  ___U_l_____M_______________________________        uptodate,lru,mmap
             total               1        0

已经没有dirty标志了, 同样页可以通过进程的虚拟地址来看

$ sudo ./page-types -p `pgrep mem` -a $((0x7f985beff000/4096)) 

跟一下进程在内核的执行情况

$ sudo trace-cmd record -p function_graph -P `pgrep mem`

有如下调用链

do_page_fault()
    handle_mm_fault()
        do_wp_page()

可知触发了写保护, 应该是某处对该mmap的page进行了写保护, 简单起见, 直接使用了address做判断, 这并不是充分的条件, 对于调试是够了

#!/usr/bin/bpftrace

kprobe:page_mkclean_one /arg2 == 0x7f985beff000/ {
        @[kstack] = count();
}

interval:s:1 {
        print(@); clear(@);
}

拿到这样的栈

@[  
    page_mkclean_one+1
    rmap_walk+72
    page_mkclean+161
    clear_page_dirty_for_io+161
    mpage_submit_page+36
    mpage_process_page_bufs+255
    mpage_prepare_extent_to_map+494
    ext4_writepages+987
    do_writepages+67
    __writeback_single_inode+68
    writeback_sb_inodes+561
    __writeback_inodes_wb+86
    wb_writeback+605
    wb_workfn+918
    process_one_work+475
    worker_thread+77
    kthread+260
    ret_from_fork+34
]: 1

page_mkclean_one会执行如下操作

entry = pte_wrprotect(entry);
set_pte_at(vma->vm_mm, address, pte, entry);

结论

  • 对于mmap的page cache, 一样会被系统主动writeback
  • mmap第一次写入时, os肯定有机会介入并置dirty, 因为物理页还没分配
  • mmap在被writeback后, 页表里面会重置为写保护, 这样writeback后的第一次写操作仍然会被系统捕获, 从而设置dirty信息

与[转帖]writeback mmap-ed dirty page相似的内容:

[转帖]writeback mmap-ed dirty page

https://zhuanlan.zhihu.com/p/517122285 问题 文件系统接口写脏的page cache, 因为主动调用了syscall, os知道该dirty page并在inode上进行标记, 之后合适的时间会进行writeback, 那么对于mmap后直接对地址进行写的数据,

[转帖]raid缓存策略设置

RAID卡缓存策略 不同的RAID卡缓存策略对IO的性能影响较大,常见的策略有: 1、写操作策略,可设置为WriteBack或WriteThrough WriteBack:进行写操作时,将数据写入RAID卡缓存,并直接返回,RAID卡控制器将在系统负载低或者Cache满了的情况下把数据写入硬盘。该设

[转帖]阵列Cache写机制:Write-through与Write-back区别

http://www.nndssk.com/yjwt/134491jN6VSY.html Write Through和Write Back Write Through和Write Back是阵列卡Cache的两种使用方式,也称为透写和回写。当选用write through方式时,系统的写磁盘操作并不

[转帖]阵列卡缓存模式- 透写(Write Through)和回写(Write Back)

https://www.unicaca.com/info/detail/195.html 分享到: Write Through和Write Back是阵列卡Cache的两种使用方式,也称为透写和回写。 Write Through也是RAID阵列卡的默认模式。 当选用write through方式时,

[转帖]三种缓存策略分析:Cache aside,Read/Write through,Write Back

Cache aside 旁路缓存,旁路缓存操作逻辑是查询缓存,如果不存在那么就读取数据库并更新到缓存当中. 如果是更新数据库,那么操作完数据库后,删除缓存. 注意旁路缓存,缓存中的内容是不做更新操作的,只有写入和删除操作. 问题 1.请求1查询不到缓存,查询数据库.请求2更新数据,删除缓存,请求1写

[转帖]10GB/s 存储方案设计测试:用PCIe 5.0单盘还是SSD RAID?

https://zhuanlan.zhihu.com/p/558884542 - 测试平台介绍 - M.2 NVMe SSD散热方案浅析 - Intel RST RAID的Write Back写缓存适用于SSD吗? - RAID 0、10读写带宽线性提升 - 选择软RAID还是硬RAID? - SL

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww