AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 23433
Accepted
Avery Payne
Avery Payne
Asked: 2009-06-11 07:46:09 +0800 CST2009-06-11 07:46:09 +0800 CST 2009-06-11 07:46:09 +0800 CST

在Linux中,free命令上报的“buffers”和“cache”有什么区别?

  • 772

这是我不时看到的一个老问题。我对它的理解相当有限(很久以前就读过这些差异,但所涉及的事实从未真正陷入困境)。

据我了解,

  • 缓冲器

    由具有活动 I/O 操作的程序使用,即等待写入磁盘的数据

  • 缓存

    是已完成 I/O 操作的结果,即已刷新缓冲区或从磁盘读取数据以满足请求。

后人能得到一个明确的解释吗?

linux memory virtual-memory
  • 5 5 个回答
  • 75489 Views

5 个回答

  • Voted
  1. Best Answer
    David Spillett
    2009-06-11T08:26:07+08:002009-06-11T08:26:07+08:00

    “缓存”总数还将包括一些其他内存分配,例如任何 tmpfs 文件系统。要查看此效果,请尝试:

    mkdir t
    mount -t tmpfs none t
    dd if=/dev/zero of=t/zero.file bs=10240 count=10240
    sync; echo 3 > /proc/sys/vm/drop_caches; free -m
    umount t
    sync; echo 3 > /proc/sys/vm/drop_caches; free -m
    

    并且您将看到复制到基于 ram 的文件系统的 100Mb 的“缓存”值下降(假设有足够的空闲 RAM,如果机器已经过度提交,您可能会发现其中一些最终以交换方式结束内存使用)。每次调用 free 之前的 "sync; echo 3 > /proc/sys/vm/drop_caches" 应该在所有写缓冲区(同步)中写入任何挂起的内容,并从内存中清除所有缓存/缓冲的磁盘块,这样 free 只会读取其他“缓存”值中的分配。

    虚拟机(例如在 VMWare 下运行的那些)使用的 RAM 也可能计入免费的“缓存”值,当前打开的内存映射文件使用的 RAM 也会计入(这将取决于您使用的管理程序/版本和也可能在内核版本之间)。

    因此,它不像“缓冲区计数挂起的文件/网络写入和缓存计数最近读取/写入 RAM 中保存的块以保存将来的物理读取”那么简单,尽管对于大多数目的,这个更简单的描述可以做到。

    • 42
  2. Viky
    2009-06-12T04:01:20+08:002009-06-12T04:01:20+08:00

    棘手的问题。当您计算可用空间时,您实际上需要将缓冲区和缓存都加起来。这是我能找到的

    缓冲区是尚未“写入”到磁盘的东西。缓存是从磁盘“读取”并存储以备后用的东西。

    http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135

    • 8
  3. c4f4t0r
    2015-01-24T00:07:54+08:002015-01-24T00:07:54+08:00

    我正在寻找关于缓冲区的更清晰的描述,我在"Professional Linux® Kernel Architecture 2008"

    第 16 章:页面和缓冲区缓存

    相互作用

    如果对内核的其他部分没有好处,那么在页面和缓冲区之间建立链接几乎没有用处。如前所述,一些进出块设备的传输操作可能需要以大小取决于底层设备的块大小的单元执行,而内核的许多部分更喜欢以页面粒度执行 I/O 操作,因为让事情变得更容易——尤其是在内存管理方面。在这种情况下,缓冲区充当两个世界之间的中介。

    • 6
  4. Ijaz Ahmad
    2017-10-15T12:36:37+08:002017-10-15T12:36:37+08:00

    RedHat解释:

    缓存页面:

    缓存是内存的一部分,它透明地存储数据,以便可以更快地处理未来对该数据的请求。内核使用此内存来缓存磁盘数据并提高 i/o 性能。

    Linux 内核的构建方式是,它将使用尽可能多的 RAM 来缓存来自本地和远程文件系统和磁盘的信息。随着时间的推移,系统上执行了各种读取和写入操作,内核试图为系统上运行的各种进程或将在不久的将来使用的相关进程的数据保留存储在内存中的数据。进程停止/退出时不会回收缓存,但是当其他进程需要更多内存而不是可用内存时,内核将运行启发式算法通过存储缓存数据并将该内存分配给新进程来回收内存。

    当请求任何类型的文件/数据时,内核将查找用户正在操作的文件部分的副本,如果不存在这样的副本,它将分配一个新的高速缓存页面并用从磁盘中读出相应的内容。

    存储在缓存中的数据可能是先前计算的值,或者是存储在磁盘中其他位置的原始值的副本。当请求某些数据时,首先检查缓存以查看它是否包含该数据。从缓存中检索数据比从其源源中检索数据更快。

    SysV 共享内存段也算作缓存,尽管它们不代表磁盘上的任何数据。可以使用 ipcs -m 命令检查共享内存段的大小并检查字节列。

    缓冲器:

    缓冲区是存储在页面缓存下的数据的磁盘块表示。缓冲区包含位于页面缓存下的文件/数据的元数据。示例:当请求页面缓存中存在的任何数据时,内核首先检查缓冲区中的数据,其中包含指向页面缓存中包含的实际文件/数据的元数据。一旦从元数据中知道了文件的实际块地址,内核就会将其拾取以进行处理。

    • 4
  5. F. Hauri - Give Up GitHub
    2013-02-26T05:41:44+08:002013-02-26T05:41:44+08:00

    释放缓冲区/缓存

    警告这解释了不推荐在生产服务器上使用的强方法!所以警告你,如果出现问题,不要怪我。

    为了理解,您可以强制系统委派尽可能多的内存,而cache不是删除缓存的文件:

    前言

    在进行测试之前,您可以打开另一个窗口点击:

    $ vmstat -n 1
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
     0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
     1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
    ...
    

    用于实时跟踪交换的演变。

    注意:您必须在当前目录中处理尽可能多的可用磁盘,您有 mem+swap

    演示
    $ free
             total       used       free     shared    buffers     cached
    Mem:       2064396    2004320      60076          0      90740     945964
    -/+ buffers/cache:     967616    1096780
    Swap:      3145720      38812    3106908
    
    $ tot=0
    $ while read -a line;do
          [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
        done </proc/meminfo
    $ echo $tot
    10420232
    
    $ dd if=/dev/zero of=veryBigFile count=$tot
    10420232+0 records in
    10420232+0 records out
    5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s
    
    $ cat >/dev/null veryBigFile
    
    $ free
                 total       used       free     shared    buffers     cached
    Mem:       2064396    2010160      54236          0      41568    1039636
    -/+ buffers/cache:     928956    1135440
    Swap:      3145720      39132    3106588
    
    $ rm veryBigFile 
    
    $ free
             total       used       free     shared    buffers     cached
    Mem:       2064396    1005104    1059292          0      41840      48124
    -/+ buffers/cache:     915140    1149256
    Swap:      3145720      39132    3106588
    

    注意,我所做的主机被强烈使用。这在真正安静的机器上会更加重要。

    • 2

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve