|
|
在Linux系统中,内存使用过程会有cache一直占用。Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。
2 L1 b* s5 q# k( h4 F" A4 A一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。8 G; s2 q) a- u+ c# g1 y
所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。; A9 U1 c% E Q( _' S
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。; c; }& M& t8 S- i
所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
4 \* }4 Y6 J" U& b" R在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:* O% Z( J) o: \% M4 {
1
* J! V0 Q$ Q/ {: a2
/ S W8 d$ O# xcat /proc/sys/vm/drop_caches
v' }# e! b0 ~ B, M: m0
( i" J2 x! K3 Q, K$ W0为默认值,即表示不释放$ @. n% G: l7 t" [. y
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
, M( m' d5 z9 Vecho 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。! B, p3 N. p+ p# G+ G
echo 3 > /proc/sys/vm/drop_caches:表示清除page cache和slab分配器中的缓存对象。+ J* Q: o1 D6 U [6 A* J0 M1 v# H
CentOS系统手动释放内存
1 ~! N# m; f" f" h9 a 线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在cached或者buffer当中,提高系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,如果系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(因此如果是看到used很多,来手动释放内存其实是不需要的)。6 Q7 |8 R4 m( q' B' ]* Q* U5 I
- P, ]6 S( L& e8 T8 c8 i
操作步骤:
: I; K0 h3 v! {& h* s( ?1、查询当前内存使用情况和释放缓存的参数
: o! F) n8 p4 B8 Z: m) }( Wfree -m- _1 ]; k; K; h/ }
命令结果如示所示:0 I: f) a& t9 Z5 f; B# U& B# N
0 z* q0 ]8 D- U& I
total used free shared buffers cached
" S$ t m3 b7 \$ P+ Z: x TMem: 10988 6792 4196 0 168 10015 `( J& E% F2 c }0 A6 @. v( ]
-/+ buffers/cache: 5622 5365; x X4 v( x7 Z4 f+ ?! v0 {5 |% W. q
Swap: 4295 0 4295
! o$ {- s, g0 ~! s8 B& G查看释放缓存参数的命令,如下所示:9 b: S1 ~: f! L7 B. l. d9 n
0 M# m9 S" y7 o4 xcat /proc/sys/vm/drop_caches
/ Q, C7 u A t" Y0
9 m* D5 d, u+ j% D" H+ ]0为默认值,即表示不释放。
y8 X' w5 Y4 U1 J3 T
" U8 \6 z ~0 _& d5 ^ e2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令如下: u- X. U2 j) f i$ D
/ Y5 f! }5 G/ Y% _. s; j# A, ^
sync: W+ N+ H; a2 V
3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令如下:0 A3 F( X# x l- I; U& x) x
% A2 j. U: f m0 l- L$ i
echo 3 > /proc/sys/vm/drop_caches- I n9 v/ k6 ]- p# z
4、不重启机器使配置改生效,命令如下:
2 q( @, X2 U' Y* G* c: ^% N
! g5 _; y4 X/ M# W8 Ksysctl -p6 k% x" p7 k/ e
执行以上操作以后, + buffers/cache值由5365涨到了9000左右,这个值就恢复正常了,不过我觉得Linux管理内存的方式其实是很优异的,很多时候并不需要手动释放内存。
% q. I$ P' V; W' m; B3 l) D5 P
|
|