1. 什么是 swap 分区
Swap 分区在系统的物理内存不够用的时候, 把物理内存中的一部分空间释放出来, 以供当前运行的程序使用. 那些被释放的空间可能来自一些很长时间没有什么操作的程序, 这些被释放的空间被临时保存到 Swap 分区中, 等到那些程序要运行时, 再从 Swap 分区中恢复保存的数据到内存中. swap 分区是从磁盘空间划分而来, 有的是单独使用一个分区, 有的是把一个大文件当做 swap.
2. 官方关于 swap 设置
Redhat6.4 官方推荐(我们使用 CentOS 6.4)
推荐的系统交换空间
系统中的 RAM 数量 建议交换空间 如果允许休眠, 建议使用交换空间
2GB RAM 的 2 倍 RAM 数量的 3 倍
> 2GB - 8GB 等于 RAM 的数量 RAM 的 2 倍
> 8GB - 64GB 至少 4 GB RAM 的 1.5 倍
> 64GB 至少 4 GB 不建议休眠
因为有些系统会允许休眠状态, 如果不设置 swap 会无法启动, 就像 windows 系统使用休眠设置虚拟内存一样.
Mysql 5.6 和 5.7 的建议
mysql5.6
是说在物理内存足够的情况下, 可以删除 swap, 因为系统在有些情况下会及时内存够用使用 swap, 若使用会因为 I/0 变高导致 mysql 故障. Mysql 建议删除.
oracle 建议
另外在其它博客中看到下面一个推荐设置, 当然我不清楚其怎么得到这个标准的. 是否合理也无从考证. 可以作为一个参考.
4G 以内的物理内存, SWAP 设置为内存的 2 倍.
4-8G 的物理内存, SWAP 等于内存大小.
8-64G 的物理内存, SWAP 设置为 8G.
64-256G 物理内存, SWAP 设置为 16G.
当然这么多建议标准, 很让人无所适从, 不知道该怎么设置. 其实根据系统实际情况和内存的负荷综合考虑, 但是实际情况又是什么样呢?
个人建议从如下几个考虑:
物理内存空间是否在峰值也可以满足要求, 不满足建议设置 swap 防止内存溢出导致主机宕机, 当然设置不宜过大, 占用磁盘空间.
磁盘 I/O 是否足够, 使用磁盘 I/O 值过低或者其他业务要求高, 不建议设置 swap. 由于使用 swap 需要频繁写入磁盘, 使用固态磁盘不建议设置.
服务器安装的具体的应用, 比如 Mysql 等不推荐设置, 可以不设置或者修改参数 swappiness 来控制的, 默认值为 60 意思是说在内存使用 40% 的情况下就使用 swap 空间, 可以将值设置为 10 或者设置 0, 优先使用物理内存.
3. 如何增加或者删除 swap 分区
查看 swap 空间和使用情况
- [root@localhost-zabbix ~]# swapon -s
- Filename Type Size Used Priority
- /dev/dm-1 partition 2097144 0 -1
- [root@localhost-zabbix ~]# free -m
- total used free shared buffers cached
- Mem: 1877 565 1311 0 132 188
- -/+ buffers/cache: 244 1632
- Swap: 2047 0 2047
关闭 swap
- [root@localhost-zabbix ~]# swapoff /dev/dm-1
- [root@localhost-zabbix ~]# swapon -s
- Filename Type Size Used Priority
启用之前关闭分区
- [root@localhost-zabbix ~]# swapon /dev/dm-1
- [root@localhost-zabbix ~]# swapon -s
- Filename Type Size Used Priority
- /dev/dm-1 partition 2097144 0 -1
缩小 Swap 分区
如果是增大 Swap 分区大小, 那么就需要扩展正在使用的 swap 分区的逻辑卷, 此处使用 lvreduce 命令收缩逻辑卷
- [root@getlnx14uat ~]# lvreduce -L 8G /dev/mapper/VolGroup00-LogVol01
- WARNING: Reducing active logical volume to 8.00 GB
- THIS MAY DESTROY YOUR DATA (filesystem etc.)
- Do you really want to reduce LogVol01? [y/n]: y
- Reducing logical volume LogVol01 to 8.00 GB
- Logical volume LogVol01 successfully resized
- [root@getlnx14uat ~]# mkswap /dev/mapper/VolGroup00-LogVol01 #格式化
- Setting up swapspace version 1, size = 8589930 kB
- [root@getlnx14uat ~]# swapon -s
- Filename Type Size Used Priority
- [root@getlnx14uat ~]# swapon /dev/mapper/VolGroup00-LogVol01
- [root@getlnx14uat ~]# swapon -s
- Filename Type Size Used Priority
- /dev/mapper/VolGroup00-LogVol01 partition 8388600 0 -1
增大 swap 空间
如果磁盘还有剩余未分配空间可以新分区 swap 或者增大之前的 swap
如果没有磁盘未分配, 可以新建分区文件, 来增大 swap
[root@localhost-zabbix ~]# dd if=/dev/zero of=/home/swap bs=1024 count=1024000
记录了 1024000+0 的读入
记录了 1024000+0 的写出
1048576000 字节 (1.0 GB) 已复制, 2.69212 秒, 389 MB / 秒
- [root@localhost-zabbix ~]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/mapper/vg_localhostzabbix-lv_root 18G 4.7G 12G 29% /
- tmpfs 939M 0 939M 0% /dev/shm
- /dev/sda1 485M 33M 427M 8% /boot
- [root@localhost-zabbix ~]# mkswap /home/swap
- mkswap: /home/swap: warning: don't erase bootbits sectors
- on whole disk. Use -f to force.
- Setting up swapspace version 1, size = 1023996 KiB
- no label, UUID=74c16b0d-7d88-4384-b41e-b12cc93d4bbf
- [root@localhost-zabbix ~]# cd /home/
- [root@localhost-zabbix home]# ls
- swap
- [root@localhost-zabbix home]# mkswap swap
- mkswap: swap: warning: don't erase bootbits sectors
- on whole disk. Use -f to force.
- Setting up swapspace version 1, size = 1023996 KiB
- no label, UUID=7677912c-b337-4e83-9003-b736dec93d31
- [root@localhost-zabbix home]# free -m
- total used free shared buffers cached
- Mem: 1877 1611 265 0 135 1192
- -/+ buffers/cache: 283 1593
- Swap: 2047 0 2047
- [root@localhost-zabbix home]# swapon swap
- [root@localhost-zabbix home]# free -m
- total used free shared buffers cached
- Mem: 1877 1612 265 0 135 1192
- -/+ buffers/cache: 284 1592
- Swap: 3047 0 3047
- [root@localhost-zabbix home]# swapon -s
- Filename Type Size Used Priority
- /dev/dm-1 partition 2097144 0 -1
- /home/swap file 1023992 0 -2
我们可以看到上面是有分区文件的方式增大了 swap 空间. 但是这里还有个问题就是重启系统以后 swap 还是会变回去, 这里需要修改 / etc/fstab
增加:
/home/swap swap swap default 0 0
删除刚刚增加 swap
- swapoff /home/swap
- rm -rf /home/swap
- vi /etc/fstab
- /home/swap swap swap default 0 0
是有新的分区新建 swap:
使用 fdisk 来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
- mkswap /dev/sdb2
- swapon /dev/sdb2
- vi /etc/fstab
- /dev/sdb2 swap swap defaults 0 0
修改 swappiness
swappiness 参数值说明
vm.swappiness = 0 仅在内存不足的情况下 -- 当剩余空闲内存低于 vm.min_free_kbytes limit 时, 使用交换空间.
vm.swappiness = 1 内核版本 3.5 及以上, Red Hat 内核版本 2.6.32-303 及以上, 进行最少量的交换, 而不禁用交换.
vm.swappiness = 10 当系统存在足够内存时, 推荐设置为该值以提高性能.
vm.swappiness = 60 默认值
vm.swappiness = 100 内核将积极的使用交换空间
- # sysctl -a | grep vm.swappiness 查看 swappiness
- vm.swappiness = 30
- # echo 10> /proc/sys/vm/swappiness 临时修改
- # sysctl -a | grep vm.swappiness
- # vm.swappiness = 10
- # sysctl -w vm.swappiness=10 临时修改
- vm.swappiness = 10
- # cat /proc/sys/vm/swappiness
- 10
在 / etc/sysctl.conf 中编辑, 增加如下参数(如果存在的话)
vm.swappiness = 10 永久修改 需要重启
特别注意:
在不影响业务和系统, 物理内存足够情况下, 优先建议使用最后一种修改 swappiness 这样可以保证在优先使用物理内存而在物理内存不足的情况下使用 swap 防止内存溢出. 根据查询资料建议设置值 10
来源: http://www.jianshu.com/p/af494c090586