- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
在Linux系统中,内存使用过程会有cache一直占用。Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。
- P' p3 P+ K; Z0 p g7 Z9 t/ K一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。
1 |) `: P5 M$ A* u1 H' X- U0 \: B所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。/ }( H4 l$ n. U- T1 K3 @
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。
. P; b2 ?7 R1 I/ e所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。! t8 l3 ~9 @% a( r. k
在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:
/ P2 f8 y& o) z5 [0 {+ h q+ w9 G1
$ p, ]4 W) c0 Q# U2
9 N0 }: N7 z& G8 ]cat /proc/sys/vm/drop_caches
6 k$ e J: e3 A2 m0! {3 H' G9 T2 b# F
0为默认值,即表示不释放7 y: e2 O/ g2 D
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
$ I: v0 v2 u8 f2 P, X5 o- R1 Mecho 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。% g/ H' s1 j2 W4 ~
echo 3 > /proc/sys/vm/drop_caches:表示清除page cache和slab分配器中的缓存对象。" L8 L9 N6 o- j4 C# q( m
CentOS系统手动释放内存
- Q& w- O7 X' B f, M) y3 O/ C 线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在cached或者buffer当中,提高系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,如果系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(因此如果是看到used很多,来手动释放内存其实是不需要的)。
! b) ~5 Q9 w% Y# \1 a q8 f
1 r' |5 R* u5 S9 ?, ]; i操作步骤:( n9 o' X& h6 v. i: j5 L$ V
1、查询当前内存使用情况和释放缓存的参数
# D- N* q$ Q7 h0 R& w {7 Vfree -m
' W" @ u# B( v( U命令结果如示所示:
$ r D2 t! U; ?7 U0 r
5 l/ \; x9 r; G" N# ~ Q/ D( v total used free shared buffers cached8 k. P \; G; R
Mem: 10988 6792 4196 0 168 1001
, l7 p' _( V. m4 O-/+ buffers/cache: 5622 53657 X0 w- P, b* o4 y8 m- p
Swap: 4295 0 42952 h; A3 D$ E* _# b$ A4 ^% X
查看释放缓存参数的命令,如下所示:0 W. y, f; ]: `) r. {. _! L2 r
9 l, ]3 @' A- W# n+ @; V/ s7 Ncat /proc/sys/vm/drop_caches/ H* [" h* ~5 ]3 U7 C
0
& C0 a+ m d' p- w9 `( z6 i0为默认值,即表示不释放。
2 D6 S" @- C$ I% F
' L* i) ]: @/ v% x! ^/ h2 l2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令如下:
/ w/ i9 l5 i: c% s. f& h( ~
4 N4 ^. K( E9 y; J; ]! msync
/ t; u; X" G9 a* u3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令如下:
" ~; b& [1 P6 f# G R, v& z8 U j. @+ w4 E# W/ r' `! v3 M
echo 3 > /proc/sys/vm/drop_caches: i' P) T' t, A- m
4、不重启机器使配置改生效,命令如下: v7 y7 e" a; q9 S
. q, w1 b$ ^( F$ K _sysctl -p
# t# A8 f. I' q# @6 h+ m执行以上操作以后, + buffers/cache值由5365涨到了9000左右,这个值就恢复正常了,不过我觉得Linux管理内存的方式其实是很优异的,很多时候并不需要手动释放内存。
6 i4 Q0 I- L) s- h4 k7 k7 O/ N z* {* a
|
|