Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

benchmark: 希望增加连接数较大的数据对比 #906

Closed
lesismal opened this issue May 14, 2022 · 31 comments
Closed

benchmark: 希望增加连接数较大的数据对比 #906

lesismal opened this issue May 14, 2022 · 31 comments

Comments

@lesismal
Copy link

lesismal commented May 14, 2022

我本地跑了下 http_server,机器是4c8t,给server设置了4线程

env

ubuntu@ubuntu:~/workflow/benchmark$ cat /etc/issue
Ubuntu 20.04 LTS \n \l

ubuntu@ubuntu:~/workflow/benchmark$ cat /proc/cpuinfo | grep processor
processor	: 0
processor	: 1
processor	: 2
processor	: 3
processor	: 4
processor	: 5
processor	: 6
processor	: 7
ubuntu@ubuntu:~/workflow/benchmark$ ./http_server 4 9000 32

200连接数时表现很棒

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c200 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   574.13us    1.03ms  22.70ms   97.01%
    Req/Sec    98.28k     8.84k  131.17k    73.07%
  Latency Distribution
     50%  384.00us
     75%  579.00us
     90%    0.85ms
     99%    5.90ms
  3921936 requests in 10.10s, 647.06MB read
Requests/sec: 388303.50
Transfer/sec:     64.06MB
ubuntu@ubuntu:~/workflow/benchmark$ top -d 1 | grep _server
  63161 ubuntu    20   0 1781400   5612   4548 S 276.0   0.1   0:02.76 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   5612   4548 S 465.3   0.1   0:07.46 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   5872   4548 S 467.0   0.1   0:12.13 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 458.4   0.1   0:16.76 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 469.0   0.1   0:21.45 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 457.4   0.1   0:26.07 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 468.0   0.1   0:30.75 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 461.4   0.1   0:35.41 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 463.0   0.1   0:40.04 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 465.3   0.1   0:44.74 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400   6132   4548 S 194.0   0.1   0:46.68 http_server 

20k连接数时表现不及预期

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c20000 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    32.63ms   18.67ms 299.99ms   71.61%
    Req/Sec     6.63k     6.71k   37.35k    89.16%
  Latency Distribution
     50%   30.52ms
     75%   42.46ms
     90%   55.49ms
     99%   86.61ms
  244113 requests in 10.13s, 40.28MB read
  Socket errors: connect 0, read 1300855, write 0, timeout 0
Requests/sec:  24091.07
Transfer/sec:      3.97MB
  63161 ubuntu    20   0 1781400  14740   4548 S 167.0   0.2   0:48.35 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  16456   4612 S 261.4   0.2   0:50.99 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  16468   4612 S 193.3   0.2   0:51.28 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  16468   4612 S 200.0   0.2   0:51.62 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15200   4612 S 208.0   0.2   0:53.70 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15200   4612 S 195.0   0.2   0:55.67 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15308   4612 S 187.0   0.2   0:57.54 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15696   4612 S 184.2   0.2   0:59.40 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15960   4612 S 185.0   0.2   1:01.25 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  16024   4612 S 186.1   0.2   1:03.13 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15984   4612 S 184.2   0.2   1:04.99 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15984   4612 S 185.0   0.2   1:06.84 http_server                                                                                                                               
  63161 ubuntu    20   0 1781400  15984   4612 S   4.0   0.2   1:06.88 http_server                                                                                                                               

如何优化

连接数较大时cpu利用率下降、相对的性能下降也比较明显。
使用是默认的代码、没做修改,是否能够通过修改配置或代码来进行优化?

@lesismal
Copy link
Author

相同环境,对比了下我自己go框架版本的:

package main

import (
	"crypto/rand"
	"fmt"
	"net/http"
	"os"
	"os/signal"
	"time"

	"github.com/lesismal/nbio/nbhttp"
)

var (
	data = make([]byte, 32)
)

type HttpHandler struct{}

func (h *HttpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Header().Add("Date", time.Now().Format(time.RFC1123)) //"Mon, 02 Jan 2006 15:04:05 MST"
	w.Header().Add("Content-Type", "text/plain; charset=UTF-8")
	w.Write(data)
}

func main() {
	rand.Read(data)

	svr := nbhttp.NewServer(nbhttp.Config{
		Network: "tcp",
		Addrs:   []string{"localhost:8888"},
		NPoller: 4,
		Handler: &HttpHandler{},
	})

	err := svr.Start()
	if err != nil {
		fmt.Printf("nbio.Start failed: %v\n", err)
		return
	}
	defer svr.Stop()

	interrupt := make(chan os.Signal, 1)
	signal.Notify(interrupt, os.Interrupt)
	<-interrupt
}

