内存中的buffer与cache
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存中的buffer与cache相关的知识,希望对你有一定的参考价值。
目录
buffer与cache
从命令行中查看内存中的buffer与cache,并跟踪理解其含义
1、free命令
root@wy-virtual-machine:~# free
total used free shared buff/cache available
Mem: 8107544 1050180 5182000 37764 1875364 6760616
Swap: 2097148 0 2097148
free命令输出的结果有总内存,已用内存,空闲内存,缓存,可用内存。缓存是buffer与cache的总和。从字面意思上理解,buffer是缓冲区,cache是缓存,都是内存中的临时存储区,两者的区别是什么呢?
在free的使用说明中有以下说明
#man free
buffers
Memory used by kernel buffers (Buffers in /proc/meminfo)
cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
buff/cache
Sum of buffers and cache
buffer 是内核缓冲区使用的内存,对应的/proc/meminfo中的Buffer值
cache是页缓冲区和slab 使用的内存,对应的是/proc/meminfo中的Cached 与 SReclaimable的和
2、proc系统中参数说明
具体还要看proc系统中的参数含义
# man proc
...
Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20 MB
or so).
Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.
SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.
Buffers:关于原始磁盘块的临时存储,通常不会特别大(20MB左右,内存集中,统一写入)
Cached:从磁盘读取文件的页缓存,不包括SwapCached
SReclaimable:是Slab的一部分,也许能被回收,如caches
下面用试验来深入理解buffer与cache的不同
试验一 :文件与磁盘的写
1、文件写入
终端1 写文件
dd if=/dev/urandom of=/tmp/file bs=1M count=500
中端2 使用vmstat观察内存,每1s输出一次
root@wy-virtual-machine:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 6651680 3880 375752 0 0 85 79 295 903 2 2 96 0 0
0 0 0 6651680 3880 375752 0 0 0 0 249 478 0 1 99 0 0
0 0 0 6651680 3880 375752 0 0 0 0 676 2261 5 4 92 0 0
0 0 0 6651680 3880 375756 0 0 0 20 246 635 0 1 99 0 0
0 0 0 6651680 3880 375752 0 0 0 0 195 484 1 0 99 0 0
1 0 0 6582632 4192 457268 0 0 380 0 284 477 0 18 82 0 0
1 0 0 6337940 4192 701892 0 0 0 0 436 291 0 51 49 0 0
1 0 0 6138868 4228 900584 0 0 32 319488 856 445 0 50 50 0 0
0 0 0 6138868 4240 900624 0 0 16 192512 397 457 0 6 93 1 0
0 0 0 6138868 4240 900628 0 0 0 0 128 258 1 0 99 1 0
试验现象
在申请内存阶段,cache迅速增长,而buffer基本不变。
写的数据量bi与bo的数据相加 (319488KB + 192512KB + 32KB+16KB)/1024 = 500MB(约等于)
2、磁盘写入
终端1 磁盘写入
(base) root@ubuntu:~# dd if=/dev/urandom of=/dev/sdc1 bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 3.93891 s, 133 MB/s
终端2 vmstat 1 观察
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 2297680 5124 348260 0 0 0 0 164 263 0 0 100 0 0
0 0 0 2297680 5124 348260 0 0 0 0 224 309 0 0 93 7 0
0 0 0 2297680 5124 348260 0 0 0 0 154 254 0 0 100 0 0
0 1 0 2297680 5124 348260 0 0 0 0 153 256 0 0 99 1 0
0 0 0 2297680 5124 348260 0 0 0 0 139 250 0 0 94 6 0
0 0 0 2297680 5124 348260 0 0 0 0 105 206 0 0 100 0 0
1 0 0 2101664 167392 381136 0 0 0 0 658 552 0 24 70 7 0
1 1 0 1960788 284280 405276 0 0 0 6240 859 989 0 26 66 8 0
1 1 0 1821180 400388 428932 0 0 0 15840 1325 1826 0 26 49 25 0
0 2 0 1679836 517808 453016 0 0 684 16560 1255 1874 0 25 50 25 0
2 2 0 1678508 518324 453136 0 0 584 13680 1452 2028 1 0 71 29 0
0 1 0 1678508 518324 453136 0 0 0 13324 2153 2849 0 1 74 25 0
0 1 0 1678508 518324 453136 0 0 0 8760 1278 1892 1 2 74 24 0
0 1 0 1678508 518324 453136 0 0 0 15720 2240 3168 0 1 74 24 0
0 1 0 1678508 518324 453136 0 0 0 16440 1522 2857 0 1 74 25 0
现象:写磁盘,buffer 增加的多
总结,写文件用到cache缓存数据,写磁盘用到buffer的缓存数据
试验二 :文件和磁盘的读
1、文件读取
终端1中执行:
dd if=/tmp/file of=/dev/null
终端2执行 vmstat 1如下
root@ubuntu:/# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 2285628 3764 349756 0 0 0 92 193 250 0 0 93 7 0
0 0 0 2285628 3764 349756 0 0 0 0 279 460 0 0 100 0 0
1 0 0 1778668 4028 857032 0 0 507588 0 8483 617 0 22 78 0 0
1 0 0 1773132 4092 861840 0 0 4820 0 1108 1907 1 1 98 0 0
cache 迅速增长,buffer基本不变,bi 变化比较大
bi的变化 (507588 + 4820)/1024 = 500.3984375
2、读磁盘
终端1 执行
dd if=/dev/sdc1 of=/dev/null bs=1M count=500
终端2执行 vmstat 1如下
root@ubuntu:/# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 1 0 2287180 2280 349444 0 0 502 306 123 214 0 1 94 4 0
0 0 0 2286676 2980 349464 0 0 700 0 360 634 0 0 97 2 0
0 0 0 2286424 3288 349376 0 0 308 0 291 505 0 0 99 0 0
0 0 0 2286424 3600 349480 0 0 328 0 1680 2850 1 2 90 7 0
0 1 0 2283652 5528 349532 0 0 2004 0 415 739 0 1 96 3 0
0 1 0 2272304 17060 349556 0 0 11524 24 1170 2359 0 0 68 32 0
1 1 0 2260712 28580 349560 0 0 11524 0 1180 2351 0 0 75 25 0
0 1 0 2248868 40236 349560 0 0 11656 0 1159 2348 0 0 75 25 0
0 1 0 2237528 51756 349584 0 0 11520 0 1077 2253 0 1 75 25 0
0 2 0 2225892 63404 349560 0 0 11648 0 2325 3137 0 1 73 27 0
0 1 0 2214552 74924 349620 0 0 11520 0 1769 2338 0 1 70 29 0
0 1 0 2203968 86572 349536 0 0 11648 0 1359 2195 0 0 75 25 0
1 1 0 2192628 98092 349560 0 0 11520 0 1370 2301 0 0 75 25 0
1 1 0 2181036 109740 349560 0 0 11648 0 1341 2276 0 0 75 25 0
1 2 0 2169444 121260 349560 0 0 11520 0 1550 2305 0 1 75 25 0
0 1 0 2157852 132908 349560 0 0 11648 0 1740 2390 0 1 74 24 0
0 2 0 2147268 144556 349560 0 0 11648 0 1536 2226 0 1 69 31 0
0 1 0 2135424 156204 349560 0 0 11648 0 1343 2111 0 0 74 26 0
0 1 0 2124084 167724 349560 0 0 11520 0 1303 2045 0 0 75 25 0
0 1 0 2112492 179244 349560 0 0 11520 0 1347 2123 0 0 68 32 0
0 1 0 2100900 190892 349512 0 0 11648 0 1321 2072 0 0 75 25 0
0 1 0 2089308 202412 349560 0 0 11520 0 1329 2094 0 0 68 32 0
0 1 0 2077716 214060 349560 0 0 11648 0 1315 2064 0 0 75 25 0
0 1 0 2066124 225580 349560 0 0 11520 0 1334 2099 0 0 68 32 0
0 1 0 2054532 237228 349468 0 0 11664 0 1641 3268 0 1 75 24 0
1 1 0 2043192 248748 349636 0 0 11648 0 814 2333 0 0 75 24 0
0 1 0 2031348 260396 349576 0 0 11520 0 770 2233 0 0 76 24 0
0 1 0 2019756 272044 349580 0 0 11652 0 825 2285 0 0 75 25 0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 2008416 283564 349580 0 0 11648 0 785 2255 0 0 75 24 0
0 1 0 1996572 295212 349532 0 0 11520 0 770 2265 0 0 75 25 0
0 1 0 1984980 306860 349580 0 0 11648 76 819 2299 0 1 75 25 0
0 1 0 1973388 318380 349580 0 0 11520 0 766 2254 0 0 75 25 0
0 1 0 1961796 330028 349548 0 0 11648 0 799 2287 0 0 75 24 0
0 1 0 1950204 341548 349580 0 0 11520 0 1041 2517 1 1 74 25 0
1 2 0 1938612 353196 349612 0 0 11680 0 2072 4171 1 2 73 24 0
0 1 0 1927020 364852 349508 0 0 11648 12 1446 3271 0 1 74 24 0
0 1 0 1915176 376500 349616 0 0 11648 0 892 2330 0 1 75 24 0
0 1 0 1903584 388020 349596 0 0 11520 0 1952 4150 0 2 73 25 0
3 0 0 1891740 399668 349508 0 0 11648 0 2025 4479 1 2 74 23 0
0 1 0 1880400 411316 349612 0 0 11648 0 1846 3563 1 1 67 31 0
0 1 0 1868556 422964 349612 0 0 11648 20 1155 2284 0 0 75 25 0
0 1 0 1856964 434612 349612 0 0 11648 0 1425 2870 1 0 68 32 0
0 1 0 1845372 446132 349612 0 0 11520 0 1290 2548 0 0 75 25 0
0 2 0 1833780 457780 349612 0 0 11648 0 1338 2807 0 0 75 25 0
0 1 0 1822440 469300 349612 0 0 11520 0 1342 3344 1 1 75 24 0
0 1 0 1810596 480948 349612 0 0 11648 0 1227 2864 1 0 75 24 0
0 1 0 1798752 492596 349564 0 0 11648 0 873 2350 0 0 75 25 0
0 1 0 1787412 504116 349612 0 0 11520 0 864 2340 0 0 75 24 0
0 1 0 1775568 515764 349612 0 0 11648 0 1755 2354 0 0 75 25 0
0 0 0 1775064 516024 349616 0 0 264 0 1230 2043 0 1 98 1 0
0 1 0 1775064 516024 349616 0 0 0 0 910 1524 0 0 95 5 0
0 0 0 1775064 516024 349616 0 0 0 0 317 524 0 0 98 2 0
0 0 0 1775064 516024 349616 0 0 0 0 136 219 0 1 100 0 0
buffer 在增长,bi 在变化 说明读磁盘文件时,数据缓存到了buffer缓冲区中
读磁盘的速度与文件相比,明显慢很多。
总结
Buffer 可以用作将数据写入磁盘的缓存,也可以用作输出从磁盘读取的缓存
Cache 可以用作文件读取数据的页缓存,也可用作写文件作页的缓存
参考链接
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0
以上是关于内存中的buffer与cache的主要内容,如果未能解决你的问题,请参考以下文章