欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux的free以及内存释放

程序员文章站 2022-06-04 10:42:17
...

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挺类似的(担心内存不足,就用一些系统盘的硬盘空间来充当内存使用)