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

Nginx 性能很差怎么回事,只能达到几百的 qps

  •  
  •   luckyrayyy · 2019-06-28 12:07:27 +08:00 · 8378 次点击
    这是一个创建于 1981 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天项目压测用到了 Locust,今天无聊就写几个简单用例测着玩。开始用 spring boot 写 hello world,qps 大几百,但是我对这个数没什么概念,心想最快的应该是 nginx 这种静态服务器了吧,nginx 又是以性能出色著称的。

    然后试了试,竟然还是几百...我开始怀疑 Locust 是不是不给力处理不了太多请求,然后换 vert.x 的客户端进行请求,发现也就刚一千的 qps。

    我记得看 web 服务器框架的性能排行榜,普遍能到几十万的数量级,即便我机器性能一般,几万总得有吧,然后换 vert.x 的 client 请求 vert.x 的 server,qps 一下就上来了,到五万多。

    所以我没搞明白 nginx 到底哪里有问题,是我需要修改某些特定的配置吗? worker processes 和 worker connections 都已经调高了,还需要改什么吗?

    25 条回复    2020-06-07 23:15:50 +08:00
    meik2333
        1
    meik2333  
       2019-06-28 12:17:03 +08:00 via Android
    你 Nginx 测试的时候后端是什么?
    MeteorCat
        2
    MeteorCat  
       2019-06-28 12:23:03 +08:00 via Android
    是不是挂个 spring boot 把内存和线程全占了?(1g1h 的服务器)
    0ZXYDDu796nVCFxq
        3
    0ZXYDDu796nVCFxq  
       2019-06-28 12:34:38 +08:00 via Android
    如果 nginx 里直接 return 内容,我能跑到百万级别的 qps
    chinesestudio
        4
    chinesestudio  
       2019-06-28 12:34:57 +08:00 via Android
    一台不行几台就行 haproxy +nginx cluster
    azh7138m
        5
    azh7138m  
       2019-06-28 13:08:23 +08:00
    一般业务遇不到 nginx 瓶颈的,就是你的” spring boot 写 hello world ”太慢了而已
    Infernalzero
        6
    Infernalzero  
       2019-06-28 13:22:37 +08:00
    我猜你的 Nginx 没有设置到 upsteam 的 keepalive,所以主要耗时都在创建 tcp 连接上了
    Asice
        7
    Asice  
       2019-06-28 13:29:41 +08:00
    大家都是以自己掌握的知识和理论推测
    正常这种问题怎么分析问题出在哪里才是重点
    Asice
        8
    Asice  
       2019-06-28 13:30:43 +08:00
    去掉 nginx,直接压测应用看看
    regist
        9
    regist  
       2019-06-28 13:40:10 +08:00 via iPhone
    @Asice 跟提问有关,楼主真对的 nginx 发问
    Asice
        10
    Asice  
       2019-06-28 13:44:52 +08:00
    @regist
    性能肯定在 tomcat 上
    如果只要单 tomcat,有没有 nginx 都是一样的,多上 nginx,性能影响是微乎其微的,所以单 tomcat 还不如直接拿掉 nginx
    多个 tomcat,或者页面很多静态文件的,才能体现 nginx 的用处
    zwh2698
        11
    zwh2698  
       2019-06-28 13:51:40 +08:00 via Android
    我记得微软系编程的同学,老师一般会给说,出问题一定不是系统是你自己用的问题。我觉得这句话在这里也适用。
    misaka19000
        12
    misaka19000  
       2019-06-28 13:57:25 +08:00
    压测的时候关注下 Nginx 的 CPU 和内存占用
    msg7086
        13
    msg7086  
       2019-06-28 14:07:46 +08:00
    Nginx 静态跑几百 qps 是有什么问题了吧。我单核 VPS 上的 Nginx 跑动态都能跑小几千 qps。
    Vegetable
        14
    Vegetable  
       2019-06-28 14:14:15 +08:00
    你这个 helloworld 已经慢出天际了
    imherer
        15
    imherer  
       2019-06-28 14:22:02 +08:00
    直接丢个静态文件在 Nginx 里压测下看看能跑到多少?
    patx
        16
    patx  
       2019-06-28 14:46:57 +08:00 via Android
    应用服务器多少 qps
    peanuts7660
        17
    peanuts7660  
       2019-06-28 14:49:43 +08:00
    如果用的 windows 并且 Nginx 的配置文件写的 localhost
    试试把 localhost 改为 127.0.0.1 看下效果
    mzdblsw8
        18
    mzdblsw8  
       2019-06-28 15:08:14 +08:00
    nginx 正常可以达百万级别转发。 应该是你应用的问题。先去掉 nginx 测试再说吧。
    luckyrayyy
        19
    luckyrayyy  
    OP
       2019-06-28 15:54:00 +08:00
    我可能描述的不太清楚,nginx 后面没有 tomcat,只有一个静态的 index.html。

    另外 Locust 是模拟 1000 个用户的请求,自己用 vert.x 的 client 是用了几十一百个线程的线程池不断请求。

    nginx 是在 docker 里面的,docker 配置的资源量是 4c6g。

    宿主机系统是 mac 系统。

    @meik2333
    @MeteorCat
    @azh7138m
    @Asice
    azh7138m
        20
    azh7138m  
       2019-06-28 16:56:40 +08:00
    @luckyrayyy 我试了一下默认配置

    mbp 13 吋 2017 高配,docker 跑,接近 1w qps 了,不妨发一下你的测试用例


    https://gist.github.com/muzea/9046afc136b1717a113e5b430cef3aed
    alvinbone88
        21
    alvinbone88  
       2019-06-28 17:28:40 +08:00
    配置 NGINX 使用 epoll ( Linux )或 kqueue ( Mac )
    Mac 上跑 docker 相当于开虚拟机跑 Linux,所以直接选 epoll 就行
    yanguangs
        22
    yanguangs  
       2019-06-28 19:03:15 +08:00
    有可能是测试工具的问题
    我们前几天碰到的问题就是 nginx 配了还不如没配的情况.
    但我们使用 jmeter 测试出来的指标又很正常.

    最后发现开发用的 Jmeter 与测试的 loadrunner 的 http headers 不一样
    loadrunner 的 useragent 为 mozilla4.0 而 jmeter 为 mozilla5.0
    iyaozhen
        23
    iyaozhen  
       2019-06-28 22:21:57 +08:00 via Android
    @luckyrayyy 另外 Locust 是模拟 1000 个用户的请求,自己用 vert.x 的 client 是用了几十一百个线程的线程池不断请求

    这个没看懂,locust 调用 vert.x 当发压端?
    sakurazensen
        24
    sakurazensen  
       2020-06-07 22:37:07 +08:00
    8c16G 的 nginx,就一个 hello,world 静态页面,用 jmeter 压测只有 2w 的 TPS 不知道咋回事
    luckyrayyy
        25
    luckyrayyy  
    OP
       2020-06-07 23:15:50 +08:00   ❤️ 1
    @sakurazensen 哈哈哈哈一年前的坟你也挖出来了,后来发现了 Nginx 默认的配置并不适合这么高的并发,把线程数增加就行了。worker_connections 调高就能高不少,另外继续优化的话要改很多参数,包括 Linux 的配置,文件描述符数量等等一堆东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:19 · PVG 08:19 · LAX 16:19 · JFK 19:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.