参考: free -h详解与内存swap理解_51CTO博客_free swap
$ free -h
total used free shared buff/cache available
Mem: 251G 130G 2.4G 3.0G 118G 116G
Swap: 15G 15G 0B
total:表示服务器上总共的内存大小,这里是251G。
used:表示服务器当前正在使用的内存大小,这里是130G。(used = total-free-buffers-cache,这里没减去shared,shared应该是used的其中一部分)
free:表示服务器当前没有被使用的内存大小,这里是2.4G。
available:表示当前可用的内存大小,这里是116G。
shared:表示被多个进程共享的内存大小,这里是3.0G。
buff/cache: #缓冲和缓存 buff是用来缓冲文件属性和目录内容的(其实就是inode信息) cached是用来缓冲文件内容的(其实就是data block数据),这里是118G。
看free -h的时候看available字段,不应该看缓存,缓存会自动回收的
buff/cache缓存高,说明系统在大量读写,而不是说内存不够。
此时系统的负载可能也比较高,你可以执行top命令看下1,5,15分钟负载。
#2秒执行下free -h命令,执行3次
free -h -s 2 -c 3
通常sftp服务器负载比较高,你可以观察一下。
你也可以按照如下方法回收:
#方法1
#手动执行sync命令,将缓存写入disk,让内核将尽可能多的脏缓存页写入磁盘(以最大化可以丢弃的数据缓存页的数量)。我执行了变化不大,可能脏缓存数据小。
# free -h
total used free shared buff/cache available
Mem: 3.7G 1.1G 435M 344M 2.1G 1.9G
Swap: 8.0G 1.1G 6.9G
# sync
# free -h
total used free shared buff/cache available
Mem: 3.7G 1.1G 434M 344M 2.1G 1.9G
Swap: 8.0G 1.1G 6.9G
#方法2
#使用vm.drop _ caches参数,使用vm.drop _ caches永远不会触发内核丢弃脏缓存。其实和方法1原理差不多
# echo 3 >/proc/sys/vm/drop_caches
#
# free -h
total used free shared buff/cache available
Mem: 3.7G 1.1G 2.1G 344M 518M 2.0G
Swap: 8.0G 1.1G 6.9G
释放页面缓存、数据区和信息节点(一般使用3 或者sync即可)
echo 3 >/proc/sys/vm/drop_caches
释放数据区和信息节点
echo 2 >/proc/sys/vm/drop_caches
释放页面缓存
echo 1 >/proc/sys/vm/drop_caches
二、swap虚拟内存
2.1 总结
当Linux的物理内存快要被耗尽时,系统会把一些进程占用的内存转移到 swap 区,当物理内存被释放一部分时,swap 区的一些内存占用又慢慢回到 mem 区,但是 mem 区却不再是之前的满负荷状态,而是有一部分 free 的内存!
【总结1】
1)当物理内存快被耗尽时,系统并没有崩溃,而是拿 swap 做临时内存,当两者都耗尽,系统 OutofMemory
2)物理内存达到峰值,系统中一些不常用的进程内存占用被提到 swap 区
3)当 Men 区的资源进行释放时,被挪到 swap 的内存并不会全部回来,随着系统或者程序的唤醒才会慢慢回到 men 区
4)swap 是内存不够时,磁盘虚拟出来的内存,磁盘主要是 I/O 级别的操作,并不是系统内核级别的操作,处理速度跟 mem 区不是一个等级
【总结2】
其实swap是可以关闭的(比如swapon,swapoff命令),有些时候为了追求高性能会这么做,通常为了性能设置在10-30之间比较多。
通常使Swap负载保持在30%以下,这样才能保证系统的良好性能,这是一个参考值。
swap可以是磁盘划分的分区,因此有人叫做交换分区;也可以是某个文件,有方法教如何扩展swap空间。
swap可以设置多个的。
Linux系统的内存管理必须使用交换区来建立虚拟内存(是不是必须有时间测),安装好系统后可以把它关闭掉的。
交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的,此时考虑扩展物理内存,或排查什么程序如此占用内存了;或者服务器很久没有重启,过swap占用过大。
linux下的swap分区触发是由参数控制的,swappiness参数将控制在剩余多少物理内存的时候使用虚拟内存,当然,虚拟内存是在迫不得已的情况就才使用的,否则会
大大降低系统性能。
centos7结果通常是30,30的意思表示在物理内存已经使用了70%的时候(也就是100-30),剩余30%没使用,会开始使用swap虚拟内存。
(个人记忆:swappiness=30表示物理内存只有最后30%可用了,就开始使用swap)。
# cat /proc/sys/vm/swappiness
30
#如何设置合理的swap交换触发点。
#swappiness的值的大小对如何使用swap分区是有着很大的联系的。
swappiness=0 的时候表示最大限度使用物理内存,然后才是swap空间。在配置k8s或者其它一些追求高性能的情况,你可能看到关闭swap的分区。
swappiness=100 的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
swappiness 这个值应该低一点,系统的性能就比较好,通常为了性能设置在10-30之间比较多。
方式一:临时
sysctl vm.swappiness=10
这种方式是临时修改,重启后将自动还原。
执行下面的命令,使立即生效:
sysctl -p
方式二(永久):
编辑文件 /etc/sysctl.conf,在最下面添加:
kernel.shmall = 4294967296
vm.swappiness=10