V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CrazyBoyFeng
V2EX  ›  程序员

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

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

    假设就以 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
    有些时候是公司指标,老板硬要压缩云服务成本,这个跟招人是分开的。
    janus77
        42
    janus77  
       2019-12-19 16:10:12 +08:00
    我不懂后端,我想问一聚,go 的占用真的很低吗?一直以来都听说其优点是速度快高并发开发简洁之类的,对于其运行占用,也只有理论上的寥寥几句,有实际使用的数据结论吗?
    abcbuzhiming
        43
    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
        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   ·   实用小工具   ·   6024 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:11 · PVG 10:11 · LAX 18:11 · JFK 21:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.