Linux VPS主机设置swap分区以及内存分配控制优化swappiness配置

Linux系统一般都需要配置一点swap分区,桌面配置多一点,服务器配置少一点。而对于swap分区的具体使用细节,由一个叫swappiness参数来控制。 如果内存够大,那么这个时候应该让 linux 不必太多的使用swap分区, 可以通过修改swappiness的数值。

swappiness为0的时候表示最大限度使用物理内存,然后才是 swap空间,当swappines为100的时候,则表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。在CentOS、Red Hat、ubuntu等系统中,swappiness的默认值都为60。

如果Linux服务器的内存很小,那么可以不用更改这个值,因为毕竟考虑到内存不够用而去借用swap的情况。而相对于很多服务器来说,目前还是建议设置在值为25以下,如果超过了8G内存,而且目前内存使用量还有剩余的话,建议直接将swappiness改成0,这样可以最大限度的使用物理内存,减少硬盘的负载,同时加快速度。

Linux VPS主机设置swap分区以及内存分配控制优化swappiness参数配置

这篇文章就来分享一下如何给自己的Linux VPS主机设置Swap交换分区,以及如何优化Linux内存和Swap分区的分配关系,更多的关于服务器性能优化的文章,请看(关于挖站否的优化必得,这里有汇总:网站与服务器优化方法总结):

  1. 网站启用WebP格式图片-PHP和Nginx转化WebP格式和自适应浏览器
  2. 网站优化加速-开启TLSV1.3和Brotli压缩-Oneinstack,LNMP,宝塔面板
  3. WordPress开启Nginx fastcgi_cache缓存加速方法-Nginx配置实例

一、VPS设置swap空间

1.1 swap要多大?

综合网上的相关资料,一般来说2GB的内存的VPS至少要2GB的Swap空间, 相关的参考如下:

物理内存	交换分区(SWAP)
<= 4G	     至少4G
4~16G	     至少8G
16G~64G	     至少16G
64G~256G     至少32G

1.2 创建swap分区

Linux VPS主机设置swap空间的基本命令如下:

#查看swap分区的大小
free -h 

#删除所有SWAP分区
swapoff -a

#创建swap分区的文件,其中bs是每块的大小,count是块的数量,bs*count,就是swap文件的大小了,这里就是1M*2048=2G 
dd if=/dev/zero of=/root/swapfile bs=1M count=2048

#格式化交换分区文件: 
mkswap /root/swapfile

#启用swap分区文件: 
swapon /root/swapfile

#添加开机启动,修改 /etc/fstab 这个文件,添加或者修改这一行:

/root/swapfile swap swap defaults 0 0 #适用于redhat或centos系统
/root/swapfile none swap sw  0 0  #适用于Ubuntu系统

#或者直接执行以下命令写入/etc/fstab

echo "/root/swapfile swap swap defaults 0 0" >>/etc/fstab #适用于redhat或centos系统
echo "/root/swapfile none swap sw  0 0" >>/etc/fstab  #适用于Ubuntu系统

二、Linux真实使用内存

Linux的内存管理机制与Windows有所不同,linux系统中,是进程优先使用内存,而不是磁盘,这样会加快读取速度。当有新的进程启动时,再从内存中开辟出一定空间,为新的进程所用。即使进程退出,也不会立刻从内存中清理掉,这样可以加快下次启动进程的速度,所以内存一直是使用率很高的。那么如何查看Linux真实使用内存?

2.1 命令查看

执行命令:free -h可以查看Linux VPS主机的内存使用情况:

root@localhost:~# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G        1.3G        382M        106M        280M        416M
Swap:          2.7G        146M        2.5G

Linux VPS主机真实内存占用到底是多少呢?用 free 指令查看一下输出,用 used 减去 buffer 和 cache,才是你运行中的程序所占用的空间。

如上面的例子:使用了4G的内存,3.7G被占用,但是buuffer和cached部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的,即真实内存=1.3G-0.28G

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。

2.2 工具查看

Linux系统监控命令整理汇总一文中我们分享了htop这个高级监控命令,它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。其中内存一栏绿色的就表示是真实的占用内存了。

Linux真实使用内存

我们也可以使用PHP探针来查看Linux主机真实使用内存,例如免费开源PHP探针x-prober

Linux真实使用内存探针内存

三、Linux内存分配控制

3.1 swappiness参数

swappiness是Linux的一个内核参数,控制系统在进行swap时,内存使用的相对权重。swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间。

swappiness参数设置大小

Ubuntu系统swappiness默认值为60,表示的含义可以这样来理解,当剩余物理内存低于40%(40=100-60)时,开始使用swap分区。CentOS系统此参数的默认值是30。设置为100可能会影响整体性能,如果内存充足,就可以将这个值设置很低,甚至为0,以避免系统进行swap而影响性能。

3.2 swappiness=0 ?

我们都知道,Linux的进程使用的内存分为2种:

