c++多线程实现反向代理 QPS 达到 Haproxy/Nginx 的 3 倍

2023-09-12 16:32:08 +08:00
 shaoyie

NiubiX.

项目地址

实验性项目,NiubiX 只提供反向代理功能,大家轻拍有不好的地方可以留言或提 issue/pr. 觉得好就点个 star ,我会持续完善它

与 Nginx/Haproxy 对比测试

Linux 5.19.0-1030-gcp #32~22.04.1-Ubuntu
Instacne 1 GCP cloud VM, 2 cores, 4GB RAM 10.146.0.2 (nginx,haproxy, niubix run at here)
Instacne 2 GCP cloud VM, 2 cores, 4GB RAM 10.146.0.3 (backend, wrk run at here)

nginx version config

nginx version: nginx/1.18.0 (Ubuntu)

server {
    listen       8082 reuseport;
    server_name  localhost;

    access_log  off;
    error_log off;

    location / {
        proxy_pass http://10.146.0.3:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

root         516       1  0 Aug24 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  417322     516  0 12:13 ?        00:00:06 nginx: worker process
www-data  417323     516  0 12:13 ?        00:00:08 nginx: worker process

haproxy version config

HAProxy version 2.4.22-0ubuntu0.22.04.2 2023/08/14

listen niubix
    bind 0.0.0.0:8083
    mode http
    option forwardfor
    server s1 10.146.0.3:8080

ps -eLf | grep haproxy
root      449421       1  449421  0    1 15:11 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
haproxy   449423  449421  449423  0    2 15:11 ?        00:00:05 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
haproxy   449423  449421  449429  0    2 15:11 ?        00:00:05 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock

单独测试后端程序处理能力, 确保不存在吞吐量瓶颈

run at 10.146.0.2

wrk -t 2 -c 100 -d 10s  http://10.146.0.3:8080/xxx
Running 10s test @ http://10.146.0.3:8080/xxx
  2 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   520.95us  203.98us   4.09ms   68.03%
    Req/Sec    59.25k     2.68k   63.62k    52.50%
  1179133 requests in 10.00s, 173.17MB read
Requests/sec: 117888.45
Transfer/sec:     17.31MB

为了数据真实性,我只取了 1 次测试结果,连续对 3 个服务测试截图

对于 nginx 的数据声明一下:只有偶尔能跑到 1.7w 的 qps ,如果 proxy_pass http://10.146.0.3:8080; 换到 127.0.0.1:8080 ,qps 能到 9000 qps ,至于局域网内为什么这么低通过 strace 也没看到异常,而且 cpu 也通跑满,不知道它在干嘛

tcpdump tcp port 8080 抓包查看 niubix 实际数据,包含 X-Real-IP, XFF ,并且响应在微秒级

目前具备功能:

测试声明

接下来开发计划

7146 次点击
所在节点    程序员
125 条回复
shaoyie
2023-09-12 21:45:54 +08:00
@kkk9 请教,haproxy 怎么测?
ShuWei
2023-09-12 21:46:18 +08:00
用了什么黑科技吗? nginx/haproxy 什么时候这么弱鸡了
stinkytofu
2023-09-12 21:49:29 +08:00
看标题, 民科既视感
shaoyie
2023-09-12 21:53:03 +08:00
@ShuWei 算不上黑科技吧,这不像比武,没有明显的绝招,反正一行一行写完,测试结果就是会好一些,nginx 可能历史包袱比较重吧,如果单纯实现某一个功能就会轻巧一些,但是这个相差距我也是挺意外的。即使我没有完整解析 http 协议,但是性能差距也不应该这么大,我只是没有过滤某些 header 而已,也是完全循环到 header 结尾了。
我没有仔细研究 haproxy nginx 全部代码,但是总体架构都差不多,系统 api 就那些
ugpu
2023-09-12 21:53:28 +08:00
@shaoyie 首先你可以试试 真实物理机 + 真实路由效果. 然后做一些转发逻辑 . 其次 nginx 本真支持很多插件挂载, 支持多平台. 极度稳定.
最后 点个赞 觉得你动手能力很强. 起码你敢去做.
shaoyie
2023-09-12 21:53:52 +08:00
1423
2023-09-12 21:55:06 +08:00
一上来就吊打 nginx 的,不是装傻就是真蠢
nginx 都多少年了,当网友都没测过 nginx 是吧
shaoyie
2023-09-12 21:57:54 +08:00
@ugpu 1. 无奈测试环境有限,等成熟一些再花大精力对细致化测试,目前至少已经证明 nignx,haproxy 是有提升空间的,2. 不追求功能大而全,只专注一个功能。重剑无锋,大巧不工!
shaoyie
2023-09-12 22:00:29 +08:00
@1423 读都读不明白,你还能干啥?我说了,仅限反向代理功能!烂番茄,臭鸟蛋一类,就喜欢嘴炮,
lsk569937453
2023-09-12 22:02:37 +08:00
https://v2ex.com/t/929786#reply26 自己用 rust 开发的反向代理,也有和 nginx,envoy 的性能对比
devopsdogdog
2023-09-12 22:11:30 +08:00
nginx haproxy 全部配置贴一下,你是不是用默认参数对比的? 建议先调优。
ccsexyz
2023-09-12 22:13:27 +08:00
你这测试结果太离谱了,没有采信的价值。
我盲猜是 nginx 回源没开长链接,不如直接读下本地文件对比下。
shaoyie
2023-09-12 22:26:53 +08:00
@devopsdogdog 确实,除了我贴出来的,其他的都是默认的,
deorth
2023-09-12 22:28:14 +08:00
@Livid 人身攻击
shaoyie
2023-09-12 22:28:34 +08:00
@ccsexyz 那 haproxy 的测试数据也算一个参考,读文件那是 webserver 的活,我实现的只是反向代理的功能
1423
2023-09-12 22:30:13 +08:00
@Livid @shaoyie 在 29 楼搞人身攻击
1423
2023-09-12 22:32:41 +08:00


随便跑了下 nginx 就 8w 多, 这类 C 程序基本性能都到头了,新的方向都是更安全(rust),更快速开发(go)
年轻人别浪费时间在这上面了,经济价值极低
lhbc
2023-09-12 22:39:35 +08:00
啊,我手上 100K+ QPS 的 nginx 是哪里来的?
ccsexyz
2023-09-12 22:40:35 +08:00
@shaoyie 我觉得你还是多研究下被测的软件吧,随便测一下就下结论很容易误导人。
zebedy
2023-09-12 22:45:33 +08:00
op 原话:“nginx 我也不知道为什么在我这边特别不稳定,只是偶尔能跑出过万的 qps”
所以你不去研究一下为什么你的 nginx 才能跑到 2k 的 qps ,而是去吹牛逼:我的代码实现了超过 Nginx 三倍的性能。这个脑回路也是很不一般

你说巧不巧,我也有个 2c 的小鸡上面跑着本地的反代,随手跑一下

wrk -t2 -c100 -d10s xxxxxxxx
Running 10s test @ xxxxxxxx
2 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.71ms 3.04ms 45.66ms 82.73%
Req/Sec 7.62k 1.81k 12.55k 65.50%
151984 requests in 10.05s, 55.95MB read
Requests/sec: 15118.79
Transfer/sec: 5.57MB

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/973075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX