如何查看缓冲和缓存的数据

4 linux memory

~$ free
             total       used       free     shared    buffers     cached
Mem:       3891076    1044972    2846104          0      82744     463876
-/+ buffers/cache:     498352    3392724
Swap:      4035580          0    4035580
Run Code Online (Sandbox Code Playgroud)
  1. 如何调查什么样的数据是bufferedcached.(尚未回答)
  2. 如何清除bufferscached?(回答)

编辑

Chris 提供的这个命令成功了:

sudo bash -c 'echo 3 > /proc/sys/vm/drop_caches && sleep 2 && free'
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 9

中“缓冲区/缓存”代表的内存free分别是您的磁盘和文件系统缓存,Linux 缓存它们以加快从您的磁盘读取数据的速度,因为访问磁盘通常是一种相当慢的重复访问数据的方式。因此,它们被缓存在内存中,并在可用时从那里透明地提供服务。

您可以使用fincore. 以下是项目页面中的示例:

# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512 
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660 
stats for CLUSTER_LOG_2010_06_03.MYI: file size=345088 , total pages=84 , cached pages=43 , cached size=176128, cached perc=51.190476 
Run Code Online (Sandbox Code Playgroud)

至于如何清除它们,从man 5 proc

/proc/sys/vm/drop_caches(从 Linux 2.6.16 开始)

写入此文件会导致内核从内存中删除干净的缓存、dentry 和 inode,从而导致该内存变为空闲。这对于内存管理测试和执行可重现的文件系统基准测试非常有用。因为写入此文件会导致缓存的好处丢失,所以它会降低整体系统性能。

  • 要释放页面缓存,请使用: echo 1 > /proc/sys/vm/drop_caches
  • 要释放 dentry 和 inode,请使用: echo 2 > /proc/sys/vm/drop_caches
  • 要释放页面缓存、dentries 和 inode,请使用: echo 3 > /proc/sys/vm/drop_caches

因为写入这个文件是一个非破坏性的操作并且脏对象是不可释放的,所以用户应该首先运行 sync(8)。

您通常不想刷新缓存,因为它的全部目的是提高性能,但出于调试目的,您可以drop_caches像这样使用(注意:您必须是 root 才能使用 drop_caches,但同步可以像任何用户):

# sync && echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)


小智 6

fincore是查看页面缓存中存在多少特定文件的有用工具。\n 为了找到哪些文件被添加到页面缓存中,\n我发现内核跟踪点filemap:mm_filemap_add_to_page_cache\n很有用。

\n

前任:

\n
# perf record -a -e filemap:mm_filemap_add_to_page_cache sleep 60\n# perf script\n[...]\n        perf_5.7   889 [005]    17.077676: filemap:mm_filemap_add_to_page_cache: dev 0:3 ino 0 page=0x234161 pfn=2310497 ofs=12897742848\n        perf_5.7   889 [005]    17.078127: filemap:mm_filemap_add_to_page_cache: dev 0:3 ino 0 page=0x228440 pfn=2262080 ofs=13017223168\n        perf_5.7   889 [005]    17.078457: filemap:mm_filemap_add_to_page_cache: dev 254:1 ino c23cf page=0x22d236 pfn=2282038 ofs=0\n        perf_5.7   889 [005]    17.078460: filemap:mm_filemap_add_to_page_cache: dev 254:1 ino c23cf page=0x228447 pfn=2262087 ofs=4096\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

可以使用将数字dev <major>:<minor>映射到设备节点lsblk

\n
# lsblk\nNAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT\nfd0      2:0    1    4K  0 disk\nsr0     11:0    1 1024M  0 rom\nvda    254:0    0   20G  0 disk\n\xe2\x94\x94\xe2\x94\x80vda1 254:1    0   20G  0 part /\n
Run Code Online (Sandbox Code Playgroud)\n

(我不确定“0:x”条目是什么,也许匿名映射也会触发该跟踪点?)

\n

可以使用 .inode 编号将其映射到文件find [...] -inum <decimal>

\n
# find / -mount -inum $((0xc23cf))\n/usr/bin/sleep\n
Run Code Online (Sandbox Code Playgroud)\n

在紧要关头,输出可以变得更容易接受,如下所示:

\n
# perf script | grep -v "dev 0:" | \\\n    awk '\n        {\n            match($0, "ino ([^ ]+)", a)\n            print a[1]\n        }\n    ' | sort | uniq -c | sort -n | \\\n    while read count inode; do\n        echo "$count $inode $(find / -mount -inum $((0x$inode)))"\n    done\n\n[...]\n20 c1950 /usr/lib/apt/methods/rred\n27 c194a /usr/lib/apt/methods/gpgv\n36 4203f\n36 60070\n36 60080 /var/lib/apt/lists/deb.debian.org_debian_dists_unstable_InRelease\n36 c1f24 /usr/bin/cp\n40 c04a6 /usr/bin/gpg-connect-agent\n47 c194c /usr/lib/apt/methods/http\n50 60340 /var/lib/apt/lists/deb.debian.org_debian_dists_unstable_contrib_source_Sources\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

第一列对应于换入的页数。推测没有文件名的 inode 已被删除。

\n