Swap是什么?
Swap是Linux下的虚拟内存分区,内存的交换区,当Linux物理内存不够使用时,,将磁盘空间(SWAP分区)虚拟成内存来使用
Swap详解
对操作系统而言,如果存在物理内存不足的情况,通常使用硬盘空间进行弥补,这也就是我们常看到的虚拟内存技术。Swap空间的主要作用是在物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,这些释放的内存将被保存到swap空间中,供其他应用使用。在针对Linux web服务器的时候,调整swap能提高系统很大的性能。
Swap常见命令
- 查看当前swap资源:
swapon -s
- 查看系统中Swap:
cat /proc/swaps
- 加载交换分区:
swapon
swapon /swapfile - 卸载交换分区:
swapoff
swapoff /swapfile - 构建swap(格式化)版本:
mkswap
mkswap /swapfile (重新格式化,通知下File System) - 查看swap使用比例
cat /proc/sys/vm/swappiness
创建swap
Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区
经典的Swap设置规则:如果物理内存大小小于2G,设置的Swap分区大小为物理内存的两倍。如果物理内存大小大于等于2G,可以考虑设置Swap分区等于物理内存或者1.5倍内存大小
添加swap文件拓展swap空间
示例操作:在原有1G的交换空间下,通过添加一个9G交换文件,将swap交换文件设置为10G
- 查看内存,单位为M,最初swap文件只有1G
- 查看磁盘
- 查看swap文件列表,只有swapfile一个文件
- 创建大小为9G的交换文件swapfile2
dd命令:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换
- 格式化挂载交互分区
- 加载启动swap文件
查看swap列表,两个swapfile文件,其中swapfile2为新增文件
以上操作在重启系统后swap空间将会失去swapfile ,将swapfile 加入到/etc/fstab 条目将可以使得系统在init进程中调用swapon -a 来自动挂载swapfile ,这样每次机器重启后swapfile 都处于有效的swap空间。
- 写入/etc/fstab
在/etc/fstab文件中加入下面这样一行:
/usr/swap/swapfile swap swap defaults 0 0
备注:
这个dd命令很好用,可以用来把大文件分割成小的文件组,利用cat可以将那些小文件组重新组合成原来的大文件。
VPS
VPS(Virtual Private Server 虚拟专用服务器)技术,将一部服务器分割成多个虚拟专享服务器的优质服务。每个VPS都可分配独立公网IP地址、独立操作系统、独立超大空间、独立内存、独立执行程序和独立系统配置等
VPS只有一个根分区,没有swap交换分区。VPS内存不大,于是,我为其增加了一个swap交换文件。
进入一个目录
cd /var/获取256M的文件块:
dd if=/dev/zero of=swapfile bs=1024 count=262144创建swap文件
/sbin/mkswap swapfile激活swap文件
/sbin/swapon swapfile查看一下swap是否正确
/sbin/swapon -s加到fstab文件中让系统引导时自动启动
vi /etc/fstab
/var/swapfile swap swap defaults 0 0
调整swap使用比例
/proc/sys/vm/swappiness,值默认值是60, swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。现在服务器的内存动不动就是上百G,或者云主机架构,机器io太慢会极大的影响机器性能,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高系统的性能。另:在大内存服务器中我们需要设置这个值为0,尤其是在MySQL服务器上)
- 临时修改方案:
# sysctl vm.swappiness=10
vm.swappiness = 10
# cat /proc/sys/vm/swappiness
10
这里我们的修改已经生效,但是如果我们重启了系统,又会变成60.
- 永久修改方案:
在/etc/sysctl.conf 文件里添加如下参数:
vm.swappiness=10
或者:
# echo 'vm.swappiness=10'>> /etc/sysctl.conf