200连接数

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c200 --timeout 8 -t4 http://127.0.0.1:8888
Running 10s test @ http://127.0.0.1:8888
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   819.47us    1.36ms  25.33ms   93.47%
    Req/Sec    85.61k    10.85k  112.94k    67.00%
  Latency Distribution
     50%  448.00us
     75%  836.00us
     90%    1.60ms
     99%    7.55ms
  3409325 requests in 10.01s, 484.46MB read
Requests/sec: 340599.12
Transfer/sec:     48.40MB
ubuntu@ubuntu:~/workflow/benchmark$ top -d 1 | grep _server
  67665 ubuntu    20   0 2106524  54348   5660 S 303.0   0.7   0:26.98 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  54348   5660 S 433.0   0.7   0:31.31 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  53600   5660 S 427.7   0.7   0:35.63 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  53600   5660 S 425.0   0.7   0:39.88 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  55404   5660 S 418.8   0.7   0:44.11 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  54792   5660 S 434.0   0.7   0:48.45 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  54792   5660 R 427.7   0.7   0:52.77 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  53168   5660 R 420.0   0.7   0:56.97 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  54476   5660 R 422.8   0.7   1:01.24 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  53080   5660 R 431.0   0.7   1:05.55 go_server                                                                                                                                 
  67665 ubuntu    20   0 2106524  53080   5660 S 106.9   0.7   1:06.63 go_server

20k连接数

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c20000 --timeout 8 -t4 http://127.0.0.1:8888
Running 10s test @ http://127.0.0.1:8888
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    80.88ms   35.35ms 358.53ms   68.47%
    Req/Sec    49.74k    10.34k   91.54k    71.07%
  Latency Distribution
     50%   77.24ms
     75%  103.26ms
     90%  127.54ms
     99%  175.82ms
  1930526 requests in 10.07s, 274.32MB read
Requests/sec: 191790.50
Transfer/sec:     27.25MB
  67665 ubuntu    20   0 2106524  54132   5660 R  44.6   0.7   1:07.08 go_server                                                                                                                                 
  67665 ubuntu    20   0 2107644 100180   5660 S 466.3   1.2   1:11.79 go_server                                                                                                                                 
  67665 ubuntu    20   0 2323080 111464   5724 S 476.0   1.4   1:16.55 go_server                                                                                                                                 
  67665 ubuntu    20   0 2323768 127076   5724 S 469.3   1.6   1:21.29 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324408 130948   5724 S 469.0   1.6   1:25.98 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324408 129652   5724 S 467.3   1.6   1:30.70 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324472 154580   5724 S 443.6   1.9   1:35.18 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324536 134668   5724 S 446.0   1.7   1:39.64 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324536 129472   5724 S 436.6   1.6   1:44.05 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324536 127012   5724 S 438.6   1.6   1:48.48 go_server                                                                                                                                 
  67665 ubuntu    20   0 2324536 121236   5724 S 347.5   1.5   1:51.99 go_server 

@Barenboim
Copy link
Contributor

哈哈哈。感谢帮我做这个benchmark。
有必要解释我们的一些数据。我们之前确实没有公开全部测试数据。我们做过与nginx的对比,发现在几百到几千并发的时候,我们任何情况下都完胜ngnix。但是在几万并发时,ngnix的性能几乎没有太多下滑,而我们的情况,如你所测……
正如你所说,所有人的benchmark结果都是自己最好😓 我们在这里,选择的是一个实际后端业务中比较典型的并发,也就是几百到几千的范围,上万并发一般不常见。可以说我们测试选择的并发,是一个有利与我们的区间,但也符合实际业务需求。另外,似乎在任何并发下,我们都优与brpc,无论是http还是rpc。
不过,你提出了一个很重要的问题,为什么我们在10K以上不如nginx。我怀疑与nginx多进程有关。你能不能也试一下我们的多进程server表现?
#891

@Barenboim
Copy link
Contributor

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

@Barenboim
Copy link
Contributor

Barenboim commented May 14, 2022

我知道了,我们的server不调参数的情况下,默认2000并发。超过了,就关连接了。需要调节一下:

