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

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

  •  
  •   CrazyBoyFeng · 111 天前 · 3898 次点击
    这是一个创建于 111 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

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

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

    另外要求单机跑多个服务本来就很奇怪,单机部署应该尽可能少的服务,避免相互影响
    要是流量很大需要多机部署,name 单机尽可能支持更高的 QPS,用更少的机器支撑当前的总 QPS
    CrazyBoyFeng
        51
    CrazyBoyFeng   109 天前
    @sessionreckon
    Java 服务启动后,能占这么大内存,一般是 JVM 为了优化就需要调度这么大内存。JVM 的优化非常杰出,这是 Java 性能强劲的最主要因素。如果强行限制,那效果自然大打折扣。指定个堆上限再频繁 GC 可以想见那效率有多低。
    同样功能的应用,Java 肯定是会比其它平台更耗费内存的,因为要额外运行 JVM 对运行时内存进行优化和调度。
    上面也没有说多实例跑在一个环境里,为了安全和可靠性当然要隔离,但一个 node 就跑一个应用也太浪费了点。事实上常规的使用方式是跑多个容器。不过自己弄服务器还是比较麻烦的,成本也不低。而现在更普遍的方式是使用云容器,按需购买资源。
    可能很多人还是不理解题目的需求。要是只有几个实例,那根本犯不着对资源敏感。
    CrazyBoyFeng
        52
    CrazyBoyFeng   109 天前
    @oyjc @attackingmilo
    我看到你们都推荐.Net ,但是据我所知,它也跟 Java 类似是跑在虚拟机里的。只是不知道它的虚拟机是否像 JVM 那样有较大的开销。
    blackboom
        53
    blackboom   109 天前 via Android
    Java 确实吃内存,目前的解决方案有 Graalvm 和 Openj9,Graalvm Spring 的支持还不完善,我们是混着 70%Java 和 30%Go
    Cbdy
        54
    Cbdy   109 天前 via Android
    这不是废话吗,C 语言
    MeteorCat
        55
    MeteorCat   109 天前 via Android
    最好是汇编吧,我推荐 rust
    fengbjhqs
        56
    fengbjhqs   109 天前
    js 或许有一席之地,可能性能没有那么好,但开发效率和性能感觉是比较平衡的
    sagaxu
        57
    sagaxu   109 天前 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   109 天前
    我的 Redis 容器,内存只用了 8M,你没看错,就是 8M 不是 8G。然后其他基于 Java 语言的容器,没有一个内存在 300M 以下的。
    windyland
        59
    windyland   109 天前 via Android
    恕我直言,为什么不买个高性能机器放本地然后云服务器 frp 反向代理
    windyland
        60
    windyland   109 天前 via Android
    国内云服务器在只走内网的时候性价比还是相当高的
    hronro
        61
    hronro   109 天前 via iPhone
    推荐 NIM
    sessionreckon
        62
    sessionreckon   109 天前
    @CrazyBoyFeng
    2c4g/8g 甚至 1c1g 本来就是 VM/Docker.没必要再拆.
    另外 GC 的耗时和你的堆大小不是线性相关,执行时间和堆大小也没有必然关系,可以自己跑个 benchmark 试试
    当然对启动进程而言,Java 就是跑起来就要几十上百 M,Go 跑起来小得多...
    对一个无状态的正常的(没有大量本地资源的)业务而言,先用完肯定是 CPU
    内存算个啥...
    sessionreckon
        63
    sessionreckon   109 天前
    @xuanbg
    8M 能拿来做什么?当玩具都嫌不够
    这么抬杠的话写个 J2ME,20M 能跑一堆 Java 程序....
    15 年前 Nokia 不就这么干的
    xuanbg
        64
    xuanbg   109 天前
    @sessionreckon 你这不是杠么……
    我是说我起了个 Redis 的容器,只占用了 8M 的内存,不信可以自己试试看,一条命令就能验证的事情。
    然后,Redis 是个玩具?
    cloverzrg2
        65
    cloverzrg2   109 天前
    go
    sessionreckon
        66
    sessionreckon   109 天前
    @xuanbg
    Redis 裸跑起来花了多少内存没啥意义
    实际场景肯定是看至少百万 /千万数据下整体占用多少内存
    我指只给 8M 内存给 Redis 的情况下,它是个玩具...
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3526 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:25 · PVG 18:25 · LAX 03:25 · JFK 06:25
    ♥ Do have faith in what you're doing.