幻兽帕鲁私人服务器自动运维

幻兽帕鲁让我如此庆幸我是个程序员 —— 幻兽帕鲁私人服务器自动运维

开篇先上所有命令,方便不喜欢墨迹的筒子,如果你不关心细节的话,就 ssh 登陆你的机器直接执行就行了。

先参考这篇文章:幻兽帕鲁一键开私服?超简单的小白教程!(附服务器更新方式)-腾讯云开发者社区-腾讯云 (tencent.com),then:

$ git clone https://github.com/TangBean/PalWorld-Scripts.git
$ cd PalWorld-Scripts
$ ./install.sh  # 如果你已经安装了 pal-server,可以忽略这步
$ ./zram.sh
$ ./auto_runner.sh

# 2 Validation: 能看到这仨 cronjob 就说明好了
$ crontab -l
* * * * * /bin/bash /home/ubuntu/PalWorld-Scripts/restart.sh >> /tmp/pal-restart.log 2>&1
0 4 * * * /bin/bash /home/ubuntu/PalWorld-Scripts/update.sh >> /tmp/pal-update.log 2>&1
0 3 * * * /bin/bash /home/ubuntu/PalWorld-Scripts/backup.sh >> /tmp/pal-backup.log 2>&1

# 3 查看日志
$ less /tmp/pal-restart.log  # 重启日志
$ less /tmp/pal-update.log   # 更新日志
$ less /tmp/pal-backup.log   # 备份日志

# 4 备份地址
$ ls /home/ubuntu/.steam/palback

Github 地址:

Github - PalWorld-Scripts

1 前言:充满废话的前言

因为想吐的槽很多,所以写了个毫无干货但又很长的前言,如果你对看废话没有任何兴趣,可以直接跳转 Section 2,简单来说,这个前言主要是在碎碎念为啥我要开始折腾帕鲁私服优化这件事情 (=。。=)

最近最火的游戏莫过于幻兽帕鲁了,什么 “10 天狂赚 13 亿”,“在线人数峰值突破 210 万人”,甚至大家戏称这是 4399 缝合怪,But,U1S1,缝的是真不错。成功的向大家证明了,只要给了打工人资本,他们可以比资本家还资本家 =。=

然鹅,这个类型的游戏果然还是联机最爽,携带高级帕鲁球若干,捕捉好友二三,技能点全点 “负重” 和 “工作速度”,互相奴役,共同建设美丽新世界。
在这里插入图片描述

想要实现这个愿望,云服务整个服务器是逃不过了,我试过用本地电脑作为服务器的方案,即便本地电脑性能是妥妥 OK 的(64G 大内存搭配 3090 的近顶配存在),但是!带宽速度十分堪忧,联机效果就是你往前走 3 步就会回退 1 步,好不容易刚爬上去的墙,下一秒给你同步下数据进度,你就掉下来白爬了。。。

以上皆是亲身体验,当我第 10 次从墙上掉下来时,我只想说,莫挨老子,老子要整个私服!So,不得已只好掏点银子,买服务器吧 =。=

首先,现在这些云服务器厂商很卷的,以阿里云和腾讯云为首,皆为 PalWorld 搞了专属优惠,甚至官方教程完美的一匹,那是手把手一步一步教啊,就怕技术小白有一丢丢疑问不付钱了。PalWorld 官方推荐的游戏服务器最低配置是 4 核 16G,所以各大云服务厂商最低的套餐配置也基本是这个,拿腾讯云举个例子:
在这里插入图片描述

看着是不是很诱人!一个月 32 就可以爽玩!但是不要被他便宜的外表所迷惑,看到 “产品首单优惠” 的红标了么?这个 discount,不是人人都有滴,是只有新人才有的,而估计大多数程序员基本都是云服务白嫖老混子,这几家云厂商的新人福利怕是早就给薅完了。而且这个优惠呀,最多只能买 3 个月,3 个月后没玩爽想续费,那么价格将会变成这个样子:
在这里插入图片描述

