V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abcbuzhiming
V2EX  ›  问与答

是 Nginx 已经落后时代了,还是那些人在吹水?

  •  
  •   abcbuzhiming · 2021-11-30 10:36:28 +08:00 · 12675 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚刚看到一篇公众号,石墨文档说他们改造自己 websocket 网关,看了一眼是用 go 实现的,里面的有个数据很吓人,4 核心 8GB ,单机 48w 连接。

    然后我在 v2 搜了一下,好家伙,有人宣称自己写出了单机 100w 连接数的网络库。一看也是 go 。

    我记得 nginx 的单机负载也就是 3w-5w 连接,网上极少见有人能搞到 10w 连接的。上面这些 50w 和 100w 单机连接数的真的不是在吹牛?
    78 条回复    2021-12-12 18:16:15 +08:00
    wellsc
        1
    wellsc  
       2021-11-30 10:42:38 +08:00
    ng 的数据有这么弱吗?你的数据哪来的
    murmur
        2
    murmur  
       2021-11-30 10:42:56 +08:00
    那你应该能搜出 nginx 百万连接的文章啊,而且 2019 年就开始吹了

    他的连接是 48w ,但是并发是 1.8w/s 建立数,测试数据是心跳包,这个应该比 web 页面还轻一点吧
    maskerTUI
        3
    maskerTUI  
       2021-11-30 10:43:03 +08:00
    用脚思考都知道答案
    ipwx
        4
    ipwx  
       2021-11-30 10:43:39 +08:00
    通用机和定制机,当然在某些极端场景下表现有差别。
    supuwoerc
        5
    supuwoerc  
       2021-11-30 10:50:10 +08:00   ❤️ 69
    公众号啊,那没事了。

    按照公众号上吹的,我能二十天精通了 xx ,一个月成为了 xx 架构师,三年步入年薪百万。

    现实:回复“资料”下载资料,百度云下载速度:8k/s ,打开资料来源 csdn+某某培训班。
    yanbo92
        6
    yanbo92  
       2021-11-30 10:57:58 +08:00 via iPhone
    根据我的认知,这还是 nginx 的时代
    dolphintwo
        7
    dolphintwo  
       2021-11-30 11:02:46 +08:00
    都是百万连接啊,谁也别笑谁,( Nginx 真好用
    Jooooooooo
        8
    Jooooooooo  
       2021-11-30 11:08:27 +08:00   ❤️ 4
    没做过真正的业务喜欢吹这种数字
    xiao109
        9
    xiao109  
       2021-11-30 11:10:11 +08:00
    你连上数据库啥也不干只查看一下数据库版本你也可以
    libook
        10
    libook  
       2021-11-30 11:11:33 +08:00   ❤️ 6
    https://www.nginx.com/blog/nginx-websockets-performance/

    2014 年的文章。

    “Even with 50,000 active WebSocket connections, NGINX required less than 1 Gb memory and less than 1 core of CPU capacity”

    所以单机负载 3w-5w 的信息不知道是什么来源。

    Nginx 这种用 C 写的优化怪物,Go 是无论如何都跟不上的,当然不排除有些非通用场景需要依靠定制化来优化性能,但应该也比不上开发 Nginx module 或者直接魔改 Nginx ,如果追求极致的话。
    plko345
        11
    plko345  
       2021-11-30 11:28:08 +08:00 via Android   ❤️ 2
    lvs > nginx >= haproxy > go 写的
    abcbuzhiming
        12
    abcbuzhiming  
    OP
       2021-11-30 11:33:39 +08:00
    @wellsc nginx 做反代的时候单机一般就 3w 连接左右,5w 开始就不是很稳定,注意我说的是单机,数据来源来自极客时间的从零开始学架构课程,常见系统性能量级。另外我自己实际测试也差不多这个量级

    @murmur Nginx 单机百万连接的文章?你找个让我看看它的配置。石墨文档那个是用来做 websocket gateway ,也就是说其实是个反代


    @libook Nginx 在做反代的时候大约就 3w-5w 的连接
    FakNoCNName
        13
    FakNoCNName  
       2021-11-30 11:41:37 +08:00
    @abcbuzhiming 反向代理需要和真正的后端建立一次连接,一个主机连接服务时能建立的 socket 是有限的( 0xFFFF ),所以他们 100W 的单机连接是怎么来的?
    wslzy007
        14
    wslzy007  
       2021-11-30 11:42:56 +08:00
    并发连接数这种为测试而测试的数据没太多实际意义,高并发下的 QPS 更有参考价值,另外同比资源占用也是个重要指标,否则一笑而过吧~
    starcraft
        15
    starcraft  
       2021-11-30 11:43:20 +08:00 via Android
    这种 go 写出来的给 ngx 提鞋都不配。
    ly841000
        16
    ly841000  
       2021-11-30 11:48:57 +08:00
    @abcbuzhiming 不稳定是因为系统,不是因为 Nginx ,想要更高连接需要对内核进行大量调节
    nash
        17
    nash  
       2021-11-30 11:52:40 +08:00
    少看点公众号文章,多读点书
    rrfeng
        18
    rrfeng  
       2021-11-30 11:59:24 +08:00   ❤️ 8
    你信不信它这个网关前面可能还挂了一层 nginx ……
    ila
        19
    ila  
       2021-11-30 12:00:37 +08:00 via Android
    公众号看标题就能排雷
    dddd1919
        20
    dddd1919  
       2021-11-30 12:01:50 +08:00
    吓死了,买个课程压压惊
    Illusionary
        21
    Illusionary  
       2021-11-30 12:02:26 +08:00   ❤️ 3
    是的,我是在抖音看的
    ysc3839
        22
    ysc3839  
       2021-11-30 12:03:45 +08:00 via Android
    我之前在服务器上搭建 WebDAV ,因为嫌 nginx 配置文件太复杂,就用了个 Golang 写的 WebDAV server ,nginx 反向代理它。
    结果仅仅用 16 个线程下载,就会出现前面几个连接有速度,后面直接连不上了,ssh 上去看发现 WebDAV server 的进程跑满了 CPU ,此时停止下载还是一直跑满,完全连不上。
    最后换成了 nginx ,32 线程轻轻松松。
    binux
        23
    binux  
       2021-11-30 12:08:08 +08:00 via Android
    @ysc3839 这个 golang 也没关系啊
    ysc3839
        24
    ysc3839  
       2021-11-30 12:16:56 +08:00 via Android
    @binux 当然有可能是那个 WebDAV server 自己实现有问题。
    但是用户感觉上就是,随便找一个开源的 Golang 程序,性能大概率是不如 nginx 这种使用 C/C++,且开发了多年,使用广泛的程序好的。
    shyangs
        25
    shyangs  
       2021-11-30 12:37:53 +08:00
    一個主機連接服務時能建立的 socket 是有限的,他們 100W 的單機連接是怎麼來的?
    gesse
        26
    gesse  
       2021-11-30 12:45:05 +08:00
    盲猜 caddy 改?
    mgcnrx11
        27
    mgcnrx11  
       2021-11-30 12:47:35 +08:00 via iPhone
    多网卡、虚拟网卡、弄大一些 fd 也可以冲到 100w
    mgcnrx11
        28
    mgcnrx11  
       2021-11-30 12:48:09 +08:00 via iPhone
    @mgcnrx11 是回复这位 @shyangs
    jasonkayzk
        29
    jasonkayzk  
       2021-11-30 12:59:59 +08:00
    @supuwoerc #5 笑死我了,哈哈
    bruce0hh
        30
    bruce0hh  
       2021-11-30 13:21:16 +08:00 via Android
    https://mp.weixin.qq.com/s/JLKbE-fsrjQNiMZH5mIX3g
    贴个 OSC 开源社区公众号的链接,本文由石墨文档技术杜旻翔分享
    0312birdzhang
        31
    0312birdzhang  
       2021-11-30 13:43:16 +08:00
    看标题被吓到了,点进来放心了
    bipy
        32
    bipy  
       2021-11-30 13:49:14 +08:00
    针对性优化跟通用方案没什么可比的吧
    iyaozhen
        33
    iyaozhen  
       2021-11-30 13:56:52 +08:00
    nginx 没那么若,字节整个网关都是 nginx 集群搭的。当然 go 有 go 的好处,很多细节可控(性能不是重点),可以二次编程 百度的网关 BFE 就是 Go 写的,你可以看看。https://github.com/baidu/bfe-book
    MEX
        34
    MEX  
       2021-11-30 14:14:46 +08:00
    文章没说是单机 100w 连接额....单机不带业务场景也测最多也就 50w 连接,而且还是不带业务逻辑的情况下。
    不使用 NGINX 的原因并不是性能差异问题,NGINX 的性能是很优秀的,不使用的原因单纯从成本角度考虑,使用四层负载加上 GO 挂载 TLS 证书,比七层负载的成本更低。
    40EaE5uJO3Xt1VVa
        35
    40EaE5uJO3Xt1VVa  
       2021-11-30 14:32:05 +08:00
    人有多大胆,Nginx 有多大产
    ytmsdy
        36
    ytmsdy  
       2021-11-30 14:40:03 +08:00
    呵呵,就算用 IIS 跑,咱们普通人的并发量也到达不了 IIS 的瓶颈!
    cache
        37
    cache  
       2021-11-30 14:53:22 +08:00
    @shyangs
    想要单机百万连接多配几个 ip 就行了,只是这种评测没什么意义

    [AnyIP: Bind a whole subnet to your Linux machine – Widodh]( https://blog.widodh.nl/2016/04/anyip-bind-a-whole-subnet-to-your-linux-machine/)
    xz410236056
        38
    xz410236056  
       2021-11-30 15:04:06 +08:00
    @supuwoerc #5 百度云现在下载无会员也有几 M 了
    salmon5
        39
    salmon5  
       2021-11-30 15:15:55 +08:00
    C1000K 不是古代的技术吗?
    keppelfei
        40
    keppelfei  
       2021-11-30 15:35:33 +08:00
    @supuwoerc 笑尿了
    Lyv5
        41
    Lyv5  
       2021-11-30 15:38:49 +08:00
    @supuwoerc 一气呵成 哈哈哈哈哈
    vanton
        42
    vanton  
       2021-11-30 16:07:10 +08:00
    nginx 百万级没问题。
    go 要想超过 nginx ,可能性不大,基本可以认为是胡扯。
    lzs5240
        43
    lzs5240  
       2021-11-30 16:10:49 +08:00
    OpenResty Tengine 不都是 nginx
    leavic
        44
    leavic  
       2021-11-30 16:15:01 +08:00
    哪天 C 语言培训或者教程书籍之类的火了,nginx 就性能碾压全世界了
    kilala2020
        45
    kilala2020  
       2021-11-30 16:15:24 +08:00
    吹 go 并发都已经这么卷了么?汇编>C>=C++>java>Go ,大概是这样?
    Xusually
        46
    Xusually  
       2021-11-30 16:22:33 +08:00   ❤️ 1
    推 go 就算了,踩 nginx 是几个意思?
    hmli
        47
    hmli  
       2021-11-30 17:40:26 +08:00   ❤️ 17
    不是,你们**有些人**真就一点原文不看,看了个标题就开始闭着眼写命题作文呗?
    我翻遍全文也没找到哪里有提到说 4c8g 单机 48w 连接, 下面作者的实测里倒是有一个 16c32g 单机 1~1.8W 连接的数据。
    我也没看到作者哪里有提到说"nginx"不行,得换 golang 才厉害的论点,只看到在他的”网关 2.0“里因为业务需求把 nginx 网关换成了自研。
    还是说你们都是评论 bot 吗? 看到“公众号” "Golang" "并发”, 就触发你们的关键词了?
    sujin190
        48
    sujin190  
       2021-11-30 17:59:54 +08:00
    看到“nginx 的单机负载也就是 3w-5w 连接”才是被惊了,你不是用的假 nginx 吧
    newmlp
        49
    newmlp  
       2021-11-30 18:43:25 +08:00
    通用和定制的问题,你要上 dpdk 单机百万也不是不可以
    miniliuke
        50
    miniliuke  
       2021-11-30 19:05:34 +08:00
    nginx 不是号称 1000w 连接,100w 的 qps 吗......
    adoal
        51
    adoal  
       2021-11-30 19:43:54 +08:00
    benchmarking 这种事,笑笑就好
    oncethink
        52
    oncethink  
       2021-11-30 20:08:17 +08:00
    兄弟们,以后还是要注意来源请求,看了原文再评论
    wanguorui123
        53
    wanguorui123  
       2021-11-30 20:13:17 +08:00
    数据库磁盘 IO 才是瓶颈
    lesismal
        54
    lesismal  
       2021-11-30 20:50:41 +08:00   ❤️ 2
    连接数不等于 qps ,如果百万连接数建立起来放那不用,也没什么压力呀,所以你看石墨的文章里,好像只是 5s 广播一次不算太大的消息吧,48w/5s ,不到 10w qps ,这个确实没什么压力,对于很多语言都没压力

    基于以上,楼主缺少正常的压力数据指标来对比性能是没什么意义的

    另外,
    “然后我在 v2 搜了一下,好家伙,有人宣称自己写出了单机 100w 连接数的网络库。一看也是 go 。”
    这好像是在说我?但是宣称这个词感觉怪怪的
    我这也备上了 websocket 百万连接的测试例子,有兴趣的同学完全可以自己跑下试试、而不是觉得这只是宣称,因为这应该是事实:
    https://github.com/lesismal/nbio-examples/tree/master/websocket_1m

    老帖子在这:
    https://www.v2ex.com/t/763906
    https://www.v2ex.com/t/794435


    鸟窝老师还有篇帖子对比 RPC 框架的,我的另一个仓库也在里面
    https://colobu.com/2021/08/01/benchmark-of-rpc-frameworks/

    百万连接也好、RPC 也好,有兴趣的同学,建议自己跑代码亲测对比,而不是只看别人仓库文档里的数据,因为一些朋友交流下来,自测结果跟一些公司出品项目自带文档里的排名数据对不上,这其中可能有环境差异的因素,也可能有一些其他因素,但请以自测为准。
    Deeymmm
        55
    Deeymmm  
       2021-11-30 21:54:16 +08:00
    @FakNoCNName 0xffff 是端口上限吧,不是连接数上限
    Donahue
        56
    Donahue  
       2021-11-30 21:59:46 +08:00
    @ysc3839 webdav 要求不高直接起个 docker 挂载一下就好了哈哈
    pengtdyd
        57
    pengtdyd  
       2021-11-30 22:01:08 +08:00
    go 啥时候能干过 c 了,这帮人吹牛皮不打草稿。我大 Rust 都没这么狂过。
    akira
        58
    akira  
       2021-11-30 22:13:50 +08:00
    生产环境链接数没上过千的表示 毫无压力,你们继续。。
    BBCCBB
        59
    BBCCBB  
       2021-11-30 22:38:20 +08:00
    nginx 单机没有这么弱吧?

    很早 linkedin 基于 netty 就能做到单机 50w+ socket 连接了.
    eason1874
        60
    eason1874  
       2021-11-30 22:40:01 +08:00   ❤️ 2
    Nginx 是通用 Web Server ,有一系列 Filter 要跑,在用不上这些 Filter 的专用场景比不上专用软件再正常不过了

    脱离业务需求去比较,没多大意义。再厉害的狙击枪在近战时也比不上一把菜刀

    看了 #30 发的链接,那篇文章里没有说 Nginx 性能怎么样,只说了他们的 Nginx 只用到一个小功能,不值得用。“Nginx 仅使用 TLS 解密,请求透传,产生了大量的资源浪费”
    nl101531
        61
    nl101531  
       2021-11-30 23:34:01 +08:00 via iPhone
    梦回大跃进
    kkbblzq
        62
    kkbblzq  
       2021-12-01 01:01:07 +08:00
    楼上的大部分回复,我知道为啥现在网上带节奏这么容易了。
    zachgenius
        63
    zachgenius  
       2021-12-01 08:00:33 +08:00
    现在应该还是 NGINX/apache 是主流。性能不够加机器啊,搞一些魔改最后运维和 debug 成本远高于加机器。大多数普通”互联网“公司可能到最后倒闭了都未必能跑满 nginx 的最大并发量
    tairan2006
        64
    tairan2006  
       2021-12-01 08:30:02 +08:00
    看了原文,决定先把楼主 block 了
    yl20181003
        65
    yl20181003  
       2021-12-01 09:01:10 +08:00 via Android
    已经屏蔽楼主,纯带节奏
    suyuyu
        66
    suyuyu  
       2021-12-01 09:16:44 +08:00
    营销号日常作妖
    hourui
        67
    hourui  
       2021-12-01 09:38:25 +08:00
    但凡看过 nginx 源码的人,不会有这种疑问的。
    kerro1990
        68
    kerro1990  
       2021-12-01 09:47:23 +08:00
    nginx 百万毫无压力,看下代码实现就知道了
    runze
        69
    runze  
       2021-12-01 09:48:33 +08:00
    @ysc3839 很正常嘛
    随便找一个开源的 C/C++/Whatever 程序,性能大概率是不如 nginx 这种使用 C/C++,且开发了多年,使用广泛的程序好的
    heyjei
        70
    heyjei  
       2021-12-01 10:47:07 +08:00
    @rrfeng 哈哈哈哈哈,必须的,前面必须还得一个 Nginx 来做负载均衡🐶
    icy37785
        71
    icy37785  
       2021-12-01 12:01:30 +08:00 via iPhone
    楼主在这里带节奏,底下一堆不是喷 go 的就是喷公众号的,
    没看公众号原文就喷的我都能理解,
    有些喷起来像连楼主这个帖子都没看的,我确实理解不了。
    总不能是机器人吧。
    millken
        72
    millken  
       2021-12-01 15:45:44 +08:00
    写得好的情况下,golang fasthttp server 的性能是可以超越 nginx 的,fasthttp 下可以实现 zero allocate 。
    SteveWoo
        73
    SteveWoo  
       2021-12-01 15:52:40 +08:00
    推送服务用 c++、golang 分别写过接入层。8C/16G 单机压测 120w 长连接,生产稳定 100w 长连接(实际上只管连接 4C 也够了,但是业务加了些拆包的东东)。

    并发长连接数量得益于 linux 内核多路复用升级跟普通开发没啥关系,懂其原理很容易实现 C1000K 。

    对于网关产品还要考虑稳定性、热更、平滑升级、上面有同学提到 QPS:“并发连接数这种为测试而测试的数据没太多实际意义,高并发下的 QPS 更有参考价值”

    “单机负载也就是 3w-5w 连接” 这个说法是把 nginx 当做 1:1 的透传代理来用,因为后向转发本地要占用一个端口,单网卡,ip 范围最多就 65535 ,这里本机多配置些 IP 就可以了。
    SteveWoo
        74
    SteveWoo  
       2021-12-01 15:56:26 +08:00
    结论:nginx 很牛,没有落后时代;那些人也没有吹水;楼主要提升认知。
    saberlong
        75
    saberlong  
       2021-12-01 18:42:38 +08:00 via Android
    golang 之前确实有篇单机 100 万连接实践。本质上是讲 golang 在 100 万连接下怎么优化的。比较采用常规的一个链连接 2 个 go 程方案与通过 syscall
    直接使用 epoll 方案之间的内存占用和延迟差别等。和 100 万并发不是同个概念。文章里实现单机 100 万连接的一些设置以及测试方式还是可以借鉴的。其它语言也能做到
    abcbuzhiming
        76
    abcbuzhiming  
    OP
       2021-12-02 20:20:35 +08:00
    @hmli
    你自己看原文不仔细,原文和内容我贴出来

    https://mp.weixin.qq.com/s/jl14D6XYJ5PeR3rmYAPdpQ

    4.1 压测准备
    选择一台配置为 4 核 8G 的虚拟机,作为服务机,目标承载 48w 连接;
    选择八台配置为 4 核 8G 的虚拟机,作为客户机,每台客户机开放 6w 个端口。

    ======

    @sujin190
    我都说了好多遍了,是 Nginx 做反向代理时的连接数,连文章的出处我都给了


    ======
    @tairan2006 赶紧屏,永不相见。
    @yl20181003 你这种数字 id 跑来说别人带节奏?

    @icy37785 你们这帮数字 id 连一个首贴没有说别人带节奏?我没说清楚文章来源,数据来源是怎么的?
    icy37785
        77
    icy37785  
       2021-12-03 00:03:03 +08:00 via iPhone
    @abcbuzhiming #74 原来不是带节奏,是单纯的不具备中文理解能力呀,那没事了,ban 了,再见。
    opengps
        78
    opengps  
       2021-12-12 18:16:15 +08:00 via Android
    用 ng 转发会受到系统可用端口数量制约,直接写个服务只需要一个端口,就承受外边连进来的链接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2890 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.