WFServerParams params = HTTP_SERVER_PARAMS_DEFAULT;
params.max_connections = 30000;
WFHttpServer server(&params, process);
...

@lesismal
Copy link
Author

不过,你提出了一个很重要的问题,为什么我们在10K以上不如nginx。我怀疑与nginx多进程有关。你能不能也试一下我们的多进程server表现?

这个白天再搞了,正准备睡了,你们也是这么晚不睡啊,哈哈哈

@Barenboim
Copy link
Contributor

哈哈,我还没有那么早。感谢帮我们实验啊。
到时候改一下server最大连接数就好呀,先不用多进程了:)

@lesismal
Copy link
Author

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

qps已经下降了很多了呀:joy:

latancy不能完全反应出并发量,主要看单个请求的latancy是否跟server处理这单个请求时的阻塞程度,如果server阻塞了则cpu利用率就下降了,然后处理其他请求就也慢、并发量自然就下降了,我估计你们高连接数时下降就是这个原因导致的

我的是golang runtime在调度,协程数量充足,runtime抢占式效率还行,所以处理单个请求并不会因为单个请求阻塞而让cpu空闲太多导致利用率下降,只要cpu跑的欢,并发量就还能得以保持

@lesismal
Copy link
Author

哈哈,我还没有那么早。感谢帮我们实验啊。 到时候改一下server最大连接数就好呀,先不用多进程了:)

多交流互相促进就好。

等我闲了也学习研究下你们的代码,主要想看下IO线程和逻辑线程、消息处理的同步异步之类的细节,很久没搞cpp了,而且我自己主要是用c++11之前的。
搞cpp推荐洗米水洗头,能保护秀发,哈哈哈

@holmes1412
Copy link
Contributor

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

猜测可能是go的异步是语言级别的调度,所以即使latency上去了,go依然可以通过workstealing的方式把qps做得很好。

@lesismal
Copy link
Author

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

猜测可能是go的异步是语言级别的调度,所以即使latency上去了,go依然可以通过workstealing的方式把qps做得很好。

cpp肯定能做到比go快,主要看IO和逻辑线程池、同步异步的配合细节了。
cpp太怕某个操作就阻塞了哪怕一点点时间,因为cpp线程数量少、并发流太少,一点点的阻塞就是很大占比的延迟

@Barenboim
Copy link
Contributor

哈哈,我还没有那么早。感谢帮我们实验啊。 到时候改一下server最大连接数就好呀,先不用多进程了:)

多交流互相促进就好。

等我闲了也学习研究下你们的代码,主要想看下IO线程和逻辑线程、消息处理的同步异步之类的细节,很久没搞cpp了,而且我自己主要是用c++11之前的。 搞cpp推荐洗米水洗头,能保护秀发,哈哈哈

我们这个cpp简单又护发的。

@Barenboim
Copy link
Contributor

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

猜测可能是go的异步是语言级别的调度,所以即使latency上去了,go依然可以通过workstealing的方式把qps做得很好。

应该是我们max connections没调的原因。主要我看到我们20K那个测试很多Socket error,连接被我们关了。我也记得20K没下降得这么离谱😂

@lesismal
Copy link
Author

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

猜测可能是go的异步是语言级别的调度,所以即使latency上去了,go依然可以通过workstealing的方式把qps做得很好。

应该是我们max connections没调的原因。主要我看到我们20K那个测试很多Socket error,连接被我们关了。我也记得20K没下降得这么离谱😂

酱紫啊:joy:,需要怎么改下最大连接数的,我再跑跑看

@Barenboim
Copy link
Contributor

为什么你的server在20K的情况下,Latency不太好但qps却比较高?

猜测可能是go的异步是语言级别的调度,所以即使latency上去了,go依然可以通过workstealing的方式把qps做得很好。

应该是我们max connections没调的原因。主要我看到我们20K那个测试很多Socket error,连接被我们关了。我也记得20K没下降得这么离谱😂

酱紫啊😂,需要怎么改下最大连接数的,我再跑跑看

WFServerParams params = HTTP_SERVER_PARAMS_DEFAULT;
params.max_connections = 30000;
WFHttpServer server(&params, process);

@lesismal
Copy link
Author

我改成30w了,正常了:

200

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c200 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   574.73us    1.05ms  19.58ms   96.79%
    Req/Sec    99.76k     9.86k  123.00k    67.75%
  Latency Distribution
     50%  374.00us
     75%  564.00us
     90%  834.00us
     99%    6.21ms
  3972666 requests in 10.01s, 655.43MB read
