Linux内存(手动释放cache)
项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的。
1、查看内存
free
$ free -h
total used free shared buffers cached
Mem: 125G 89G 36G 92K 212M 74G
-/+ buffers/cache: 14G 111G
Swap: 7.5G 1.8G 5.6G
cat /proc/meminfo
如果你想得到更加相近的信息可以使用cat /proc/meminfo,直接看硬件的统计数据。
MemTotal: 131755760 kB
MemFree: 38151680 kB
Buffers: 217564 kB
Cached: 78274852 kB
SwapCached: 6072 kB
Active: 29647292 kB
Inactive: 50949268 kB
Active(anon): 2073604 kB
Inactive(anon): 30640 kB
Active(file): 27573688 kB
Inactive(file): 50918628 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 7812092 kB
SwapFree: 5889924 kB
Dirty: 804 kB
Writeback: 0 kB
AnonPages: 2100436 kB
Mapped: 442904 kB
Shmem: 92 kB
Slab: 12017476 kB
SReclaimable: 11910264 kB
SUnreclaim: 107212 kB
KernelStack: 31184 kB
PageTables: 37492 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 73689972 kB
Committed_AS: 25708340 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 491656 kB
VmallocChunk: 34290629896 kB
HardwareCorrupted: 0 kB
AnonHugePages: 694272 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 4096 kB
DirectMap2M: 2019328 kB
DirectMap1G: 132120576 kB
这里我们看到,内存总数total=125G,已使用used=89G,空闲free=36G,cache=78G。其他类型不等。
先解释一下:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache (已用)的内存数:used - buffers - cached
+buffers/cache(可用)的内存数:free + buffers + cached
可用的memory=free memory+buffers+cached
这里可以看到我们使用了89G,其中cache占用了78G。这个占用有点高,并且不会自动释放。
2、什么是cache
为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 .
Free中的buffer和cache:(它们都是占用内存): buffer : 作为buffer cache的内存,是块设备的读写缓冲区 cache: 作为page cache的内存, 文件系统的cache 如果 cache 的值很大,说明cache住的文件数很多。
3、手动释放cache
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。
释放方法有三种(系统默认值是0,释放之后你可以再改回0值):
To free pagecache: echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches
注意:在清空缓存前我们需要在linux系统中执行一下sync命令,将缓存中的未被写入磁盘的内容写到磁盘上
具体的操作如下
# 先查看一下释放cache信令值, 此时应该是0
$ cat /proc/sys/vm/drop_caches
0
# 将缓冲区写入磁盘, 当需要停止系统的时候, 保证文件系统的完整性
$ sync
# 释放cache, 这个命令可能要花费一点时间, 请耐心等待
$ echo 3 > /proc/sys/vm/drop_caches
# 再看一眼
$ cat /proc/sys/vm/drop_caches
3
再来看一眼内存
$ free -h
total used free shared buffers cached
Mem: 125G 3.5G 122G 88K 13M 444M
-/+ buffers/cache: 3.1G 122G
Swap: 7.5G 1.8G 5.6G
cache已经释放,free=122G。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法