阿里云服务器创建swap分区,解决内存不足的问题

没想到在阿里云服务器编译ffmpeg还遇到gcc报错:

internal compiler error: Killed (program cc1plus)
Please submit a full bug report,

百度了之后,知道这是由于内存不足引起的。从阿里云官网得知:

swap的功能与相应内核参数

Linux 将物理内存分为内存段的部分被称作“页面”。交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存。物理内存和交换空间的总大小是可用的虚拟内存的总量。交换空间通常是一个磁盘分区(此分区在安装操作系统时,系统通常会默认划分出一段空间用于交换分区,默认将交换空间的大小设定为内存的1倍到2倍),也可以是一个文件。

内核参数中有一个vm.swappiness参数,此参数代表了内核对于交换空间的喜好(或厌恶)程度。Swappiness 可以有 0 到 100 的值,默认的大小通常是60,但也有的是30。设置这个参数为较低的值会减少内存的交换,从而提升一些系统上的响应度。如果内存较为充裕,则可以将vm.swappiness大小设定为30,如果内存较少,可以设定为60。如果将此数值调整的过大,可能损失内存本来能提供的性能,并增加磁盘IO消耗和CPU的消耗。

关于阿里云云主机swap功能

阿里云提供的云服务器(Elastic Compute Service,简称 ECS),是云主机的一种,当前采用的虚拟化驱动是Xen(这一点可以通过bios vendor和virtual type可以看出)。

默认情况下,阿里云云主机的swap功能是没有启用的,原因当然是通过取消swap功能可以降低磁盘IO的占用率来让用户购买更多的内存、提高磁盘寿命和性能。

阿里当前的做法是:

1.不创建swap分区,由镜像决定

2.将vm.swappiness设定为0,即永不使用swap分区

启用swap分区,确实可以降低内存的使用压力,但并不是长久之计,如果云主机上运行的应用确实需要较高的内存,建议还是购买更多的内存。

所以我们需要把交换分区的功能打开。参看https://blog.csdn.net/qq_35330699/article/details/81223765

一,创建交换区 swap

1,增加4G 大小的 swap

dd if=/dev/zero of=/var/swap bs=1024 count=4096000

if是指input file,of是output file。dev/zero是linux的一种输入设备,用来创建用于初始化的空文件,如临时交换文件,可以提供任何你需要的数目。 bs指 block size ,单位数据块block,读入/输出的块字节大小为1024 个字节,count=4096000 :数据块(block)数量为4096000 ,即4096000个1024字节(1024字节=1kb)。可以计算swap分区的容量为:4G。(dd命令里的单位M表示1024*1024,k表示1024)

2,创建 swap 文件

mkswap /var/swap

注意 mkswap 和/var/swap 之间有个空格

3,加载这个文件

swapon /var/swap

注意 swapon 和/var/swap 之间有个空格

执行以上命令可能会出现:“不安全的权限 0644,建议使用 0600”提示,其实已经激活了,可以忽略,修改权限:

chmod 0600 /var/swap

4,设置系统启动时自动挂载分区

添加到/etc/fstab

echo "/var/swap swap swap defaults 0 0" >> /etc/fstab

这里>>是追加重定向的意思。

5,查看分区大小

free -m

如果打印出   Swap:             0           0           0说明没有分区

 

二,删除 swap 分区

停止使用的分区

swapoff /var/swap

删除

rm -rf  /var/swap
 

还要再补充:

查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60

1

2

3

cat /proc/sys/vm/swappiness   

sysctl -a | grep swappiness    

sysctl -w vm.swappiness=60

注:若想永久修改,则编辑/etc/sysctl.conf文件

发现修改后果然好了很多,其他的linux服务器也适合这么干。

另一篇值得参考的文章:Linux系统swappiness参数在内存与交换分区之间优化作用,https://blog.csdn.net/lufeisan/article/details/53339991

转载如下:

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:


一般默认值都是60   

[root@timeserver ~]# cat /proc/sys/vm/swappiness
60

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

临时调整的方法如下,我们调成10:
[root@timeserver ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@timeserver ~]# cat /proc/sys/vm/swappiness
10
这只是临时调整的方法,重启后会回到默认设置的

要想永久调整的话,需要将
需要在/etc/sysctl.conf修改,加上:
[root@timeserver ~]# cat /etc/sysctl.conf

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10


激活设置

[root@timeserver ~]# sysctl -p

在linux中,可以通过修改swappiness内核参数,降低系统对swap的使用,从而提高系统的性能。


遇到的问题是这样的,新版本产品发布后,每小时对内存的使用会有一个尖峰。虽然这个峰值还远没有到达服务器的物理内存,但确发现内存使用达到峰值时系统开始使用swap。在swap的过程中系统性能会有所下降,表现为较大的服务延迟。对这种情况,可以通过调节swappiness内核参数降低系统对swap的使用,从而避免不必要的swap对性能造成的影响。


简单地说这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。


通过sysctl -q vm.swappiness可以查看参数的当前设置。


修改参数的方法是修改/etc/sysctl.conf文件,加入vm.swappiness=xxx,并重起系统。这个操作相当于是修改虚拟系统中的/proc/sys/vm/swappiness文件,将值改为XXX数值。


如果不想重启,可以通过sysctl -p动态加载/etc/sysctl.conf文件,但建议这样做之前先清空swap。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值