Requests/sec: 396710.13
Transfer/sec:     65.45MB

20k

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c20000 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.96ms    1.87ms  44.18ms   90.63%
    Req/Sec    98.96k    31.18k  195.89k    67.84%
  Latency Distribution
     50%    1.47ms
     75%    2.43ms
     90%    3.73ms
     99%    9.52ms
  3936124 requests in 10.09s, 649.40MB read
  Socket errors: connect 18983, read 0, write 0, timeout 0
Requests/sec: 390086.10
Transfer/sec:     64.36MB

100k

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c100000 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 100000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.95ms    1.62ms  27.62ms   86.82%
    Req/Sec    99.63k    56.37k  203.55k    56.12%
  Latency Distribution
     50%    1.59ms
     75%    2.42ms
     90%    3.58ms
     99%    8.32ms
  3738175 requests in 10.04s, 616.75MB read
  Socket errors: connect 98983, read 0, write 0, timeout 0
Requests/sec: 372448.68
Transfer/sec:     61.45MB

@lesismal
Copy link
Author

发现在几百到几千并发的时候,我们任何情况下都完胜ngnix。但是在几万并发时,ngnix的性能几乎没有太多下滑,而我们的情况,如你所测……

但是max connections改好了之后,没有太明显下降啊,应该还是比nginx强吧:joy:。。。

@Barenboim
Copy link
Contributor

哈哈哈。这个数据很开心:)
谢谢了!先不打扰你休息。

@lesismal
Copy link
Author

哈哈哈。这个数据很开心:) 谢谢了!先不打扰你休息。

晚安了,这个close了先,workflow性能很赞!

@Barenboim
Copy link
Contributor

发现在几百到几千并发的时候,我们任何情况下都完胜ngnix。但是在几万并发时,ngnix的性能几乎没有太多下滑,而我们的情况,如你所测……

但是max connections改好了之后,没有太明显下降啊,应该还是比nginx强吧😂。。。

可能那次也是我们忘了调😓

@lesismal
Copy link
Author

发现在几百到几千并发的时候,我们任何情况下都完胜ngnix。但是在几万并发时,ngnix的性能几乎没有太多下滑,而我们的情况,如你所测……

但是max connections改好了之后,没有太明显下降啊,应该还是比nginx强吧😂。。。

可能那次也是我们忘了调😓

那这个得算我辅助上分了,哈哈哈

@Barenboim
Copy link
Contributor

20k和100k的测试,我觉得数据有点问题……
为什么20K时,connect error为18983,100K为98983。 这数字也太巧合了,是不是都只建立了1017连接?毕竟,100K的测试我们是需要改一个东西的,否则fd上限固定到65536了,不可能建立10万连接。
我们同一个listen fd上的accept是在一个线程上执行的,如果同时大量connect进来,不排除会处理不过来,导致部分connect失败。但是只成功建立了1017个连接,又感觉有点少。从Latency上看,像是1000连接的latency……
我自己也试一下。

@Barenboim
Copy link
Contributor

Barenboim commented May 14, 2022

我知道了,可能是你测试间隔太短,大量端口还没有被系统回收,连接建立不起来。或者你不小心把server进程max open files设置为1024了?
我这边比较靠谱的200到28K测试:

200

Running 10s test @ http://127.0.0.1:8888
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   600.79us    4.51ms 201.79ms   99.85%
    Req/Sec   105.29k     4.76k  119.26k    84.50%
  Latency Distribution
     50%  452.00us
     75%  483.00us
     90%  510.00us
     99%  563.00us
  4190080 requests in 10.00s, 351.65MB read
Requests/sec: 418979.09
Transfer/sec:     35.16MB

2K

Running 10s test @ http://127.0.0.1:8888
  4 threads and 2000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    14.12ms   98.07ms   1.79s    98.50%
    Req/Sec   106.02k     4.63k  134.22k    89.50%
  Latency Distribution
     50%    4.45ms
     75%    4.75ms
     90%    4.95ms
     99%  349.56ms
  4221853 requests in 10.02s, 354.31MB read
Requests/sec: 421177.80
Transfer/sec:     35.35MB

20K

 Running 10s test @ http://127.0.0.1:8888
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    38.02ms  108.67ms   7.30s    99.07%
    Req/Sec    74.85k     7.82k  105.91k    82.04%
  Latency Distribution
     50%   32.36ms
     75%   33.22ms
     90%   37.81ms
     99%  108.01ms
  2954449 requests in 10.03s, 247.95MB read
Requests/sec: 294448.52
Transfer/sec:     24.71MB

28K

Running 10s test @ http://127.0.0.1:8888
  4 threads and 28000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    74.38ms  340.72ms   7.31s    98.51%
    Req/Sec    79.11k     7.18k  115.34k    76.52%
  Latency Distribution
     50%   40.37ms
     75%   41.89ms
     90%   45.32ms
     99%    1.14s 
  3123645 requests in 10.10s, 262.15MB read
Requests/sec: 309411.75
Transfer/sec:     25.97MB

超过30K的话,单个wrk进程就无端口可用了,连接无法建立。
可以看出,我们在数千连接时,性能最优。数万连接,性能有所下降,但在可接受范围(nginx好像确实几万连接时,比我们好一点)。 @lesismal

@lesismal
Copy link
Author

lesismal commented May 15, 2022

20k和100k的测试,我觉得数据有点问题…… 为什么20K时,connect error为18983,100K为98983。 这数字也太巧合了,是不是都只建立了1017连接?毕竟,100K的测试我们是需要改一个东西的,否则fd上限固定到65536了,不可能建立10万连接。 我们同一个listen fd上的accept是在一个线程上执行的,如果同时大量connect进来,不排除会处理不过来,导致部分connect失败。但是只成功建立了1017个连接,又感觉有点少。从Latency上看,像是1000连接的latency…… 我自己也试一下。

哦对,100k的是没有端口可用的,但是20k的应该是没问题的,难道我记错了?但是go的代码是同一个目录同一个终端、http_server关闭后同一个终端启动的go_server然后go的好像是正常的。。。

或者你不小心把server进程max open files设置为1024了?

我应该都是 ulimit -n 1000000 了的

@lesismal
Copy link
Author

go_server的测试没有报 Socket errors,会不会是跟http_server的acceptor有关?
但是我又跑了下20k,确实是比200下降了不少,netstat查看了连接数量是正常的:

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d30 -c200 --timeout 8 -t4 http://127.0.0.1:9000
Running 30s test @ http://127.0.0.1:9000
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   567.03us    1.07ms  22.27ms   96.69%
    Req/Sec   101.60k    13.16k  148.35k    74.83%
  Latency Distribution
     50%  362.00us
     75%  550.00us
     90%  823.00us
     99%    6.41ms
  12134767 requests in 30.03s, 1.96GB read
Requests/sec: 404057.05
Transfer/sec:     66.66MB
ubuntu@ubuntu:~/wrk$
ubuntu@ubuntu:~/wrk$ ./wrk --latency -d30 -c20000 --timeout 8 -t4 http://127.0.0.1:9000
Running 30s test @ http://127.0.0.1:9000
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    60.19ms   30.54ms 290.17ms   70.95%
    Req/Sec    59.12k    15.97k  100.87k    68.30%
  Latency Distribution
     50%   55.61ms
     75%   74.30ms
     90%  100.77ms
     99%  159.24ms
  6844898 requests in 30.10s, 1.10GB read
Requests/sec: 227374.27
Transfer/sec:     37.51MB
ubuntu@ubuntu:~$ netstat -ntp | grep _server | grep ESTAB | wc -l 
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
20000

@lesismal
Copy link
Author

lesismal commented May 15, 2022

我又试了下,把 wrk 终端 ulimt -n 1024 了并且只测10s,然后确实跟昨天一样吞吐量跟200差不多但是有 Socket errors

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d10 -c20000 --timeout 8 -t4 http://127.0.0.1:9000
Running 10s test @ http://127.0.0.1:9000
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.94ms    1.80ms  26.97ms   89.68%
    Req/Sec    97.42k    38.16k  199.68k    68.51%
  Latency Distribution
     50%    1.43ms
     75%    2.39ms
     90%    3.79ms
     99%    9.27ms
  3863010 requests in 10.09s, 637.34MB read
  Socket errors: connect 18983, read 0, write 0, timeout 0
Requests/sec: 382937.20
Transfer/sec:     63.18MB

再测30s,吞吐量也还是比较高