这价格真是高昂的让我只想说一句打扰了,是我不配。

其实如果只是需要一个新人账户,还是可以操作一下的,比如借用一下爸妈的身份证手机号呀,实在不行你 产品经理/运营/UED/… 的也行啊,反正他们又用不着嘛,大好羊毛你不撸我来帮你撸,不要浪费嘛,倒时候需求给人家加个急嘛。

然鹅,这个新人账户也只能 4核16G 的买仨月啊,三个月一过,价格可就变成原来的 13.4375 倍了,而保守估计这个游戏 3 个月我是打不腻的,保守估计下也得个 6 - 12 个月吧。所以在一顿狂翻腾讯云的新人 discount 后,我找到了新的目标,4核8G 按年售卖的老铁,646 RMB / 15个月,平均 43.07 RMB 一个月,对比上面的 430,至少到能接受的范围内,而且不就是 646 么,比 648 还便宜 2 块呢,想想你给米忽悠送钱的时候,那决策速度可不是这样的,而且这 646,你还可以和你抓来的二三人形帕鲁 share,还是很便宜的。
在这里插入图片描述

但是,根据 Pal 官方的推荐配置,最低内存推荐 16G 起步(看起来官方对于自己的优化做的咋样还是有点数的),所以问题变成了,如果我就 2-3 个人一起玩,我整个 8G 内存的私服到底行不行!
在这里插入图片描述

讲了这么多终于到达本节的重点,就是为了解释说明一下我为啥要开始折腾这个帕鲁服务器优化,理由甚是简单,因为穷啊!为了让这个 4核8G 凑合凑合能用啊!考虑到上方提到的 16G 服务器的价格,我实在是讲不出那句经典名言 “不是 16G 的服务器买不起,而是 8G 的更有性价比”,我要是有那钱还在这给你整这花活。。。

So,接下来正片开始,看看为了让这个 8G 内存的宝宝少让它的主人操点心,我都干了点啥。

2 服务器优化篇

先来介绍一下我们的优化核心思想,其实官方优化做的不好这个事儿我们也没啥整儿,大概率是你搞了一溜十三招,然后啥用没有,做过系统优化同服务端筒子都懂,那些能带了巨大性能提升的大招,绝对都是又发现了一个什么陈年 bug。

所以,那就转变思路,参考故障恢复的精髓,你可以挂,只要你恢复的快就行。

但在讲如何优化前,你先需要有一个帕鲁私服,所以我们就先用较短的篇幅来介绍下,自己的帕鲁私人服务器该咋搭。

2.1 如何搭建自己的帕鲁私服

如果你就只是想配置一个台能工作的服务器,不想知道任何额外的奇怪知识的话,按这个文档一步一步操作:

如果你想使用本篇文章提供的脚本,服务器请选择安装 Ubuntu 系统,非 Linux 系统我实在是爱莫能助,因为俺也不会 =。=

参考这个文档可以只做完前两步,即 “第一步:购买服务器” 和 “第二步:配置服务器”,然后你可以点击上面蓝色的 “登陆” Button,ssh 登陆到你的 instance 上,通过本文提供的脚本完成后续安装以及自动化优化 & 运维操作。

为了方便大家使用,我已经将所有会用到的脚本都放到了 Github 上,大家可以 ssh 登陆服务器,直接把这个项目 clone 下来,后续我又发现了什么新的好东西,也会更新到这个项目中。

# 5 任意目录下 clone 项目 (第一次 pull)
$ git clone https://github.com/TangBean/PalWorld-Scripts.git
$ cd PalWorld-Scripts

# 6 后续更新新的 changes
## 6.1 先把之前所有的修改都废弃掉
$ git stash
## 6.2 直接 force 拉取 remote 的最新代码
$ git pull origin main -f
## 6.3 再给所有 sh 脚本都加一次执行权限
$ chmod +x *.sh

