在 TLS 上 Go 比 Nginx 厉害这么多吗?

2022-09-01 15:49:50 +08:00
 dzdh

是我测试流程有问题吗?或者环境?

:2222的是 go 写的 https server 。代码很简单。都是标准库的。 根路径就返回个 index.html 内容是 404 not found

nginx 10 秒 1771 go 就 10 秒 6.9w

go 的 tlsconfig 如下

tlsCfg := &tls.Config{
    SessionTicketsDisabled: false,
    ClientSessionCache:     tls.NewLRUClientSessionCache(1000)
}

nginx ssl 配置部分如下

ssl_certificate   .pem;
ssl_certificate_key  .key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;

证书是 rsa2048

而且还有测试期间,nginx 部分就 cpu100% go 部分就 cpu50%上下。

服务器是阿里云的性能突发实例。

6807 次点击
所在节点    Go 编程语言
49 条回复
liuxu
2022-09-01 16:21:25 +08:00
测试结果没问题,对比看估计是你的带宽满了
ShuA1
2022-09-01 16:22:23 +08:00
我做过相关的对比测试, 我只能说你 nginx 没配置对
ryd994
2022-09-01 16:22:48 +08:00
这明显是你的配置有问题。
nginx avg latency 1.72s max 2s
你说这个数字正常吗?拿个 arm 的路由器跑 nginx 都跑不出这效果

看你这个 hostname ,你不会用的是 Windows 吧? nginx Windows 版官方明确说了 unsupported ,testing only 。
liuxu
2022-09-01 16:23:32 +08:00
@liuxu #21 nginx qps 175 的情况下,带宽 1.37MB/s ,golang qps 6892 的情况下,带宽 2MB/s ,可见 nginx 是不是磁盘 io 读取了 404.html 页面返回,而 go 只从代码里返回了 404 状态码
xdeng
2022-09-01 16:30:15 +08:00
go 是正常水平 nginx 不可能这么低的吧
onikage
2022-09-01 16:36:22 +08:00
https://www.v2ex.com/t/776221#reply4
一楼我回的, 和你这里情况类似. 都是 go 块很多.
eason1874
2022-09-01 16:41:31 +08:00
我测了下树莓派 3B 上的 nginx https: 49301 requests in 10.08s, 22.76MB read

你的结果里 Non-2xx or 3xx 响应有 639 个,请求没有正确处理吧,看下日志,是不是触发了什么防护
uiosun
2022-09-01 16:44:10 +08:00
丢完整配置出来!

跟 @liuxu 老哥疑惑同一个地方,为啥你的 1771 次能返回这么多数据,你的 Nginx 是不是喜欢夹带私货……
cyrbuzz
2022-09-01 17:00:52 +08:00
记得 TLS1.3 本身的握手会比 TLS1.2 快很多。

抓包看的时候 TLS1.2 ,需要经历 Client Hello 和 Server Hello ,密钥和加密套件确认交换,没记错的话要 4 次之后开始传请求。

1.3 的话 Client Hello 和密钥一起发送,加密套件不再需要确认,两次之后就可以传请求。
eason1874
2022-09-01 17:20:34 +08:00
我也在 wsl ubuntu 22.04 安装了 nginx 测了一下,测试过程也是 CPU 100%

基本可以破案了,就是 wsl ubuntu nginx 不行,也就能测试用用,跑起来甚至不如树莓派 3B 上的

Running 10s test @ https://ubuntu/
6 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 371.19ms 131.68ms 1.62s 80.99%
Req/Sec 430.44 205.48 2.34k 78.04%
16728 requests in 10.08s, 13.56MB read
Requests/sec: 1659.32
Transfer/sec: 1.35MB

Running 10s test @ https://raspberry/
6 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 125.46ms 68.90ms 767.34ms 72.52%
Req/Sec 1.06k 411.05 2.34k 74.57%
50618 requests in 10.09s, 23.36MB read
Requests/sec: 5016.59
Transfer/sec: 2.32MB
villivateur
2022-09-01 17:25:37 +08:00
你的 Nginx 是不是开启了某些自动保护?放 DDoS 那种
pastor
2022-09-01 18:37:48 +08:00
遇到这种现象一定要相信是自己的问题而不是 go 真的牛逼到可以吊打 c/cpp/rust
picone
2022-09-01 18:39:14 +08:00
@justanetizen nginx 是进程绑核的,才用 reactor 模型,并不是你说的多个进程在不同核中飘来飘去。
picone
2022-09-01 18:41:15 +08:00
BFE (一个用 Go 重写 nginx 的项目),压测比 nginx 差了一倍,事出反常必有妖。或者可以 nginx 开 debug 看看每个阶段的耗时?
dzdh
2022-09-01 19:17:12 +08:00
@picone nginx 的 debug 在哪里开
justanetizen
2022-09-01 19:28:21 +08:00
@picone 绑核和调度有关系么?
justanetizen
2022-09-01 19:29:05 +08:00
还一个原因,有可能是阿里云的机器在 80 端口有包过滤、防火墙之类的
justanetizen
2022-09-01 19:31:53 +08:00
说错了,443 端口,建议 OP 将两个程序 bind 到同一个端口压测
ngv2
2022-09-01 19:37:59 +08:00
在 nginx 的 server 里面的最后加上这个,reload ,再测下看看
location = / {
return 200 "404 not found";
}
access_log off;
adoal
2022-09-01 20:06:38 +08:00
建议先在自己本地机测试。云服务器或多或少有些保护措施。

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

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

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

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

© 2021 V2EX