Linux内存机制
Linux管理内存的机制是这样的:无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。
物理内存和虚拟内存
物理内存:系统硬件提供的内存大小;
虚拟内存:为了满足物理内存的不足而提出的策略,是利用磁盘空间虚拟出来的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space);
作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间。
这样以来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会重新从交换空间读取物理内存。
Linux的内存管理采用的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当时候将物理内存中不经常使用的数据块自动交换至虚拟内存中,而将经常使用的信息保留到物理内存。
在Linux操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到分配的内存中,然后再将数据分发给应用程序。
当需要往文件中写数据时,操作系统先分配内存接受内存数据,然后再将数据从内存写到磁盘上。
然而,如果有大量的数据需要从磁盘写入到内存或者由内存写入到磁盘时,系统的读写性能就会非常低下,在这种情况下,Linux引入了buffers和cached机制。
buffers和cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及tracking in-flight pages,而cached是用来给文件做缓冲。
更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
swappiness参数
swappiness参数设定了系统在什么时候使用swap交换空间
# cat /proc/sys/vm/swappiness
60
上面这个60代表物理内存在使用60%的时候才会使用swap。
swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间;
swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面;
通常情况下:
swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。
修改swappiness参数
临时性修改
# sysctl vm.swappiness=10
vm.swappiness = 10
# cat /proc/sys/vm/swappiness
10
永久性修改
编辑/etc/sysctl.conf文件,加入一行vm.swappiness = 35,然后执行sysctl -p使其生效。
然后查看是否生效:
# cat /proc/sys/vm/swappiness
35
释放内存
一般系统是不会自动释放内存的。
关键的配置文件/proc/sys/vm/drop_caches,这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存,
它的值可以为0-3之间的数字,代表着不同的含义:
0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存
修改配置文件之前,先执行sync将系统缓冲区的内容刷新回磁盘。
# free -h
total used free shared buff/cache available
Mem: 5.6G 1.9G 1.5G 63M 2.1G 3.1G
Swap: 8.0G 46M 8.0G
# echo "3" > /proc/sys/vm/drop_caches
# free -h
total used free shared buff/cache available
Mem: 5.6G 1.8G 3.4G 63M 294M 3.4G
Swap: 8.0G 46M 8.0G
更改后该值后,只能重启机器恢复至默认值(0)。
释放swap
释放swap需要确保内存剩余空间要大于swap使用量,否则会宕机!
根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。
通常通过重新挂载swap分区完成释放swap空间。
查看当前swap分区挂载点
# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 109824 -1
关停这个分区
# swapoff /dev/dm-1
查看状态
# swapon -s
Filename Type Size Used Priority
查看swap分区是否关停,最下面一行显示全0
# free -h
total used free shared buff/cache available
Mem: 974M 390M 173M 14M 410M 345M
Swap: 0B 0B 0B
将swap分区重新挂载
# swapon /dev/dm-1
查看是否挂载成功
# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -1