Linux 中 Swap 分区的概念和使用

Linux 中 Swap 分区的概念和使用


[root@iZhp3h4x7t41yl0eevhf1dZ ~]# free -h  
              total        used        free      shared  buff/cache   available
Mem:            15G        6.9G        7.1G        596K        1.5G        8.3G
Swap:            0B          0B          0B

什么是虚拟内存

​ 如果物理内存不够用时,可以将那些最近很少使用的页面数据(Page)置换出去,即切换到硬盘上,但是要注意的是内存文件的格式和硬盘中文件的格式是不一样的,所以这个分区必须格式化成跟内存兼容的模式不能转换成文件的格式。以便把内存的page直接存入这个分区,方便内存直接调用。而这个页面(page)数据对于32位的操作系统一个page大概是4K左右,对于64位操作系统这个page大小是可变的,4k-2M的大小都是比较常见的。事实上到底能使用多大的页面(page)取决于CPU而不取决于内存哟!这就是虚拟内存的概念。在linux上我们称之为交换分区。记住,虚拟内存必须是一个单独的分区。

虚拟内存能代替物理内存运行程序吗

答案是否定的,只是使用虚拟内存暂时保存数据,而不是代替物理内存运行程序。

虚拟内存的作用

​ 当运行某个大程序、大游戏,需要的内存超过空闲内存但小于物理内存总量时,会暂时把内存里这些数据放到磁盘上的虚拟内存里,空出物理内存运行游戏。等退出游戏后,又会把虚拟内存里的东西读出来,放回物理内存。所以,虚拟内存,并不是用来虚拟物理内存的,而是暂存数据的。 如果对内存的需求大于物理内存总量,那虚拟内存设多大都不管用。电脑内存太低,根本的方法还是增加物理内存,才能流畅。 虚拟内存机制上就不管用,即使管用,比物理内存低100倍的速度,也管不上什么实际的作用。所以,虚拟内存大了是没用的,反而白占用磁盘空间。

swappiness 参数在内存与交换分区之间优化作用

​ swappiness 的值的大小对如何使用 swap 分区是有着很大的联系的。先前,人们建议把vm.swapiness设置为0,它意味着**“除非发生内存益处,否则不要进行内存交换”。** 直到Linux内核3.5-rcl版本发布,这个值的意义才发生了变化。这个变化被一直到其他的发行版本上,包括RedHat企业版内核2.6.32-303。在发生变化之后,0意味着“在任何情况下都不要发生交换”。所以现在建议把这个值设置为1。swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面

## 阿里云服务中这个值默认就是  0  
[root@iZhp3h4x7t41yl0eevhf1dZ ~]# cat /proc/sys/vm/swappiness  
0
## swap 分区默认是关闭的 
[root@iZhp3h4x7t41yl0eevhf1dZ ~]# free -h  
              total        used        free      shared  buff/cache   available
Mem:            15G        6.9G        7.1G        596K        1.5G        8.3G
Swap:            0B          0B          0B

如果这个值被设置为60 ,也就是说,内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统 io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整

调整方法

注意:下面的调整是在服务器拥有 swap 分区的前提下进行的 ,如何设置 swap 分区可以参考
阿里云云主机添加swap分区与swap性能优化-阿里云开发者社区 (aliyun.com)

第一种方式

## 这种方式是临时的,重启后就会恢复到默认设置
[root@iZhp3h4x7t41yl0eevhf1dZ ~]# sysctl vm.swappiness=1
vm.swappiness=1

第二种方式

## 这种方式是永久的,直接修改文件中的内存
[root@iZhp3h4x7t41yl0eevhf1dZ ~]# echo "vm.swappiness=1" >> /etc/sysctl.conf  ## 设置值
[root@iZhp3h4x7t41yl0eevhf1dZ ~]# sysctl -p   ## 激活设置

​ **在linux中,可以通过修改swappiness内核参数,降低系统对swap的使用,从而提高系统的性能。**简单地说这个参数定义了系统对 swap 的使用倾向,值越大表示越倾向于使用swap。不推荐设为0,因为这样做会对3.5以上的kernel禁止对swap的使用,可以设置一个较小对值,比如1,它只是最大限度地降低了使用swap的可能性

开启 swap 空间

## 查看当前系统中是否已经启用swap分区
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# cat /proc/swaps
Filename				Type		Size	Used	Priority
## 如果没有启用swap分区功能,则新建一个专门的文件用于swap分区
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# dd if=/dev/zero of=/home/swap bs=512 count=2097152
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 5.27679 s, 203 MB/s
## 通过mkswap命令将上面新建出的文件做成swap分区
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# mkswap /home/swap
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=381ba648-2487-47ca-8ebc-a87dac81baa7
## 查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60,但其实如果不想频繁使用swap 可以设置为1 
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# cat /proc/sys/vm/swappiness  
0
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# sysctl -a | grep swappiness 
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.swappiness = 0
## 临时
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# sysctl -w vm.swappiness=1 
vm.swappiness = 1
## 永久
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# echo "vm.swappiness=1" >> /etc/sysctl.conf 
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# sysctl -p
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
kernel.sysrq = 1
vm.max_map_count = 655360
kernel.pid_max = 99999
vm.vfs_cache_pressure = 10000
vm.swappiness = 1
## 启用此交换分区的交换功能
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# swapon /home/swap 
swapon: /home/swap: insecure permissions 0644, 0600 suggested.
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# echo "/home/swap swap swap defaults    0  0" >> /etc/fstab
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# free -h 
              total        used        free      shared  buff/cache   available
Mem:            15G        3.0G         10G        576K        2.1G         12G
Swap:          1.0G          0B        1.0G
[root@iZhp3h4x7t41yl0eevhf1dZ archser]# 

删除 swap 空间

swapoff /home/swap
swapoff -a >/dev/null
rm -rf /home/swap

为啥阿里云的 swap 分区要关闭

猜测:swap 分区的作用是会用磁盘空间替代内存,当内存不够用的时候会使用磁盘空间充当内存空间,由此解决内存不够用的情况

但是会有缺点,即磁盘空间的效率肯定是比不上内存的,当前大部分的网站都要求响应速度,一般会使用高可用的集群模式,也就是说,一般情况下允许服务因内存问题导致宕机,将请求转发到其他正常的环境,但是决不允许响应速度变慢,这大概就是阿里云服务器关闭swap 分区的原因

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值