ubuntu@ubuntu:~/wrk$ ./wrk --latency -d30 -c20000 --timeout 8 -t4 http://127.0.0.1:9000
Running 30s test @ http://127.0.0.1:9000
  4 threads and 20000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.01ms    1.87ms  39.86ms   89.25%
    Req/Sec    93.31k    33.93k  209.72k    67.03%
  Latency Distribution
     50%    1.46ms
     75%    2.51ms
     90%    4.00ms
     99%    9.62ms
  11115514 requests in 30.07s, 1.79GB read
  Socket errors: connect 18983, read 0, write 0, timeout 0
Requests/sec: 369597.43
Transfer/sec:     60.98MB

昨天的高吞吐估计确实是我在修改max connections 30w后,不小心开了新的终端测试忘记了 ulimit -n 1000000 了。。

昨天半夜只看了吞吐量、qps,没注意到 Socket errors,但是测试时间对吞吐量造成影响不是那么明显,应该是wrk异步建立连接、成功后才会去使用、但即使失败了也不影响已经建立的连接的吞吐量,而建立连接在测试过程中的占比不高。wrk自己被ulimit了,所以没有对server的acceptor造成压力消耗

@lesismal
Copy link
Author

那我reopen了,咱继续调查:joy:

@lesismal lesismal reopened this May 15, 2022
@lesismal
Copy link
Author

lesismal commented May 15, 2022

刚才开始阅读了一点源码,发现这里似乎存在一些问题:
https://github.com/sogou/workflow/blob/master/src/kernel/Communicator.cc#L1372

struct poller_params params = {
	.max_open_files		=	65536,
	.create_message		=	Communicator::create_message,
	.partial_written	=	Communicator::partial_written,
	.callback			=	Communicator::callback,
	.context			=	this
};

max_open_files写死了,并且后续的nodes_buf、poller accept后对fd的判断,都被这个值限制了。但max_open_files其实并不是最大65535。65535只是一对IP的套接口数量的限制,因为两个IP和server port都是固定,剩下的可变的只能是client port,short类型所以才受这个限制。但如果client是来自多个IP、每个client IP都能一组,就可以远大于这个值。
我暂时没找到应用层能够修改、配置这个值的方法,如果目前不能修改,建议还是把这个放开来支持更大的场景范围,因为有的厂商就是会搞单机50w100w甚至更高连接数

@Barenboim
Copy link
Contributor

18983 connect errors的,应该是你吧http_server的ulimit -n设置为1024了吧?不是程序的问题。这个数字太规律了。
Communicator里写死65536,主要是我们很少有超过这个限制的应用。我看看要不要改一下。

@lesismal
Copy link
Author

18983 connect errors的,应该是你吧http_server的ulimit -n设置为1024了吧?不是程序的问题。这个数字太规律了。

对,应该是我新开的窗口忘记ulimit改大了,前面这里用大的和1024的值测试确认了1024时候的现象与错误结果吻合:
#906 (comment)

@lesismal
Copy link
Author

lesismal commented May 15, 2022

哈哈,我还没有那么早。感谢帮我们实验啊。 到时候改一下server最大连接数就好呀,先不用多进程了:)

多交流互相促进就好。
等我闲了也学习研究下你们的代码,主要想看下IO线程和逻辑线程、消息处理的同步异步之类的细节,很久没搞cpp了,而且我自己主要是用c++11之前的。 搞cpp推荐洗米水洗头,能保护秀发,哈哈哈

我们这个cpp简单又护发的。

只要是c++,就没有护发的啊,今天看了几小时c++感觉比我平时看go几天都累:joy:
但是go的性能,目前无论如何也没法突破进入第一梯队c/cpp/rust了,哎

@Barenboim
Copy link
Contributor

刚才开始阅读了一点源码,发现这里似乎存在一些问题: https://github.com/sogou/workflow/blob/master/src/kernel/Communicator.cc#L1372

struct poller_params params = {
	.max_open_files		=	65536,
	.create_message		=	Communicator::create_message,
	.partial_written	=	Communicator::partial_written,
	.callback			=	Communicator::callback,
	.context			=	this
};

max_open_files写死了,并且后续的nodes_buf、poller accept后对fd的判断,都被这个值限制了。但max_open_files其实并不是最大65535。65535只是一对IP的套接口数量的限制,因为两个IP和server port都是固定,剩下的可变的只能是client port,short类型所以才受这个限制。但如果client是来自多个IP、每个client IP都能一组,就可以远大于这个值。 我暂时没找到应用层能够修改、配置这个值的方法,如果目前不能修改,建议还是把这个放开来支持更大的场景范围,因为有的厂商就是会搞单机50w100w甚至更高连接数

#909
这么改了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants