- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
在Linux系统中,内存使用过程会有cache一直占用。Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。9 T7 s( q3 _. {! q3 e
一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。
2 |& `! @3 u/ d所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。& s% _! Q! v/ Y: d
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。# }- A% p: F# M- v* q3 h
所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。8 j1 ?2 N, [* L) D
在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:: W, K, W4 r5 P& V
1
% }' V2 d; _6 n) k2/ i: C* }% w! z H j, p# _
cat /proc/sys/vm/drop_caches
: j/ G) c, d' J! l04 ]: H$ \8 G9 F' f
0为默认值,即表示不释放
" X+ `1 L' b! v3 kecho 1 > /proc/sys/vm/drop_caches:表示清除pagecache。: Y% J/ A/ B) H/ I
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
9 ?: W. R7 N8 y8 Hecho 3 > /proc/sys/vm/drop_caches:表示清除page cache和slab分配器中的缓存对象。
$ [, M- J7 y: }; o8 q7 m/ wCentOS系统手动释放内存
^( @, b x8 t! J 线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在cached或者buffer当中,提高系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,如果系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(因此如果是看到used很多,来手动释放内存其实是不需要的)。" Y4 ^4 M: v8 F
* k; w0 G# G" ?( ]操作步骤:/ f4 H! T7 }; ~; K( t
1、查询当前内存使用情况和释放缓存的参数' Z% _. r% e1 t& ^: K1 }- ?
free -m0 q9 E7 {6 u0 f
命令结果如示所示:, r* A& x+ M1 s" Z
$ C; @0 L9 h2 ? total used free shared buffers cached0 B1 n, V8 B! N! u3 y% |# G
Mem: 10988 6792 4196 0 168 1001
5 ^/ O; K ^3 B-/+ buffers/cache: 5622 5365
4 S0 a) b8 a! t0 }; ]0 [+ [Swap: 4295 0 4295
9 x- R8 y6 G* M查看释放缓存参数的命令,如下所示:
2 `1 \7 ^- q$ G: @& H. f* x8 w
, m- f% f k1 F0 s6 x5 b: ^" J9 Ycat /proc/sys/vm/drop_caches- k6 i; O0 l+ Z: c
0
$ @% | d4 w: m# Q0为默认值,即表示不释放。
* S6 ?# B: W* W1 K1 E, O) u' n# e, f/ G Y) c
2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令如下:3 T# L7 m8 e0 s' T3 P
) D5 o: i; [1 N1 q9 i# r+ {sync
7 |( b$ {- G8 x( _3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令如下:5 b9 r' g' m( V* Q# B/ [. J
. ?" v$ |/ v }" X S. gecho 3 > /proc/sys/vm/drop_caches1 t9 C0 [6 a2 q, V5 t4 Q: o. y
4、不重启机器使配置改生效,命令如下: a/ @& j" e% S: {# N! u
0 k' `! a& M0 E+ r" ^* Psysctl -p
, L; \% r/ a3 h8 C% g" K执行以上操作以后, + buffers/cache值由5365涨到了9000左右,这个值就恢复正常了,不过我觉得Linux管理内存的方式其实是很优异的,很多时候并不需要手动释放内存。0 u; Y2 p8 U1 g# v
2 U3 s, u+ y6 e. T7 a |
|