一、虚拟内存介绍
背景介绍
Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的造价是要高于磁盘的,且内存的断电丢失数据也是不能把所有数据和程序都保存在内存中的原因。
既然不能全部使用内存,那数据还有程序不可能一直霸占在内存中。当内存没有可用的,就必须要把内存中不经常运行的程序踢出去。但是踢到哪里去,这时候swap就出现了。
Swap全称为swap place,即交换分区。当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。
Swap介绍
在详细介绍swap之前,需要知道的是计算机内存分为物理内存与虚拟内存(注意虚拟内存和虚拟地址空间的区别)。
物理内存是计算机的实际内存大小,由RAM芯片组成。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的swap。
当用户提交程序,然后产生进程在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有则直接调入内存进行;如果没有,则会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。
内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4Kb。而内存与磁盘则是按照块来交换数据的。
Swap的设置
对于使用多大比例内存之后开始使用swap,在系统配置文件中可以通过调整参数进行修改。
cat /proc/sys/vm/swappiness
该参数范围为0-100。0就是最大限度使用内存,尽量不使用swap;100是积极使用swap。
物理内存无法更改,所以swap大小的设置将会影响应用能否正常运行。swap大小的确定,根据Centos官网介绍可以得出如下公式:
1 M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M *2 Else S = M + 2
注意:最小不应小于32M。
swap相关命令
swapon(选项)(参数)
选项
-a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;
-h:显示帮助;
-p<优先顺序>:指定交换区的优先顺序;
-s:显示交换区的使用状况;
-V:显示版本信息。
查看当前swap的使用情况
swapon -s
关闭相应的 swap_disk_name
swapoff <Filename>
启动相应的 swap_disk_name
swapon <Filename>
多个swap设置优先级, 优先级相同将同时使用, 你可以在0到32767中间选一个数字给他
如果优先级相同将会同时使用
swapon -p 0 <Filename>
二、虚拟内存设置
1、检查 Swap 空间
在设置 Swap 文件之前, 有必要先检查一下系统里有没有既存的 Swap 文件
运行以下命令:
swapon -s
如果返回的信息概要是空的, 则表示 Swap 文件不存在
2、检查文件系统
在设置 Swap 文件之前,同样有必要检查一下文件系统,看看是否有足够的硬盘空间来设置 Swap
运行以下命令:
df -hal
检查返回的信息,还剩余足够的硬盘空间即可
3、创建并允许 Swap 文件
下面使用 dd 命令来创建 Swap 文件
dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k
这样就建立一个/tmp/swapfile的分区文件,大小为1G。
参数解读:
if=文件名:输入文件名,缺省为标准输入。即指定源文件。if=input file
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。of=output file
bs=bytes:同时设置读入/输出的块大小为bytes个字节
count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。
4、格式化并激活 Swap 文件
上面已经创建好 Swap 文件,还需要格式化后才能使用。运行命令:
dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k
激活 Swap ,运行命令:
swapon /tmp/swapfile
以上步骤做完,再次运行命令:
swapon -s
你会发现返回的信息概要:
Filename Type Size Used Priority
/tmp/swapfile file 524284 0 -1
可以使用命令 free -m
来查看现在的内存
如果要机器重启的时候自动挂载 Swap ,那么还需要修改 fstab 配置。
用 vim 打开 /etc/fstab 文件,在其最后添加如下一行:
/tmp/swapfile swap swap defaults 0 0
最后,赋予 Swap 文件适当的权限:
chown root:root /tmp/swapfile
chmod 600 /tmp/swapfile
同时,我们还可以修改 Linux Swap 空间的 swappiness ,降低对硬盘的缓存。
Linux 会使用硬盘的一部分做为 Swap 分区,用来进行进程调度–进程是正在运行的程序–把当前不用的进程调成‘等待(standby)’,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(active)’,睡眠的进程就会在 Swap 分区,把内存空出来让给‘活动’的进程。
如果内存够大,应当告诉 Linux 不必太多的使用 Swap 分区,可以通过修改 swappiness 的参数来设置。swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间,swappiness=100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。
通过以下命令可以看到:
cat /proc/sys/vm/swappiness
我们可以调整 swappiness 的值到一个合适的参数,从而达到最优化使用 Swap 的目的。
使用 sysctl 命令:
sysctl vm.swappiness=60
但是这只是临时性的修改,在你重启系统后会恢复默认的60,要永久设置,还需要在 vim 中修改sysctl.conf:
vi /etc/sysctl.conf
在这个文档加上这样一行:
vm.swappiness=60
保存退出 vim 。
这样一来,Swap 分区重启后都会生效了。
参考:
标签:swappiness,swapfile,内存,Swap,设置,Linux,虚拟内存,swap From: https://www.cnblogs.com/mynode/p/16908949.htmlhttps://cloud.tencent.com/developer/article/1704157
https://www.cnblogs.com/machangwei-8/p/10354464.html
https://www.linuxcool.com/swapon