安装脚本只需运行 install.sh 脚本即可,推荐运行后一种,后一种会给你的服务器安装上 ZRAM,它会通过一些对性能影响不大的压缩算法,你对内存进行一定程度的压缩,很适合帮助一些物理内存不大的机器增加可用内存(关于 ZRAM 是什么,文章末的附录中提供了一个简短的介绍,有兴趣可以拉到最后看看)。

# 7 Only install
$ ./install.sh 

# 8 Install & Enable zram & Enable auto restart
$ ./install.sh --enable-zram

当然如果你开始的时候没有打开 --enable-zram 开关,然后想后面再打开的话也很简单,Run 下 zram.sh 脚本就行,我已经把这部分独立出来了。

./zram.sh

[!NOTE]
大家喜欢的话也请给个 Star,有任何问题直接留 issue 就行,你们的 Star 是我继续折腾的动力。

2.2 自动化运维 & 优化

脚本周期执行器

直接运行:

$ ./auto_runner.sh

Done.

那么这个脚本里都干了啥了呢?其实就是帮你起了 3 个 cron job:

# auto_runner.sh

# 如果你想修改 restart/update/backup 的运行周期的话,直接在这里改对应文件的 --period 参数
# 然后通过 crontab -r 命令停掉所有 cron job,再次运行 ./auto_runner.sh 重新启动 cron job 即可

sh ./auto_executor.sh --script_name=restart --period="* * * * *" # 一分钟执行一次重启服务检查脚本
sh ./auto_executor.sh --script_name=update --period="0 4 * * *"  # 每天凌晨 4 点更新下 Pal 服务
sh ./auto_executor.sh --script_name=backup --period="0 3 * * *"  # 每天凌晨 3 点备份一下当天的存档

关于起 cron job 部分的实现,都放到 auto_executor.sh 脚本中了,auto_executor 脚本支持两个参数:

  • --script_name:你要周期运行的脚本文件名
  • --period:你要配置的运行周期

auto_executor.sh 会按照你传入的 --period 周期运行 --script_name 传入的脚本,并将运行日志写入 "/tmp/pal-$script_name.log"

# auto_executor.sh

log_file="/tmp/pal-$script_name.log"

cron_job="$period /bin/bash $script_name >> $log_file 2>&1"
if ! crontab -l | grep -Fq "$script_name"; then
    (crontab -l 2>/dev/null; echo "$cron_job") | crontab -
fi

而 restart,update,backup 的逻辑则分别在 restart.sh, update.sh, backup.sh 三个不同的脚本中,通过 auto_executor.sh 来调用它们。

画个图的话,它们之间的调用关系是这样的:
在这里插入图片描述

接下来再分别简单介绍下这 3 个真正干活的脚本的实现。

restart.sh

脚本的核心逻辑如下:

service_name="pal-server.service"
mem_threshold=90  # 内存利用率百分比,超过这个百分比就会重启 pal-server

mem_usage_percent=$(free | awk '/Mem:/ {printf("%.0f", $3/$2 * 100.0)}')
#echo "System Memory Usage: $mem_usage_percent%"

current_time=$(date +"%Y-%m-%d %H:%M:%S")
if [ "$mem_usage_percent" -ge "$mem_threshold" ]; then
    # shellcheck disable=SC2028
    echo "\n[$current_time] Memory usage is above $mem_threshold%, reached $mem_usage_percent%. Restarting service: $service_name..."
    sudo systemctl restart "$service_name"
fi

这个脚本的运行周期是一分钟一次(如果你想修改的话,可以去前面提到的 auto_runner.sh 中进行修改)。

它会每分钟检查一下当前服务器的内存使用率,如果超过 mem_threshold 设置的值,就通过 systemctl restart 重启 Pal 服务端服务。

一旦内存占用率过高,就会触发自动重启 Pal 服务端,从玩家的角度来看,就是会立刻掉线,但是由于服务会很快被重启好,所以只要再次加入服务器就可以继续玩耍了。

