Linux的free以及内存释放
free
[email protected]:~$ free
total used free shared buff/cache available
Mem: 1877216 547472 144224 16500 1185520 1130360
Swap: 0 0 0
[email protected]:~$ free -m //用MB来展示
total used free shared buff/cache available
Mem: 1833 543 179 16 1109 1094
Swap: 0 0 0
[email protected]:~$ free -h //输出更友好一些
total used free shared buff/cache available
Mem: 1.8G 546M 175M 16M 1.1G 1.1G
Swap: 0B 0B 0B
参数说明:
-s 1 每隔一秒输出一次内存使用情况
-hs 1 每隔一秒友好输出一次
Mem 内存使用情况
Swap 交换空间
-
total 内存总量,我的是2G内存
-
used 已经使用的内存
-
free 空闲的内存(对于系统而言,buff/cache属于已经被使用的内存空间)
-
shared 当前已经废弃不用的内存
-
buff/cache 磁盘缓存(当程序使用内存时,会使用这个内存空间)
-
available 可用缓存,理论上等于free + buff/cache
磁盘缓存区buff/cache
buffer用来作对io设备写缓存
cache用来作对io设备读缓存
不过现在两者已经写在一起了,统称为程序读写文件的缓存区
实现原理
扇区是设备的最小寻址单元,也叫硬扇区或设备块。
块是操作系统中文件系统的最小寻址单元,也叫“文件块”或"I/O块"
每个块包含一个或多个扇区,但大小不能超过一个页面,一个页可以容纳一个或多个内存中的块。
当一个块被调入内存中时,它要存储在一个缓冲区中,每个缓冲区和一个块对应。
buff/cache 只有块的概念,没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。
可以用指令来手动清理buff/cache缓存
sync;echo 3 > /proc/sys/vm/drop_caches
sync指令是为了防止内容丢失,Linux sync命令用于数据同步,sync命令是在关闭Linux系统时使用的。
Linux 系统中欲写入硬盘的资料有的时候会了效率起见,会写到 filesystem buffer 中,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了,sync 指令会将存于 buffer 中的资料强制写入硬盘中。
free pagecache:echo 1 >/proc/sys/vm/drop_caches
To free dentries and inodes:echo 2 >/proc/sys/vm/drop_caches
二者都清理就是 sync;echo 3 > /proc/sys/vm/drop_caches
注意:linux内核在内存将要耗尽时,会触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,主要的内存释放就来自于buff/cahce,特别是cache,cache是用来做缓存的,在内存够用时加快进程对文件的读写速度,在内存不足时,就需要释放cache的空间了。但释放的时候,需要确认cache中的数据和对应文件中的数据一致才能对cache释放,否则需要写入之后才释放。所以随着cache释放,io会飙升。因此释放buff/cache也是有代价的(因此线上服务器最好不要手动释放buff/cache)。
交换空间swap space
swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件。
当系统内存吃紧时,linux会将内存中不常访问的数据保存到swap上,这样系统就有内存为进程服务了。当系统需要访问swap上存储的内容时,再将swap的数据加载到内存中。swap space可以一定程度上解决内存不足的问题,但需要读写磁盘数据,所以性能不高。
内核提供了一个叫做swappiness的参数,用于配置需要将内存中不常用的数据移到swap中去的紧迫程度。这个参数的取值范围是0~100,0 表示内核尽可能不将内存数据移到swap中,100则表示尽量将内存中不常访问的数据移到swap中。Ubuntu系统默认是swappiness=60。
在/etc/sysctl.conf文件中设置
vm.swappiness = 10
或者使用指令
sudo sysctl vm.swappiness=10
查看swappiness参数
cat /proc/sys/vm/swappiness
60
注意:windows的虚拟内存和Linux的swap挺类似的(担心内存不足,就用一些系统盘的硬盘空间来充当内存使用)