1.file-backed pages(有文件背景的页面,比如代码段、比如read/write方法读写的文件、比如mmap读写的文件,它们有对应的硬盘文件,因此如果要交换,可以直接和硬盘对应的文件进行交换;比如读取一个文件,没有关闭,也没有修改,交换时,就可以将这个文件直接放回硬盘,代码处理其实就是删除这部分内容,只保留一个索引,让系统知道这个文件还处于打开状态,只是它的内容不在内存,还在硬盘上),此部分页面叫做page cache;

2.anonymous pages(匿名页,如stack,heap,CoW后的数据段等;他们没有对应的硬盘文件,因此如果要交换,只能交换到swap分区),此部分页面,如果系统内存不充分,可以被swap到swapfile或者硬盘的swap分区。

因此,Linux在进行内存回收(memory reclaim)的时候,实际上可以从1类和2类这两种页面里面进行回收,而swappiness值就决定了回收这2类页面的优先级。swappiness越大,越倾向于回收匿名页;swappiness越小,越倾向于回收file-backed的页面。当然,它们的回收方法都是一样的LRU算法。

swappiness参数内存回收

在Linux的早期版本(2012年以前的版本,kernel 3.5-rc1),哪怕swappiness被设置为0,其实匿名页仍然有被交换出去的机会。2012年开始,这个细节有了变化。https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fe35004fbf9eaf67482b074a2e032abb9c89b1dd

swappiness参数内存控制

如果swappiness=0,除非系统的内存过小(nr_free + nr_filebacked < high watermark)这种恶劣情况发生,都只是考虑交换file-backed的pages,就不会考虑交换匿名页了。

swappiness参数内存占用

于是现在的swappiness如果等于0的话,意味着哪怕匿名页占据的内存很大,哪怕swap分区还有很多的剩余空间,除非恶劣情况发生,都不会交换匿名页,因此这可能造成更大的OOM(Out Of Memory)压力。不像以前,平时会一直兼顾着回收page cache和匿名页。所以,现在如果想将swappiness设置为0,那是要好好想想的了。

3.3 swappiness设置

如何查看系统当前的swappiness值?命令如下(数值为60,表示你的内存在使用到100-60=40%的时候,就开始出现有Swap交换分区的使用):

cat /proc/sys/vm/swappiness
#60

如何配置swappiness值?使用以下命令可以设置swappiness值:

#临时性修改: 
sudo sysctl vm.swappiness=10 

#永久性修改: 
#在/etc/sysctl.conf 文件里添加如下参数: 
vm.swappiness=10 

#然后重启系统

四、总结

对于Linux,无论是多大内存,还是要设立Swap交换分区,这样特别有利于在内存耗尽时及时启用Swap空间。我们经常看到Linux的内存占用达到90%以上,这是因为Linux的内存管理机制与Windows有所不同,实际使用内存还是比较小的。

一般来说swappiness设置在10-20之间,这个需要根据你自己的网站的业务需要。例如想要尽量保持稳定的话,可以把swappiness的数值调高,想要加快读取速度可以把swappiness设置得低一些,不建议把swappiness设置为0,容易造成进程崩溃。

文章出自:挖站否 https://wzfou.com/swap-ram/,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。部分内容参考自maixj.net


分享到:
Avatar for Qi
关于站长(Qi),2008年开始混迹于免费资源圈中,有幸结识了不少的草根站长。之后自己摸爬滚打潜心学习Web服务器、VPS、域名等,兴趣广泛,杂而不精,但愿将自己经验与心得分享出来与大家共勉。
已有 11 条评论
  1. Avatar for jackdoll003 jackdoll003

    昨天百度了好久,要解决swap占用高的问题,都没看到这页文章,搜索的结果大部分是CSDN的文章

    2021年2月8日 14:32 回复
    • Avatar for Qi Qi

      换gg就好了。

      2021年2月8日 16:16 回复
  2. swap空间利用好,发挥VPS最大性能。1G VPS建站够了

    2019年11月21日 21:45来自新浪微博 回复
    • Avatar for Qi Qi

      是的,硬盘速度也要快。

      2019年11月23日 10:26 回复
  3. Avatar for ︶﹋微忧少年 ︶﹋微忧少年

    你好,麻烦帮忙开一下Railgun
    sqjun.com
    daimafengzi.com
    fengzidaima.com
    感谢!感谢。另一个帖子发送了回复。但是您没回复啊!

    2019年11月19日 14:10来自QQ 回复
    • Avatar for Qi Qi

      已经回复,并添加,感谢支持。

      2019年11月23日 10:27 回复
      • Avatar for ︶﹋微忧少年 ︶﹋微忧少年

        今天才发现,感恩感恩!!

        2019年11月27日 14:33来自QQ 回复
  4. 学习学习。[威武]

    2019年11月19日 06:28 回复
  5. 学习一下,我买的机子很少没有自带swap空间的。

    2019年11月19日 01:03 回复
    • Avatar for Qi Qi

      是的,一般会自动创建。

      2019年11月23日 10:28 回复
  6. Avatar for 浮游 浮游

    很实用的文章,对swap内存原理不太懂,看了获益匪浅

    2019年11月18日 22:21来自移动端 回复

Login

Welcome! Login in to your account

Remember me Lost your password?

Don't have account. Register

Lost Password

Register