排障笔记-解决PVE中节点SWAP占用过高问题&一些关于PVE宿主硬盘的题外话


0.前言

之前部署了Jellyfin媒体服务器之后,偶然一次打开pve主节点概要界面,发现,咦,SWAP怎么都爆红了...

随后又又想起来一个问题,这硬盘刚安装上去的时候写入读取数据都在5T左右,怎么这小主机用了这点时间涨了25T读取,10T写入,再这样下去SSD岂不是很快要寄了w(゚Д゚)w

最近忙着优化权限结构和媒体下载硬链接,以及部署一些服务,到现在才着手开始解决这个问题。SWAP占用一直很高的话,PVE主硬盘会大量读取写入,很伤硬盘而且也会导致性能下降。下面来讲讲解决办法。

I.前提条件

你的PVE系统除了换源,加温度显示或者删除订阅弹窗这些不影响Linux系统本体的操作之外,没有对本体进行多余的修改

这点很重要,因为我参阅了Proxmox VE的论坛,影响Swap使用的有很多。使用第三方脚本时一定要注意对Swap的调整。

II.了解SWAP和Swappiness

以下内容从网上摘的,改了点表述,适当加了点东西,使之更加易懂。鉴于我看的网上那些文章大都是搬运,不太能找得到来源,就不标注来源了。
(中文互联网太多自动爬虫搬运资源,乱拉shit o(≧口≦)o)

关于 Swap

Swap(Swap 分区、Swap 内存),中文名是交换分区,类似于 Windows 中的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

因此,Swap 分区的作用就是牺牲硬盘,增加内存,解决 VPS 内存不够用或者爆满的问题。不过鉴于硬盘速度肯定是慢于内存,因此非必要情况下,大量地使用这个貌似不是件好事捏

Swappiness 的通俗解释

Swappiness可以用来调整系统在何时开始使用SWAP,Swappiness 可以设置为 0 到 100 之间的值。

swappiness=0: 表示最大限度使用物理内存,物理内存用满之后才用swap空间
swappiness=100: 表示积极使用swap分区,并且会把内存上的数据及时地搬运到swap空间里面
linux中该项默认值为60。也就是说,你的内存在使用到100-60=40%的时候,就会开始使用交换内存。大家知道,内存的速度会比磁盘快很多,过早地使用SWAP会加大系统IO,同时造成大量页的交换进出,严重影响系统的性能

举例: 我的笔记本电脑有 16 GB 的内存和 8 GB 的交换空间。如果我在内核参数中,swappiness设置为60,那么在使用大约 6
GB (16G*40% == 6.4G)的内存后,我的笔记本就会开始使用SWAP,这会不必要地使我的应用程序变慢。所以咱应该知道怎么改这个参数。

III.让PVE少吃点SWAP

Seems like proxmox only offers swap for lvm installs, I'm a zfs only guy so I never had the option in the installer.

根据PVE官方论坛的讨论,PVE应该是会在使用lvm文件系统进行安装的时候启用Swap,否则默认是关着的。

首先,你可以使用如下命令查看你PVE的swappiness,不出意外的话应该是linux默认的60

cat /proc/sys/vm/swappiness

因为貌似PVE计算SWAP是否使用,是看各个虚拟机占用内存的百分比,而不是整个系统的总内存占用。因此,假定Swappiness改为10,如果给虚拟机分配了8G,这个虚拟机占用了7.2G之后就会开始用SWAP,依然无法避免SWAP利用暴涨,因此内存足够建议将Swappiness改为0。

下面提供修改Swappiness的两种办法:

临时调整

在PVE终端输入如下命令

sysctl vm.swappiness=0

永久调整

用PVE自带的nano更改配置即可。

nano /etc/sysctl.conf

可能全都是注释,不要紧,翻到最下面,加一行

vm.swappiness=0

然后Ctrl + X,按Y确认更改,然后回车就保存了。最后使用sysctl -p生效配置。

接下来建议直接重启PVE使更改生效(别问我为什么用sysctl -p之后还重启,我用了之后因为没有关闭那些虚拟机导致更改生效不彻底 于是跟个傻子一样排查了很久ε(┬┬﹏┬┬)3 ,鉴于诸多因素可能都会导致更改生效不彻底,建议直接重启)。

IV.PVE论坛中的题外话

我看的那篇帖子其实是说PVE导致了一个人的NVMe硬盘寄了,由此讨论出了全套解决办法。里面有几点挺有用的

关于默认值是否合理

sysctl vm.swappiness
vm.swappiness = 60

Your sappiness value is way too high for a server, you don't need that on the hypervisor and it will reduce your drive lifespan by a lot.

其实就是说,lvm安装下启用Swap,但是默认的swappiness值其实并不适合给服务器用。不过也奇怪,PVE启用了Swap却没有对这个值做出优化...所以安装PVE的话,还是建议一开始就改一下这个值的。

关于高占用对硬盘寿命的影响

Your drive has written 223GB in 6 hours, if it continues like that the 150 TBW (lifespan) will be reached after 168 days.

这个意思大概就是,Swap占用加上其他的硬盘读写,导致6小时内产生了223GB的写入操作。如果这个状况持续下去,那硬盘厂商标称的150TBW硬盘寿命可能用168天就无了,硬盘可能会寄

所以呀,这些数据异常,还是要引起重视的哦

使用PVE对硬盘的要求

最后一点是这个

Unlike ESXi which runs quite happily from an SD card, Proxmox is writing to the host storage constantly for logs and journaling and so is not suited to running from USB or consumer SSDs

That Kingston drive is only intended for consumer use and not the sort of intensive activity it would be subject to in a proxmox server.

You're best bet is to install proxmox on a conventional hard drive and use the flash storage for hosting your containers or VM's - however, I would still be looking to buy something a little more 'professional' like a Samsung 970EVO Plus

大意就是,PVE系统对宿主硬盘还是有一定要求的,他需要向宿主硬盘存储日志等数据,平时的备份,ISO镜像默认也是在这个盘。它不像ESXi可以 愉快地在SD卡上跑来跑去 在SD卡上也能运行地还不错。所以说,用PVE还是选一些规格不是那么差的硬盘罢,致态长江存储的SSD质量都还是挺好的,其他的话,三星970EVO或者以上型号也都还不错,但是别碰金士顿,西数蓝盘(不包括本身)以下之类的产品。为什么?不妨看看这个...

糟了买到正版了 - Bilibili

虽然只是个调侃哈哈,不过有些品牌品控和质量真的不咋行地

附录 - 参考资料

  1. Proxmox crashing and killing NVMe SSDs

声明:Youwen|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 排障笔记-解决PVE中节点SWAP占用过高问题&一些关于PVE宿主硬盘的题外话


道阻且长