在Linux下,内存分为两个部分,分别是物理内存和虚拟内存。物理内存就是主机上插入的内存条;虚拟内存就是在硬盘上虚拟出来的一块逻辑内存空间,用于解决物理内存不足的情况。Linux下的虚拟内存被称为交换空间Swap Space,也就是系统中的swap分区。虽然现在的物理内存已经足够大了,但是还是建议保留一定的swap分区。
使用free命令可以查看当前内存的使用信息。命令语法如下:
free [选项]
常用选项:
- -h:以易于阅读的方式显示内存使用信息
free命令在CentOS 6.x和CentOS 7.x版本的系统下回显的内容并不相同,以下来详细分析下:
CentOS 6.x
[root@localhost ~]# free -h
total used free shared buffers cached
Mem: 7.7G 601M 7.1G 172K 151M 208M
-/+ buffers/cache: 241M 7.5G
Swap: 2.5G 0B 2.5G
列详解:
- total:总量
- used:正在使用
- free:空闲
- shared:共享内存
- buffers:存储块设备以及文件系统元数据(metadata)所占用的缓冲页
- cached:存储普通文件所占用的缓存页
行详解:
- Mem:物理内存
- -/+ buffers/cache:应用程序可以使用的内存
- Swap:交换分区
buffers/cached的存在是为了提高文件的读取性能而存在的,当应用程序需要内存时,buffers/cached占用的空间将很快被回收。所以,在系统看来,内存的free值=total-used,但对于应用程序来说,buffers/cached这一部分空间是可用的,所以free值=系统free值+buffers+cached。这也是为什么free命令的回显中会有两个free值的原因。
CentOS 7.x
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 7.6G 192M 7.1G 8.8M 338M 7.2G
Swap: 2.5G 0B 2.5G
这里与CentOS 6.x中的回显不同的是,分开的buffers/cached列合并为buff/cache列,并新增了available列,同时-/+ buffers/cached行也取消了,使得显示更加简洁。CentOS 7.x下已经把buffers/cached合并,因为两者本质相同。新增的available列显示的就是应用程序可用的空闲内存。
手动释放buffers/cached
在手动释放buffers/cached前,必须使用以下命令将已更改的数据写入磁盘,并更新超级块,防止出现数据丢失的情况:
sync
释放buffers:
echo 1 > /proc/sys/vm/drop_caches
释放cached:
echo 2 > /proc/sys/vm/drop_caches
释放所有缓存:
echo 3 > /proc/sys/vm/drop_caches
在系统中手动创建swap
swap所需的交换文件其实也是一个普通的文件,但创建该文件需要使用dd命令:
dd if=/dev/zero of=swap文件路径 bs=大小 count=次数
# /dev/zero是一个特殊的文件,当你读取它时,它会提供无限的空字符。该文件通常用于覆盖信息,或产生一个特定大小的空白文件
# 同样的/dev/null也是一个特殊的文件,你可以将不用的数据统统丢给它,它会像黑洞一样吞噬掉这些数据而不会增大自身的体积
使该文件成为交换文件:
mkswap swap文件
激活交换文件:
swapon swap文件
取消激活交换文件:
swapoff swap文件
接下来就可以使用rm命令删除该文件。
swap的优化
swappiness值决定了系统如何使用swap。当swappiness=0时,系统最大限度的使用物理内存,然后才是swap;当swappiness=100时,系统积极使用swap,并把内存上的数据及时搬运到swap。使用以下命令可以查看swappiness值:
cat /proc/sys/vm/swappiness
当物理内存的占用量=100-swappiness值时,就开始使用swap。
使用以下命令临时调整swappiness值:
sysctl vm.swappiness=x
在/etc/sysctl.conf文件中添加以下内容可永久修改swappiness值:
vm.swappiness=x