讨论这个问题前,我们先来看当前系统状态:
1[root@localhost ~]# free -m
2 total used free shared buff/cache available
3Mem: 31768 9809 363 9601 21595 11838
4Swap: 8191 8191 0
为什么 buffer/cache 会占用这么多的内存?
buffer/cache使用过高通常是程序频繁存取文件后,物理内存会很快被用光。
当程序结束后,内存不会被正常释放,而是成为cache状态.
通常我们不需要手工释放swap,Linux会自动管理.
如果非要释放,请继续看.
如何释放占用的swap呢?
1## 将内存缓冲区数据立刻同步到磁盘
2[root@localhost ~]# sync
3## 关闭所有的swap
4[root@localhost ~]# swapoff -a
5## 启用所有swap
6[root@localhost ~]# swapon -a
7[root@localhost ~]# free -m
8 total used free shared buff/cache available
9Mem: 31768 10853 217 16740 20698 3658
10Swap: 8191 0 8191
那么回到最初的问题:
linux可用内存足够为什么还用swap?
上面可以看到服务器共有32G内存,其中buff/cache占用了21G+.
明明还有可以将近12G的内存可以使用.但系统却偏偏占用完了swap的8G内存.
可知系统并没有自动释放buff/cache最大化利用内存.
原因:
内核参数 swappiness 的值的大小,决定着linux何时开始使用swap。
swappiness=0 时表示尽最大可能的使用物理内存以避免换入到swap.
swappiness=100 时候表示最大限度使用swap分区,并且把内存上的数据及时的换出到swap空间里面.
此值linux的基本默认设置为60,不同发行版可能略微不同.
查看命令具体如下:
1[root@localhost ~]# cat /proc/sys/vm/swappiness
260
什么意思呢?
就是说,你的内存在使用率到40%(100%-60%)的时候,系统就会开始出现有交换分区的使用。
大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
调整值
1[root@localhost ~]# sysctl vm.swappiness=10
2vm.swappiness = 10
3[root@localhost ~]# cat /proc/sys/vm/swappiness
410
重启依旧生效,需要在/etc/sysctl.conf修改:
1[root@localhost ~]# cat /etc/sysctl.conf
2vm.swappiness = 10
3[root@localhost ~]# sysctl -p
题外话
通常我们还经常看到shared占用大量内存,shared表示共享内存的占用,
起决定参数的两个分别是:
1# 定义单个共享内存段的最大值
2kernel.shmmax = 68719476736
3
4# 定义共享内存页数
5kernel.shmall = 4194304 ##(16G)
当前系统内存页大小查看:
1[root@localhost ~]# getconf PAGESIZE
24096
当前系统共享内存段大小(bytes):
1[root@localhost ~]# cat /proc/sys/kernel/shmmax
216777216000
共享内存段个数查看:
1[root@localhost ~]# ipcs -m
内存页和内存段是两种不同的内存管理方式,详细了解可以自行谷歌.
学习安排上!