而如果等待服务器彻底 OOM,这个时候连 ssh 都登陆不进去,只能通过重启整个 instance 的方式来恢复,这就不是几秒钟能恢复的了,目前我自己测试下来是需要 3-5 min 的。而通过这个脚本,我们可以在 instance 彻底死透前重启 pal-server,至少可以在秒级别内将服务恢复回来。

update.sh

自动化运维其实就关心两个事情:更新和备份,这俩都是天极执行就 OK,当然你要是想备份的更勤快点也可以自己去改 auto_runner.sh 中 backup 对应的 period 参数。

更新脚本异常简单,就是每天跑一次 Pal 官方提供的更新命令:sudo -u $steam_user $steamcmd_path +login anonymous +app_update 2394010 validate +quit,再通过 systemctl restart 重启下服务而已。

backup.sh

备份脚本也非常简单,就是把 pal-server 中的存档文件 copy 出来,然后压缩一下保存在备份目录下,并记得清理删除一下超过 15 天的备份文件。更详细的实现可以去 Github 里面看。

3 后记:最后的碎碎念

OK,以上就是全部内容了,反正我这些天是一直帕鲁的不易乐乎,我猜可能是因为,每个人都有一颗当资本家的心吧,现实生活中太难实现了,那么就在游戏世界中实现吧 =。=

PS. 就喜欢这种稀有还吃的少的打工人:
在这里插入图片描述

PPS. 有了服务器是真的爽呀,你可以电脑上爽,Steam Deck 上爽,睡前 PalWorld 打工 30min,然后美滋滋睡觉,做梦都是继续在 PalWorld 研究那个帕鲁为啥不干活呢。
在这里插入图片描述

4 附录

ZRAM 是什么?

ZRAM,以前称为 compcache,是一种 Linux 内核的功能,它提供了一种虚拟的压缩内存来增加系统的可用内存。其目的是通过在内存中存储压缩数据来提高系统的性能,尤其是在物理内存较少的系统上。

ZRAM 的作用
  1. 增加可用内存:通过压缩存储在 RAM 中的数据,ZRAM 允许系统存储更多的信息,从而增加了可用内存。这对于内存较小的设备特别有用,如嵌入式设备和老旧的计算机。
  2. 减少交换操作:当系统的物理内存用尽时,Linux 通常会使用交换分区(或交换文件),将内存中的数据移到硬盘上以释放内存。由于硬盘(尤其是机械硬盘)的读写速度远低于 RAM,这会导致系统性能下降。ZRAM 可以减少对交换分区的依赖,因为它允许通过压缩内存中的数据来释放空间,而不是将数据移动到硬盘上。
  3. 提高系统响应速度:在内存压力较大的情况下,使用 ZRAM 可以避免或减少对物理交换空间的需求,从而减少了因访问硬盘而产生的延迟,提高了系统的响应速度。
ZRAM 的工作原理
  1. 创建压缩块设备:ZRAM 首先在系统内存中创建一个或多个压缩的块设备。这些设备实际上是虚拟的,它们使用内存来存储数据,但以块设备的形式对外表现。
  2. 数据压缩:当系统向 ZRAM 设备写入数据时,数据会先被压缩,然后存储在内存中的某个位置。这允许存储的数据量超过物理内存的实际大小。
  3. 使用算法进行压缩:ZRAM 使用各种压缩算法(如 LZO、LZ4)来压缩和解压缩数据。这些算法在压缩率和速度之间做平衡,以确保既不牺牲太多性能,又能有效地节约内存空间。
  4. 内存分配:当系统需要更多内存时(例如,当所有物理内存都在使用中),它可以使用 ZRAM 设备中的压缩内存,这减少了对交换分区的需求。

通过这种方式,ZRAM 提供了一种有效的机制来增加可用内存,特别是在物理内存受限的系统上,从而提高了整体性能和系统响应速度。

5 References

  1. TangBean/PalWorld-Scripts: PalWorld commonly used scripts (github.com)
  2. 幻兽帕鲁一键开私服?超简单的小白教程!(附服务器更新方式)-腾讯云开发者社区-腾讯云 (tencent.com)
  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值