• leslie
    2020-08-31
    Coding能力有限:不过学过倪鹏飞老师的课,侧重点应当不同吧;PageCache大小的合理设置不知道为何老师不曾提及?单独的去谈代码似乎忘了底层硬件吧。我们说性能是基于硬件去提问,老师单独的去问而不提及硬件基础是否、、、这就像我们去说怎么样去设置软件更合理,不去提及我们硬件的主频和大小以及、、、

    作者回复: pagecache和硬件关系不大,如果说pagecache一定要跟硬件关联起来的话,会有这几方面:一个page有多大,tlb有多大,cache有多大,物理内存多大,磁盘是ssd,hdd还是nvme。page的大小和物理内存的大小决定了pagecache的量,但是你会发现pagecache的回收机制其实是独立于这个量的,也就是,不论它有多少,active和inactive的替换逻辑是不变的。tlb大小和cache大小则影响了pagecache命中与否的性能,但是你会发现相比pagecache miss而言,tlb/cache miss几乎可以忽略不计,这是不同数量级的差异。磁盘介质又决定了pagecache的重要性,如果你的磁盘是hdd,那pagecache对应用的提升会非常明显;如果是nvme,那么pagecache miss后业务的性能下降也不会太明显;但是你会发现,不论磁盘介质是什么,pagecache如果命中的话,它的性能都是数量级的差异。 也就是说,pagecache自身的机制是独立与硬件的,不论你是什么样的硬件,都要尽量保障热数据在内存中,而冷数据则尽量不要占用内存,这就是pagecache机制的核心。 换一个角度而言,不论是x86还是arm,linux都要能工作,而能工作就是linux的本质,这个本质是我们想要讨论的。而不是讨论linux在arm上的工作和x86的工作会有什么差异。

    共 2 条评论
    27
  • Geek_lucky_brian
    2020-08-28
    感觉学习到了很多。请教老师一个问题,如果不做sync而是直接去drop cache,drop期间是不是也会把脏页刷盘呢?如果是的话,那么为什么还要单独做一次sync呢?直接drop cache不就好了吗

    作者回复: dropcache不会清理脏页,只会清理干净的页,所以如果你想清理所有的页的话,是需要在drop前先sync的。

    共 5 条评论
    21
  • Dovelol
    2020-08-21
    老师好,能详细讲一下buffer cache和page cache的区别吗?这两个到底作用在哪的。

    作者回复: buffer可以理解为是一类特殊文件的cache,这类特殊文件就是设备文件,比如/dev/sda1, 这类设备文件的内容被读到内存后就是buffer。而cached则是普通文件的内容被读到了内存。你可以做一个试验,运行下面这个程序,然后观察/proc/meminfo里Buffers和Cached这两项的变化,你会发现增加的是前者。 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define DEV "/dev/sda1" #define SIZE (1024 * 1024 * 1024) int main() { int fd = open(DEV, O_RDONLY); char *buf; int size; buf = malloc(SIZE); if (!buf) return -1; size = read(fd, buf, SIZE); printf("%d\n", size); while (1) { } return 0; }

    共 6 条评论
    21
  • Joe Black
    2020-08-23
    我们的数据处理算法实际上对超大输入文件是从头到尾读一遍,而且整个程序仅读一遍,这样其实用direct io就行了吧?

    作者回复: 是的。如果只读一遍后续再也不会用到,那确实没有必要还用pagecache,使用direct IO就可以了。而且超大文件读入到内存也会影响其他进程对内存的使用。

    
    16
  • 一步
    2020-08-23
    所以 Page Cache 就是 磁盘的一个缓存区?

    作者回复: 可以理解为是磁盘的缓存,但是它属于内存,不属于磁盘。

    共 5 条评论
    8
  • 青鸟飞鱼
    2020-09-12
    老师,你好,在有些地方看到经过PageCache的Io叫缓存IO,有些地方说是直接IO。不知道缓存IO,直接IO有什么区别吗

    作者回复: 缓存io是指应用在读磁盘文件的时候会先经过缓存(内存),而且直接io则不经过缓存而直接与磁盘交互。

    
    7
  • Geek_c2089d
    2020-10-15
    Swap 过程产生的 I/O 会很容易引起性能抖动不太明白是什么意思?

    作者回复: 因为swap得数据量往往较大,而且发生swap时往往是内存很紧张时,各种因素叠加会导致swap过程非常容易出问题。

    共 4 条评论
    4
  • nestle
    2020-08-30
    老是,第一张图有个地方没太明白,Page Cache是由VFS模块来管理的吗?回写、预读这些操作都是由VFS控制的吗?还是说VFS只负责普通文件I/O呢?

    作者回复: pagecache不是vfs模块来管理的,vfs只是提供了pagecache的一个使用接口,也就是标准io这种接口。pagecache是mm这个模块来管理的,回写和预读主要是涉及到mm和io子系统。

    共 2 条评论
    4
  • 金时
    2021-06-21
    mmap 产生的pageCache 也是内核态的吗

    作者回复: 内核态和用户态是指进程的运行状态 并不能用来表示内存。 应用程序通过mmap系统调用返回的地址空间属于“用户空间”。 mmap的用户空间的地址对应的物理内存则是page cache,这是不同的概念。

    共 2 条评论
    3
  • tianfeiyu
    2021-07-08
    老师,想问一下,如果没有开启 Swap 分区,Inactive(anon)+Active(anon) 既然不会在 page cache,那就只会存在内存中吗

    作者回复: 如果没有开启swap,匿名页就只能在内存中,知道它们被释放掉。

    
    2