怎么让塞爆我服务器的服务全部正常运行

14 小时 38 分钟前
 llej

更多的服务全天候可用,更少的内存与 cpu 占用

在今年 3 月 20 号的时候,我有了一个设想:在我的那台小小的 2c2g 云服务器上跑我的所有设想,以后我分享的每篇文章,其中可能配套的一些网站服务,我的读者都可以随时去访问。

这里有一个难题,就是内存不够,我大多使用 Node 构建应用程序,一般而言一个服务的内存占用可能在 100MB 到 200MB 之间

2g 的内存只够支撑十来个服务,更别说其中有些服务,它内存占用峰值会到六七百兆,这更加限制了我的发挥,我只能时常清理掉之前萌发想法时部署的服务

于是这期间,我断断续续尝试去做这个东西。一开始是用 Node 实现的,但发现性能不是特别好,而且对于一些 socket 层面的转发,用 Node 不是很好实现。

直到最近,我终于用 AI 使用 RUST 实现了一版

类 serverless 服务管理:DynaPM

众所周知提供一个网站服务一般来说得先运行服务然后等用户访问

当我有一百个这样的服务都需要随时能让人可以访问,然后我的服务器内存也不足以容纳下这一百个服务同时运行,有什么办法可以在不增加服务器资源的情况下实现吗?

有的,兄弟有的,可以通过一层中间件来将先运行服务然后等用户访问反转变成用户来访问了再运行服务。

这种思路在程序中很常见,比如 lazy call 的懒加载思想/依赖反转。

核心思路很简单,其实就是做一个类似于网关的东西,用于动态启停实际运行的服务

由 DynaPM 监听对应端口,当请求到来时,根据 host 域名等查询配置表,判断属于哪个服务,再执行对应的服务拉起命令,等服务启动成功后,再将网络请求转发过去。

等闲置一段时间之后,再将服务 kill 掉。

所有服务启动跟关停的命令都是可自定义的,所以的话甚至于说可以用它来管理 Docker 服务,也就是任意的服务都可以使用它来进行管理

服务的冷启动时间只取决于服务本身,网关增加的耗时应该在只在几个毫秒

实际效果

像我这种开发者,我的服务可能并不是同时有那么多人访问,他们可能都是分散着时间段去访问不同的服务。也就是真正同时需要启动的服务可能是很少的

下面是我服务器过去 24 小时的一个实机运行的数据

从图中可以看到,大部分情况下同一时刻需要维持的服务可能只有两三个而已,使用 DynaPM 之后,我服务器的常态内存占用从 1G 多降低到了 550 兆,并且 CPU 的负载也降低了许多,之前可能常态在 5% 上下波动,现在能够降到 3%

代价是什么?

代价就是我访问服务的冷启动时间平均会延迟到 2 秒左右,这个主要看服务自身启动速度。我有一些 Rust 服务延迟是在 200 毫秒左右,基本上是用户无感知的。

更奇妙的想法

基于这个特性,我想到作为前端开发者,本地常挂着多个前端项目的开发,非常吃内存,且有些服务需要时不时手动运行。

如果改用这个管理,是不是就不需要手动启动服务了?

想要用的时候自然可用,平时也不会一直占用本地开发机内存,导致居高不下。

于是想想做就做,很快啊,也实现了。

用起来也是非常棒的,以后调试项目时,我能直接通过 dynapm 面板点击进入,并具备类似 portless 的特性。

这样我就不需要再记端口号,只需记住服务名,直接浏览器打开 项目名.localhost 即可访问 🎉


今天尝试了一下 dynapm.localhost 这种动态启停服务+portless 的特性 在 dev server 用起来真的很爽,再也不需要去对应项目执行 pnpm dev 了

此致,敬礼

1299 次点击
所在节点    分享创造
8 条回复
aimuz
14 小时 19 分钟前
llej
13 小时 34 分钟前
@aimuz 我不知道, 做之前问了 ai ,也没发现 🥹
Cruzz
13 小时 26 分钟前
买机器不就行了么,搞个大陆优化的入口。美国 vps 便宜的要死。6 核 12G 一个月 7 刀。
freemoon
11 小时 42 分钟前
@Cruzz 你发链接啊
Cruzz
10 小时 21 分钟前
slowgen
9 小时 46 分钟前
llej
9 小时 40 分钟前
@slowgen 要是早知道他,我可能就不会做这个了🥹
mephisto
8 小时 39 分钟前
我个人觉得,与其花时间做这种按需启动,节约一点点成本,还不如想办法提升每个服务的价值,不是靠量取胜的。等服务器成本真正占大头,自然会想办法处理。我现在做了好几个服务,一个丐版主机跑绰绰有余,问题是用户不多,不赚钱。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1255477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX