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

内存中cache释放

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2018-4-23 09:51:13 来自手机 | 显示全部楼层 |阅读模式
在Linux系统中,内存使用过程会有cache一直占用。Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。
) L: l! p' J, g  F3 o一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。
" E) w. `- s$ Q( e) ]所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。# A# i0 B; u; `- _; _3 Y
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。/ i7 g5 H# Y: X% E% z; j7 s' ]3 M
所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
$ m! \: A  ]( n+ O/ l3 o9 Z在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:
: V, a8 n8 \  B( c4 O1' ^# F* A/ `; c, J1 ^! A
2' B* ~; \" D5 y8 z8 N7 u; p# l* R+ i
cat /proc/sys/vm/drop_caches) m3 b; ~& b* p) v3 h8 [
0
; P! ]+ U+ A7 M9 K, @0为默认值,即表示不释放( O; k5 v5 ]+ J) l0 s( z
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
7 n4 I+ t2 z2 wecho 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。4 M; x& I/ `6 }
echo 3 > /proc/sys/vm/drop_caches:表示清除page cache和slab分配器中的缓存对象。/ y" `- q0 |7 H& c2 R% R: P# c9 }
CentOS系统手动释放内存- q' f$ [3 R6 S8 i: I3 P" k
      线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在cached或者buffer当中,提高系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,如果系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(因此如果是看到used很多,来手动释放内存其实是不需要的)。
: G( m. q' D5 K0 z4 L  o. ]$ U  K$ ?/ n
操作步骤:  z& M6 \6 I5 n& A/ ^% S
1、查询当前内存使用情况和释放缓存的参数# F5 M% [; g$ h2 {8 }9 L8 P. h: z
free -m( g5 ^( L4 n; j$ m, s9 U4 k4 V% L- q8 |
命令结果如示所示:
3 ^/ P4 j4 J) N# B  L+ i7 L' L3 L* [/ l. @7 m' t: F" v1 s
             total       used       free     shared    buffers     cached- c9 u( u; `2 e3 M
Mem:         10988       6792       4196          0        168       1001' c0 f3 i# E2 M/ n
-/+ buffers/cache:       5622       5365
3 T1 P! W8 J* _3 h! tSwap:         4295          0       4295; A1 ^& a: i; ?
查看释放缓存参数的命令,如下所示:4 y" Z$ M/ {- ?/ M/ i

/ j% s9 [' D/ `  Z7 Z* ^5 z0 ncat /proc/sys/vm/drop_caches
$ \  |: C' s3 m& [; o' m0
+ b: x3 \# ^- m( E3 S( e' y! X0为默认值,即表示不释放。
7 d' _1 j5 L( J& x0 F5 `) y) a# U1 [& R
2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令如下:
' Y) u, J, R/ M/ J& f$ P
+ z: L( ^; q) Q7 N! Rsync, D# `4 I# d6 b$ B; h  R4 E
3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令如下:
& e2 N5 M) ~, Y" v5 o: t; H; }4 U( T
. o  S6 J" ]* d% Yecho 3 > /proc/sys/vm/drop_caches: j+ A; U+ X9 D- }
4、不重启机器使配置改生效,命令如下:, D9 A9 Q0 W1 B  u% U6 H9 w

8 ?7 H0 O, d) l$ `' x/ Msysctl -p! ~" q; z1 b! ^- E# g( Q5 t3 d
执行以上操作以后, + buffers/cache值由5365涨到了9000左右,这个值就恢复正常了,不过我觉得Linux管理内存的方式其实是很优异的,很多时候并不需要手动释放内存。
4 `2 s" e1 L6 F+ g+ j/ {( L
1 y' Z+ D  a% {# c& e5 x* P" p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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