• 倪朋飞 置顶
    2018-12-26
    关于磁盘和文件的区别,本来以为大家都懂了,所以没有细讲。磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。

    其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件,这些大家可以执行 "ls -l <路径>" 查看它们的区别(输出的含义如果不懂请 man ls 查询)。

    在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。

    关于文件系统、磁盘以及 I/O 的原理,大家不要着急,后面 I/O 模块还会讲的。
    展开
    
     176
  • Geek_5258f8
    2018-12-26
    理论上,一个文件读首先到Block Buffer, 然后到Page Cache。有了文件系统才有了Page Cache.
    在老的Linux上这两个Cache是分开的。那这样对于文件数据,会被Cache两次。这种方案虽然简单,
    但低效。后期Linux把这两个Cache统一了。对于文件,Page Cache指向Block Buffer,对于非文件
    则是Block Buffer。这样就如文件实验的结果,文件操作,只影响Page Cache,Raw操作,则只影响Buffer. 比如一此VM虚拟机,则会越过File System,只接操作 Disk, 常说的Direct IO.

    作者回复: 👍

     3
     73
  • JJ
    2018-12-26
    还是有点困惑,感觉读写磁盘上的数据不就是读写磁盘上的文件里的数据嘛,难道读磁盘上的数据可以不经过文件系统吗,可以直接读裸磁盘?有点没理解buffer是磁盘上的数据缓存,cache是文件数据缓存,求大神解答下。。

    作者回复: 请参考置顶回复

    
     13
  • 顾仲贤
    2019-01-01
    老师,关于buffer是对直接写磁盘的缓存,我想问下。现实中有哪些是直接写磁盘的场景。写读写文件不也最终是写到磁盘上吗?谢谢
     1
     7
  • David.cui
    2018-12-26
    数据库使用裸设备是明显的磁盘读写;如果数据库的数据文件在文件系统上就是文件读写。这样理解对么

    作者回复: 对的

    
     5
  • acm1204
    2019-04-08
    socket buffer属于哪一类?

    作者回复: cache

    
     4
  • Mr.Strive.Z.H.L
    2019-01-22
    老师您好,有一个疑惑:
    数据写入到page cache。后续应用程序强制刷盘或者系统自动刷盘的时候,page cache中的数据还会经过buffer,然后再到块设备吗?还是不会经过buffer,直接刷到块设备了?
    (读取比较好理解,读取文件直接到page cache,读取块设备先到buffer,buffer不够再到page cache)

    作者回复: 早期的Linux会的,也就是cache两次。不过现在不会了,只会经过一层cache。

    
     4
  • croco
    2019-06-13
    我好像明白了,就是/proc/<pid>/smaps中的Pss相加,因为Pss是私有内存+共享内存按比例属于自己计算的那一部分
    比如私有内存是200k, 共享内存500k和4个其它进程共享,那么是Pss就是200k+(500/(1+4))=200k+100k=300k。 这样所有进程的Pss相加就不会有重复相加的顾虑,因为Pss中已经将共享内存部分帮我们算好了
    参考命令:awk '/Pss:/{ sum += $2 } END { print sum }' /proc/$$/smaps

    作者回复: 嗯嗯

    
     3
  • 无名老卒
    2018-12-27
    看了这篇文章,终于理解 了buffers以及cache,之前在网上还专门查过这2者的区别,但就是像老师说的那样,文章看下来,啥也没有啥明白。

    按照老师的总结,cache是针对文件系统的缓存 ,而buffers是对磁盘数据的缓存,是直接跟硬件那一层相关的,那一般来说,cache会比buffers的数量大了很多。生产环境下面看了多台机器,的确如此。

    后面留的那个作业,如果要统计一个进程所占用的物理空间,我的做法是累加RSS的值。如下shell是我工作中所使用的命令,取内存占用top10的进程:

    for i in $( ls /proc/ |grep "^[0-9]"|awk '$0 >100') ;do cmd="";[ -f /proc/$i/cmdline ] && cmd=`cat /proc/$i/cmdline`;[ "$cmd"X = ""X ] && cmd=$i;awk -v i="$cmd" '/Rss:/{a=a+$2}END{printf("%s:%d\n",i,a)}' /proc/$i/smaps 2>/dev/null; done | sort -t: -k2nr | head -10
    展开

    作者回复: 总结的不错,不过计算方法还是不太准确。可以继续查一下PSS和PSS的区别

     2
     3
  • 虎虎❤️
    2018-12-26

    通过读csapp,又复习了下虚拟内存。其概念为 “虚拟内存组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。” 访问虚拟内存时,MMU通过访问页表,来索引到实际的存储地址。如果在物理内存中有缓存,直接从物理内存中读取数据。否则,从磁盘中读取,并选择牺牲一个物理页,并替换为新读取的页(当然,我觉得这种应该是在内存没有free的情况下)。如果被牺牲的页发生改变,则写回磁盘。最后更新页表。

    我的问题是:
    1. 上一节讲了虚拟内存的空间分布,那么物理内存有没有空间分布的概念?从vmstat的输出来看,物理内存是不是只包括buffer cache 和 free呢?
    2. 这里的cache是不是等同于虚拟内存在物理内存中的缓存?
    3. 上一节课所说的内存回收。使用LRU算法“回收缓存”,是否是我上面描述的概念?那么所谓的“回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中”,指的是交换出哪种内存?cache?buffer?或者其他的种类?

    希望得到老师回复,也欢迎各位大佬共同探讨。
    展开

    作者回复: 1. 物理内存的分布由系统管理,没有类似于虚拟内存这样的分布
    2. 不是
    3. LRU回收的是缓存,Swap换出的是不可回收的内存,比如进程的堆内存

    
     3
  • 吴林辉
    2019-02-18
    “因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。”关于这一点,想请问下老师,linux block的大小不是4KB呢?

    作者回复: 这句话来自vmstat的文档:https://linux.die.net/man/8/vmstat

    通常说的的 Block Size 是磁盘分区的块大小,的确都是 4KB 了。

    
     2
  • 某、人
    2018-12-26
    老师,是否绕开文件系统,直接对磁盘进行读写会更快呢?

    作者回复: 去掉缓存的话,文件系统比磁盘又多了一层,所以有可能比直接磁盘读写慢。但文件系统也有缓存,所以大部分情况下不绕开会更快

    
     2
  • 我来也
    2018-12-26
    [D16打卡]
    只有一块磁盘,就没轻易的试第二个案例.
    ---------------------------------------------------
    以前应该只接触到了文件数据的缓存cache,没接触到磁盘数据的缓存buffer.
    1.vim一个大文件,在第一次加载时较慢,之后再次打开时,会明显感觉到加载速度更快,应该就是cache的功劳.
    2.在linux下写c程序时,打印日志printf后面习惯加fflush(stdout);
    可以强制刷新缓冲区的内容到物理设备.在程序宕掉时可以定位到最后的输出日志.
    如果不加fflush,可能会丢失掉部分缓冲区内的日志.
    不知道这里的缓冲区跟系统的cache是不是一个概念.
    ---------------------------------------------------
    ls -l 磁盘与普通文件的区别:
    # ls -l /dev/sda1
    brw-rw---- 1 root disk 8, 1 12月 12 10:17 /dev/sda1
    # ls -ld /root/
    drwx------ 12 root root 4096 12月 26 11:48 /root/
    第一个字符b应该表示是磁盘类型 d就是目录类型了
    有一列一个显示的第几块磁盘的第几个分区[8,1],一个是占用的空间大小[4096].
    疑问:man ls 了也没看到各列具体的含义啊,这个去哪查呢?
    ---------------------------------------------------
    老师最后的问题深入探索又是一篇长文了.哈哈!
    展开

    作者回复: 前面2是C库的缓存,跟系统的缓存没关系

    ls的文档参考 info coreutils 'ls invocation'

    
     2
  • 科学Jia
    2018-12-26
    老师,女同学我今天上班时间终于追到这里了。写的真真清楚,想知道您花了多少时间学这些?

    作者回复: 也花了挺多时间,有些基础的原理在学校就学过了,也有很多是实践中学到的经验

    
     2
  • 永
    2019-12-13
    老师你好,Buffer 是对磁盘数据的缓存,是当大小比较大时候才会执行而 Cache 是文件数据的缓存
    
     1
  • 聰
    2019-05-21
    有些细节未能理解,网上也找不到答案,望老师指点。
    1,关于写硬盘,cache也有一定程度的提升, 我自己测试写硬盘2GB,cache增长幅度为430MB,请问这部分的cache增长是什么原因呢?
    2,关于读磁盘,cache也有很轻微的增长,请问其中的原因又是?
    
     1
  • AI杜嘉嘉
    2019-02-21
    想请教一下老师,怎么看待一个系统buffer和cache使用率过高的问题。是好是坏,如果这些缓存没及时回收可能会导致,程序异常

    作者回复: 通常来说都是好事,不过也不是绝对的,还要看具体的场景的。比如,内存紧张的时候,回收缓存会对性能有一定影响;不合理的应用占用大量缓存,也可能会会导致内存不足。

    
     1
  • 爱学习的小学生
    2019-02-20
    打卡
    
     1
  • 小虎
    2019-01-14
    老是如果使用mmap进行写文件的话是先写入缓存,假如此时断电那么cache里面的数据会丢失吗?或者说系统怎么保证断电下cache的数据在恢复用电后还可以写入文件不丢失。

    作者回复: 有可能会丢失,所以很多应用还需要主动 sync

    
     1
  • 腾达
    2018-12-26
    $ dd if=/tmp/file of=/dev/null 为什么很快就结束了?导致vmstat值变化不大

    作者回复: 清缓存了吗?

    
     1
我们在线,来聊聊吧