什么语言/架构在容器、云主机这样资源紧张的平台中效率比较高?

2019-12-18 17:26:29 +08:00
 CrazyBoyFeng

假设就以 CRUD 管理系统(使用 SQLite 数据库)和爬虫两种应用来讨论,运行环境是小内存小 CPU 的云容器、低配 VPS 之类的环境。

那么这种资源紧张的条件下,用什么语言 /架构能发挥最大性能?

这个问题等同于:同样的工作效率,谁的资源占用更低?

提出这个问题的原因主要是为了省钱。。。

首先排除 Java 和 JVM 系所有方言,包括不限于 Scala、Kotlin

5664 次点击
所在节点    程序员
66 条回复
wsseo
2019-12-19 15:53:40 +08:00
有些时候是公司指标,老板硬要压缩云服务成本,这个跟招人是分开的。
janus77
2019-12-19 16:10:12 +08:00
我不懂后端,我想问一聚,go 的占用真的很低吗?一直以来都听说其优点是速度快高并发开发简洁之类的,对于其运行占用,也只有理论上的寥寥几句,有实际使用的数据结论吗?
abcbuzhiming
2019-12-19 16:45:47 +08:00
@janus77
https://www.v2ex.com/t/587073
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go.html

没有虚拟机的语言在内存占用上确实很低,大部分时候都如此,当然,在 CPU 的占用上就未必
sagaxu
2019-12-19 16:57:13 +08:00
@abcbuzhiming 500M 是日请求百万的服务。低频服务,一个 100M 也够了。一个中级开发一年的成本,少说也能买 200 个 4G 内存的 vps,还不够便宜吗?
@janus77 跟应用类型有关,我对比过的那个服务,Java 消耗内存大概是 Go 的 2 倍。
lihongjie0209
2019-12-19 17:05:44 +08:00
当然是机器语言效率最高, 开发效率最低
其次汇编
然后 C
然后 C++
然后 go 之类的
laminux29
2019-12-19 17:12:10 +08:00
如果追求效率与资源使用率,建议还是 C++内嵌汇编,同时在写代码的时候以汇编为主。

毕竟机器编译不如程序员对业务的理解度高。
CrazyBoyFeng
2019-12-19 17:18:18 +08:00
楼上给的 benchmarksgame 这个网站很好很直观。
其中我发现 Rust 的性能更加优异,不过 Rust 似乎也比较复杂,用来写简单的 Web 应用可能会有点难受。
dbskcnc
2019-12-19 17:24:17 +08:00
go 值得拥有,工程语言的好处就是实施方便,人力,物力,效力相对均衡
attackingmilo
2019-12-19 17:35:26 +08:00
.net core 值得拥有,兼顾性能和效率
sessionreckon
2019-12-19 18:08:42 +08:00
Java 占用内存高不能强制指定一下内存么....
起个服务指定一下最大堆大小,能跑就跑,不能跑就 GC 一下
如果本身服务没有常驻内存的词典 /资源,一两百 M 一样能跑的很好
资源文件很大的情况下,那 Go 和 Java 相比也就好那么一点点

另外要求单机跑多个服务本来就很奇怪,单机部署应该尽可能少的服务,避免相互影响
要是流量很大需要多机部署,name 单机尽可能支持更高的 QPS,用更少的机器支撑当前的总 QPS
CrazyBoyFeng
2019-12-19 19:03:40 +08:00
@sessionreckon
Java 服务启动后,能占这么大内存,一般是 JVM 为了优化就需要调度这么大内存。JVM 的优化非常杰出,这是 Java 性能强劲的最主要因素。如果强行限制,那效果自然大打折扣。指定个堆上限再频繁 GC 可以想见那效率有多低。
同样功能的应用,Java 肯定是会比其它平台更耗费内存的,因为要额外运行 JVM 对运行时内存进行优化和调度。
上面也没有说多实例跑在一个环境里,为了安全和可靠性当然要隔离,但一个 node 就跑一个应用也太浪费了点。事实上常规的使用方式是跑多个容器。不过自己弄服务器还是比较麻烦的,成本也不低。而现在更普遍的方式是使用云容器,按需购买资源。
可能很多人还是不理解题目的需求。要是只有几个实例,那根本犯不着对资源敏感。
CrazyBoyFeng
2019-12-19 19:07:35 +08:00
@oyjc @attackingmilo
我看到你们都推荐.Net ,但是据我所知,它也跟 Java 类似是跑在虚拟机里的。只是不知道它的虚拟机是否像 JVM 那样有较大的开销。
blackboom
2019-12-19 19:17:42 +08:00
Java 确实吃内存,目前的解决方案有 Graalvm 和 Openj9,Graalvm Spring 的支持还不完善,我们是混着 70%Java 和 30%Go
Cbdy
2019-12-19 19:23:03 +08:00
这不是废话吗,C 语言
MeteorCat
2019-12-19 19:23:48 +08:00
最好是汇编吧,我推荐 rust
fengbjhqs
2019-12-19 19:28:44 +08:00
js 或许有一席之地,可能性能没有那么好,但开发效率和性能感觉是比较平衡的
sagaxu
2019-12-19 19:34:34 +08:00
@CrazyBoyFeng 不要迷信 JVM 的默认参数,我测过一个服务,不加参数时内存占用超过 20G,xmx2g 的时候,内存只用了 3g,gc 频率高了近 10 倍,但 cpu 占用率却相差不大,业务技术指标基本没有差异。即使用 xmx1g 去跑的时候,平均响应时间和吞吐跟占 20 多 g 的时候差不多,只不过响应最慢的 10%的请求延迟略有增长。

JVM 的默认策略,只要跑的时间够久,100G 内存的服务器,也会给你用掉 50G 以上,哪怕跟限定只用 1g 时没有任何性能差别。

GO 的 gc 策略更加激进,会定期主动 gc,不会出现这种往死里用的情况。跟只增不减的比,峰值占用肯定会低多。

而且不限定 xmx 的时候,容易让 os 把该 gc 掉的内存放到 swap 中,一旦触发 gc,会因为 swap 的 IO 导致 JVM 卡顿数十秒甚至数分钟,可以按照每 1G swap 要 10 秒钟粗略估算。

任何 JAVA 服务,都必须指定 xmx。
xuanbg
2019-12-19 20:20:55 +08:00
我的 Redis 容器,内存只用了 8M,你没看错,就是 8M 不是 8G。然后其他基于 Java 语言的容器,没有一个内存在 300M 以下的。
windyland
2019-12-19 20:30:49 +08:00
恕我直言,为什么不买个高性能机器放本地然后云服务器 frp 反向代理
windyland
2019-12-19 20:33:35 +08:00
国内云服务器在只走内网的时候性价比还是相当高的

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

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

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

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

© 2021 V2EX