找回密码
 注册
查看: 4242|回复: 0

内存中cache释放

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2018-4-23 09:51:13 来自手机 | 显示全部楼层 |阅读模式
在Linux系统中,内存使用过程会有cache一直占用。Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。: x4 P( Z4 t% o, S, m7 p8 R" e+ h
一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。
! p5 I8 i: H0 I# F9 Z所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。
; T8 {) U5 r4 M) P, a2 m但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。7 M. w2 l. u* q  [0 h4 ^. N! @
所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。: O% h+ s0 l* n6 e+ Q9 j' d1 S
在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:( g) k& Q2 _5 ?+ q, a" g, }
1$ x  u/ O" J; U* Y% X; R# U7 x
2/ }# c) c- z1 A5 t6 d
cat /proc/sys/vm/drop_caches1 L9 o9 b/ x+ J! E# T7 [
0
8 \) G( @+ T* g* V3 N8 k0为默认值,即表示不释放
+ U  a  w7 s+ K9 t( E  f4 necho 1 > /proc/sys/vm/drop_caches:表示清除pagecache。& N$ ~: s, Q$ H9 B- Y6 t
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。  r9 N5 u- V+ V; f9 l
echo 3 > /proc/sys/vm/drop_caches:表示清除page cache和slab分配器中的缓存对象。8 R1 J( n: g/ a* [; ^
CentOS系统手动释放内存; Q  X; d* S, S$ ]0 _- l3 [
      线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在cached或者buffer当中,提高系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,如果系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(因此如果是看到used很多,来手动释放内存其实是不需要的)。
' F3 l7 F, h  d& l* R) f
1 ~3 o: h: L% l$ E& z操作步骤:
& g8 e" V0 v: h0 C9 L/ ?% E1、查询当前内存使用情况和释放缓存的参数/ ^" q! t) }$ t. u  O  Z6 {/ W
free -m% V5 i; Y4 i5 n" R0 ]1 v# i3 e
命令结果如示所示:) [- y! ^% c7 Z4 }- E0 ]: Z

$ X% a$ `$ j: s4 l3 C             total       used       free     shared    buffers     cached
+ E' O: {( Y5 f* e* W4 bMem:         10988       6792       4196          0        168       1001+ F4 v4 I- K3 K" e/ R
-/+ buffers/cache:       5622       5365
+ H3 v! S) T; Y  q; E# ~( m) ~Swap:         4295          0       4295
3 i8 T+ l9 N" o5 }2 B1 E查看释放缓存参数的命令,如下所示:. Y( M9 v: w2 a+ V) d
2 U! U! S) t$ R
cat /proc/sys/vm/drop_caches7 y! p- Y8 H! B, b
0
/ O, Q) `( o; ]7 s: _/ R; V6 m0为默认值,即表示不释放。
, u; t7 X1 @' B4 B( d) @
& A! I: y1 V- c2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令如下:
; w' D- n' A2 L% B5 Q2 l( q
5 @, l1 ~% [1 ksync9 f! y9 q+ F3 Z' ?' ?7 l' N9 d! J+ Y
3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令如下:
/ T$ a1 _8 S' D. [* M+ n' g) X& k% {2 F9 ]' P- W
echo 3 > /proc/sys/vm/drop_caches
; w" `1 C  z' L9 p' @7 q4、不重启机器使配置改生效,命令如下:
! j1 x( ^8 a5 l$ f. v$ [& n& Q/ J9 F) P  U7 [9 E: X$ c
sysctl -p
, T! s- d) K1 Y8 r执行以上操作以后, + buffers/cache值由5365涨到了9000左右,这个值就恢复正常了,不过我觉得Linux管理内存的方式其实是很优异的,很多时候并不需要手动释放内存。
/ s; e/ h( o! x. y4 G
3 @) j1 G+ y3 g' k4 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 03:03 , Processed in 0.014382 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表