什么语言/架构在容器、云主机这样资源紧张的平台中效率比较高? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
CrazyBoyFeng
V2EX    程序员

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

  •   CrazyBoyFeng 2019-12-18 17:26:29 +08:00 6090 次点击
    这是一个创建于 2131 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    第 1 条附言    2019-12-19 14:05:32 +08:00
    可能有人质疑换架构的人力成本比不上机器省下来的钱。不过考虑到产品的简易程度,也没打算重新招人,(甚至其中很多项目都是我一个人写的)。而且提出这种问题,显然要运行的实例不止一个。实例越来越多的情况下,运营成本就很可观了。
    66 条回复    2019-12-20 15:11:50 +08:00
    seansong
        1
    seansong  
       2019-12-18 17:28:45 +08:00
    难道不是取决于你的编码能力跟习惯?
    sagaxu
        2
    sagaxu  
       2019-12-18 17:29:41 +08:00 via Android
    C++或 Rust
    BlackBerry999
        3
    BlackBerry999  
       2019-12-18 17:31:59 +08:00
    go
    cezhang
        4
    cezhang  
       2019-12-18 17:32:13 +08:00
    HLA
    lc7029
        5
    lc7029  
       2019-12-18 17:34:38 +08:00
    C 或汇编
    oahebky
        6
    oahebky  
       2019-12-18 17:37:16 +08:00
    难道不是先开发出来再考虑优化效率吗?
    fanzheng
        7
    fanzheng  
       2019-12-18 17:38:27 +08:00
    易开发性和资源占用平衡的话,肯定是 golang。
    eason1874
        8
    eason1874  
       2019-12-18 17:38:45 +08:00
    脱离业务谈架构没有意义,爬虫也分很多种啊,抓纯文本数据和解析 JS 那可就差得远了。

    但无论如何,选最流行的一定是综合成本最低的,具体还是得看代码。
    nicevar
        9
    nicevar  
       2019-12-18 17:45:19 +08:00
    肯定是世界上最好的语言 PHP,不是开玩笑
    jin7
        10
    jin7  
       2019-12-18 18:23:38 +08:00
    反正不想写 php 了
    lbp0200
        11
    lbp0200  
       2019-12-18 18:28:41 +08:00
    golang>lua>rust>c++>c
    lbp0200
        12
    lbp0200  
       2019-12-18 18:31:00 +08:00
    忘记 D 语言了,放在 lua 后面
    prondtoo
        13
    prondtoo  
       2019-12-18 18:47:52 +08:00
    想省钱直接上云厂商的 Serverless,跟语言没关系。
    CrazyBoyFeng
        14
    CrazyBoyFeng  
    OP
       2019-12-18 20:59:34 +08:00
    感谢所有人的提议。我大致了解了一下,最后选择了 Golang,以下是我的看法:

    Golang 代码简洁,开发效率高。
    实现具体功能也许没有 Python 的调用方便,但是后者占用内存和 CPU 不太理想。
    Golang 调用库比 C、C++方便得多。而且 C 系需要手动操作内存,增加了代码的复杂度,可维护性差,易产生缺陷。开发和再开发的时间可能会要多耗费一些。而 CPU 占用和内存占用,Golang 和 C 也差不太远。
    至于 Golang 与 PHP 的比较,我看网上的比较都是 Go 的兼容性、扩展性、性能、资源占用更胜出一些。
    汇编就算了,杀鸡用牛刀。
    psirnull
        15
    psirnull  
       2019-12-18 21:01:34 +08:00
    文言文
    oyjc
        16
    oyjc  
       2019-12-18 21:03:59 +08:00
    @CrazyBoyFeng 可以试试 C# (.Net Core)
    之前我试过在 1vcpu 1g 上跑过爬虫(加上 webdriver),效率高,资源占用率低,长期跑不死机
    wind3110991
        17
    wind3110991  
       2019-12-18 22:34:02 +08:00
    反正 java 含着泪离开了直播间
    nightwitch
        18
    nightwitch  
       2019-12-19 00:35:30 +08:00
    以我个人的经验来看,就 curd 业务而言,招 golang 程序员的人力成本与 java 程序员的人力成本的差距,差价比升级机器贵多了
    luozic
        19
    luozic  
       2019-12-19 00:47:21 +08:00 via iPhone
    考虑短平快,占用资源少,golang 有不少现成的轮子抄; dlang/rust 问题就一点,现成的轮子少了一点,长期做才有点 roi。
    mrcotter2013
        20
    mrcotter2013  
       2019-12-19 06:25:04 +08:00
    后端已转向微服务,AWS Serverless + Node.js ,摆脱 VPS
    hrong
        21
    hrong  
       2019-12-19 07:46:31 +08:00 via iPhone
    java microprofile
    opengps
        22
    opengps  
       2019-12-19 08:35:36 +08:00 via Android
    汇编真的牛逼
    wangxiaoaer
        23
    wangxiaoaer  
       2019-12-19 08:53:06 +08:00
    不装逼拿汇编说事。

    考虑到效率层面,虽然我极其讨厌 go,但是我不得不说 go 在执行效率和资源占用优势还是很大的,同时也兼顾了开发效率。
    leido
        24
    leido  
       2019-12-19 09:00:33 +08:00
    Go C++
    javapythongo
        25
    javapythongo  
       2019-12-19 09:05:56 +08:00 via iPhone
    也要考虑人力成本
    mxT52CRuqR6o5
        26
    mxT52CRuqR6o5  
       2019-12-19 09:08:54 +08:00 via Android
    你这两种应用都是 io 密集型,用哪种语言都差不多的
    Guys
        27
    Guys  
       2019-12-19 09:56:37 +08:00
    我觉得一楼说的对
    Guys
        28
    Guys  
       2019-12-19 09:57:59 +08:00
    说出来你可能不信,Java 一开始就是给资源有限的小机器设计的(狗头)。
    newtype0092
        29
    newtype0092  
       2019-12-19 10:01:40 +08:00
    这是个悖论。
    如果你能力足够摆平设备性能的水平,那么你应该不缺这点钱。
    反之,设备上剩下的钱可能不足以填平特选的技术上的坑。

    总之,技简单大众的技术效率最高。
    wysnylc
        30
    wysnylc  
       2019-12-19 10:14:33 +08:00
    Java11 加入的 zgc,垃圾回收最大延迟 10ms,实际 1ms
    支持 4TB 内存,后续版本扩展到 8TB 还是 16TB 我忘了
    请问,够资格吗?
    abcbuzhiming
        31
    abcbuzhiming  
       2019-12-19 11:01:09 +08:00
    @wysnylc 不够,java 目前的技术栈,起个服务占内存太高了
    ArJun
        32
    ArJun  
       2019-12-19 11:11:27 +08:00
    服务器的成本 go 只需要 java 的一半甚至更低
    一般企业都是 2h8g 跑 java,资源还挺紧的,用 go 微服务 2h4g 基本够了,只要宽带够大并发什么的基本没问题
    tailf
        33
    tailf  
       2019-12-19 11:21:55 +08:00
    @wysnylc 还真不够,jvm 是业界最耗内存的技术
    LANB0
        34
    LANB0  
       2019-12-19 11:49:22 +08:00
    除了 java 系的都可以吧,当然 c/c++、go、rust 应该是最不成问题的,我们日常是单核 800hz,256 内存下的嵌入式设备设备 C/C++已经可以随便搞了。当然限于 flash 太小( 32M ),go 只能自己跑跑小 demo
    kiddingU
        35
    kiddingU  
       2019-12-19 11:49:23 +08:00
    go
    janxin
        36
    janxin  
       2019-12-19 13:39:33 +08:00
    @LANB0 gccgo/llvmgo 了解一下
    sagaxu
        37
    sagaxu  
       2019-12-19 14:18:24 +08:00 via Android
    @ArJun 跑个 OA 或者管理后台,2c8g 太奢侈,1c1g 够几百个人用了
    sagaxu
        38
    sagaxu  
       2019-12-19 14:20:35 +08:00 via Android
    @abcbuzhiming 看类型,我以前公司 2c4g 的低配 vps,每台跑 8 个 java 服务
    abcbuzhiming
        39
    abcbuzhiming  
       2019-12-19 15:19:59 +08:00   1
    @sagaxu
    你觉得 4G 跑 8 个 java 服务是很值得说道的事情吗?现在有大量的非高频请求服务,希望的是你启动起来就占个几十 M 内存最好,一台机器上最好能跑上百个服务!

    上个时代互联网大撒币一样不要钱,导致很多程序员觉得硬件资源不要钱一样,4G 才跑 8 个服务,这有什么值得称道的?一个服务吃 500M 内存?
    scnace
        40
    scnace  
       2019-12-19 15:34:56 +08:00 via Android
    哇 楼里竟然有这么多人推荐 Serverless 更准确的说法应该是 FaaS 吧 但是感觉国内大厂还没有相关的大型实践?
    wsseo
        41
    wsseo  
       2019-12-19 15:53:40 +08:00
    有些时候是公司指标,老板硬要压缩云服务成本,这个跟招人是分开的。
    rb6221
        42
    rb6221  
       2019-12-19 16:10:12 +08:00
    我不懂后端,我想问一聚,go 的占用真的很低吗?一直以来都听说其优点是速度快高并发开发简洁之类的,对于其运行占用,也只有理论上的寥寥几句,有实际使用的数据结论吗?
    abcbuzhiming
        43
    abcbuzhiming  
       2019-12-19 16:45:47 +08:00
    @janus77
    t/587073
    https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go.html

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

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

    另外要求单机跑多个服务本来就很奇怪,单机部署应该尽可能少的服务,避免相互影响
    要是流量很大需要多机部署,name 单机尽可能支持更高的 QPS,用更少的机器支撑当前的总 QPS
    CrazyBoyFeng
        51
    CrazyBoyFeng  
    OP
       2019-12-19 19:03:40 +08:00
    @sessionreckon
    Java 服务启动后,能占这么大内存,一般是 JVM 为了优化就需要调度这么大内存。JVM 的优化非常杰出,这是 Java 性能强劲的最主要因素。如果强行限制,那效果自然大打折扣。指定个堆上限再频繁 GC 可以想见那效率有多低。
    同样功能的应用,Java 肯定是会比其它平台更耗费内存的,因为要额外运行 JVM 对运行时内存进行优化和调度。
    上面也没有说多实例跑在一个环境里,为了安全和可靠性当然要隔离,但一个 node 就跑一个应用也太浪费了点。事实上常规的使用方式是跑多个容器。不过自己弄服务器还是比较麻烦的,成本也不低。而现在更普遍的方式是使用云容器,按需购买资源。
    可能很多人还是不理解题目的需求。要是只有几个实例,那根本犯不着对资源敏感。
    CrazyBoyFeng
        52
    CrazyBoyFeng  
    OP
       2019-12-19 19:07:35 +08:00
    @oyjc @attackingmilo
    我看到你们都推荐.Net ,但是据我所知,它也跟 Java 类似是跑在虚拟机里的。只是不知道它的虚拟机是否像 JVM 那样有较大的开销。
    blackboom
        53
    blackboom  
       2019-12-19 19:17:42 +08:00 via Android
    Java 确实吃内存,目前的解决方案有 Graalvm 和 Openj9,Graalvm Spring 的支持还不完善,我们是混着 70%Java 和 30%Go
    Cbdy
        54
    Cbdy  
       2019-12-19 19:23:03 +08:00 via Android
    这不是废话吗,C 语言
    MeteorCat
        55
    MeteorCat  
       2019-12-19 19:23:48 +08:00 via Android
    最好是汇编吧,我推荐 rust
    fengbjhqs
        56
    fengbjhqs  
       2019-12-19 19:28:44 +08:00
    js 或许有一席之地,可能性能没有那么好,但开发效率和性能感觉是比较平衡的
    sagaxu
        57
    sagaxu  
       2019-12-19 19:34:34 +08:00 via Android
    @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
        58
    xuanbg  
       2019-12-19 20:20:55 +08:00
    我的 Redis 容器,内存只用了 8M,你没看错,就是 8M 不是 8G。然后其他基于 Java 语言的容器,没有一个内存在 300M 以下的。
    windyland
        59
    windyland  
       2019-12-19 20:30:49 +08:00 via Android
    恕我直言,为什么不买个高性能机器放本地然后云服务器 frp 反向代理
    windyland
        60
    windyland  
       2019-12-19 20:33:35 +08:00 via Android
    国内云服务器在只走内网的时候性价比还是相当高的
    hronro
        61
    hronro  
       2019-12-19 20:37:01 +08:00 via iPhone
    推荐 NIM
    sessionreckon
        62
    sessionreckon  
       2019-12-19 20:55:30 +08:00
    @CrazyBoyFeng
    2c4g/8g 甚至 1c1g 本来就是 VM/Docker.没必要再拆.
    另外 GC 的耗时和你的堆大小不是线性相关,执行时间和堆大小也没有必然关系,可以自己跑个 benchmark 试试
    当然对启动进程而言,Java 就是跑起来就要几十上百 M,Go 跑起来小得多...
    对一个无状态的正常的(没有大量本地资源的)业务而言,先用完肯定是 CPU
    内存算个啥...
    sessionreckon
        63
    sessionreckon  
       2019-12-19 21:00:46 +08:00
    @xuanbg
    8M 能拿来做什么?当玩具都嫌不够
    这么抬杠的话写个 J2ME,20M 能跑一堆 Java 程序....
    15 年前 Nokia 不就这么干的
    xuanbg
        64
    xuanbg  
       2019-12-19 21:15:44 +08:00
    @sessionreckon 你这不是杠么……
    我是说我起了个 Redis 的容器,只占用了 8M 的内存,不信可以自己试试看,一条命令就能验证的事情。
    然后,Redis 是个玩具?
    cloverzrg2
        65
    cloverzrg2  
       2019-12-20 13:54:12 +08:00
    go
    sessionreckon
        66
    sessionreckon  
       2019-12-20 15:11:50 +08:00
    @xuanbg
    Redis 裸跑起来花了多少内存没啥意义
    实际场景肯定是看至少百万 /千万数据下整体占用多少内存
    我指只给 8M 内存给 Redis 的情况下,它是个玩具...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2505 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 05:14 PVG 13:14 LAX 22:14 JFK 01:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86