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 ,并且响应在微秒级

目前具备功能:

测试声明

接下来开发计划

7203 次点击
所在节点    程序员
125 条回复
Inn0Vat10n
2023-09-12 22:52:33 +08:00
shaoyie
2023-09-12 23:00:38 +08:00
@lhbc 要看服务器配置啊,我的是 2c 4g gcp 主机
shaoyie
2023-09-12 23:02:17 +08:00
@zebedy 我确实研究了,没研究出来,后来我布署了 haproxy ,测了一下,haproxy 没问题,比较稳定,能跑到 1.8w
shaoyie
2023-09-12 23:03:21 +08:00
@zebedy haproxy 的也具有参考价值
shaoyie
2023-09-12 23:04:06 +08:00
@Inn0Vat10n 感谢,不过在初始化过程的代码都没有做内存释放,因为 return -1 了 就直接 exit 了
Betsy
2023-09-12 23:27:30 +08:00
op 最大的败笔在于没有深入研究 nginx 的性能就贸然碰瓷如此有名气的组件(搜搜网上已经公开的测试结果也好),这就跟写论文没把别人的论文复现(甚至都没有仔细做这个实验)就说没人不行一样的道理。体感上来说无异于闭门造车显得不专业。不过换个标题(比如去掉 nginx 的比较)大概就是个不错的分享了。
shaoyie
2023-09-12 23:37:51 +08:00
@Betsy 感谢认真回复。你们为什么总扒着 nignx 不放,haproxy 呢,它的功能更相似一些。
Betsy
2023-09-12 23:45:40 +08:00
@shaoyie 你写的每个字大家都会看,而对 nginx 熟悉的人居多,所以你懂的。更何况你也没对 haproxy 标重点呀,故大家抓着 nginx 不放也没毛病。
toomlo
2023-09-12 23:59:35 +08:00
@shaoyie #13 很多人评论的内容完全是为了宣泄情绪或者在别的什么地方看到个名言就瞎乱用也不知道这样的评论有啥意义。
shaoyie
2023-09-13 00:02:42 +08:00
@toomlo en, 国内这个社区氛围不好
wangbin526
2023-09-13 04:17:08 +08:00
@shaoyie Nginx 以性能著称,特别是做前端反代几乎是建站标配,此类互联网基础组件 c 代码早被优化到接近极限,同等条件下性能提升个 3%都算巨大进步,结果你宣称用性能更差的 c++,在 Nginx 最主要的反代功能上跑出来 3 倍性能,确实很离谱,至于 haproxy 是什么鬼?至少偶没用过,你吹超过 10 倍偶也没感觉
这就像如今百米短跑成绩已经濒临人体极限,每提升 0.1 秒都极其艰难,结果你直接宣称短跑速度翻三倍直接直接从 9 秒多提升到 3 秒,外星科技都没这么离谱
shaoyie
2023-09-13 07:55:03 +08:00
@wangbin526 你顺便去把 mojo 也喷一下吧,他吹的牛可不小
shakeyo
2023-09-13 08:10:16 +08:00
你想获得认可的话,还不如把这怼人的功夫如何实现这么高性能的讲清楚,然后 nginx 为什么表现那么差去分析分析对比
而不是先起个耸人听闻的标题,然后别人有质疑就一副就我牛逼的姿态
shaoyie
2023-09-13 08:21:28 +08:00
@shakeyo 你哪只眼睛看到我怼人了,哪句话看到我显摆牛逼了
shaoyie
2023-09-13 08:23:40 +08:00
我贴一下 nginx 的全部配置,刚刚升级了 1.24 ,吞吐量还是上不去

```
user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}
```
```
cat /etc/nginx/conf.d/test.conf
server {
listen 8082 reuseport;
server_name localhost;

access_log off;
error_log off;

location / {
#proxy_pass http://127.0.0.1:8080;
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;
}
}

```

```
reuseport 也生效了
netstat -anp --inet | grep 8082
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 468035/nginx: maste
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 468035/nginx: maste

```
Dukec
2023-09-13 09:23:24 +08:00
要在别人最佳状态的时候超越他才有成就感。
xiaooloong
2023-09-13 09:44:10 +08:00
@shaoyie 不是 wrk 到 nginx ,是 nginx 到 upstream
xiaooloong
2023-09-13 09:45:26 +08:00
```nginx
upstream http_backend {
server 127.0.0.1:8080;

keepalive 16;
}

server {
...

location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
```
picone
2023-09-13 09:49:00 +08:00
@shaoyie #11 说的是 nginx 到 upstream ,不是 client 到 nginx
mengjue
2023-09-13 11:32:02 +08:00
遥遥领先!

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

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

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

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

© 2021 V2EX