idealvin / coost

A tiny boost library in C++11.
Other
3.97k stars 561 forks source link

性能测试问题 #325

Closed bigbao9494 closed 1 year ago

bigbao9494 commented 1 year ago

使用 echo.cc 测试windows和linux平台性能差别巨大,测试:echo -c 100 -t 20

linux平台本机环回(虚拟机4核心4G内存): Speed: 386041 request/sec, 386041 response/sec Requests: 7720824 Responses: 7720824

windows平台本机环回(物理机16核心24G内存):CPU使用率占用也不高,不像LINUX平台中 Speed: 9023 request/sec, 9023 response/sec Requests: 180478 Responses: 180478

使用linux作服务端,windows作客户端,比windows平台本机环回还要差些。

bigbao9494 commented 1 year ago

@idealvin 这个问题有计划搞一下?

idealvin commented 1 year ago

1、更新co代码,重新测试:

xmake b echo
xmake r echo -s      # server
xmake r echo           # client

2、找个其他的网络库比较一下,看是 co 的问题,还是 windows 系统配置的原因

bigbao9494 commented 1 year ago

@idealvin 我用golang和ZLMediaKit(一个流媒体服务器)测试了windows没有问题,带宽有3GByte左右。 其实你可以在你的电脑上试一下,可能就知道原因了。

idealvin commented 1 year ago

现在 windows 机器用得少,我抽空在 windows 上试试

bigbao9494 commented 1 year ago

好的,期待中....

idealvin commented 1 year ago

好的,期待中....

这边有朋友用最新代码测的结果,windows 上单线程接近 6w req/s,你那个结果感觉有点离谱...

bigbao9494 commented 1 year ago

@idealvin 不太科学啊。现在WINDWOS平台上代码有点小问题,上次忘记和你交流了,你看下是否正确。就是说如果不修改问题多线程在windows下是跑不起来的。不修改时单线程我记不得有没有测试过,我一会儿测试一下。

windows平台echo.cc问题: 测试Linux平台没有任何问题,为了问题简单化使用Linux下的echo做服务端来解决windows下问题。发现client_fun函数中c.recvn/c.send会卡死。

原因是: 在执行c.recvn时没有数据会执行IoEvent::wait,IoEvent::wait会执行s->yield()切换协程,等到有数据时SchedulerImpl::loop中会执行 if (atomic_bool_cas(&info->state, st_wait, st_ready, mo_relaxed, mo_relaxed)) 这句判断,这里判断失败了导致下面 co::free(info, info->mlen) 把这个协程给释放了,其实是应该唤醒确变成了释放。

解决: 在IoEvent::wait中添加 _info->state = st_wait; 每次进入时重新初始化这个变量,真正的原因是sock_win.cc中recvn函数会出现循环接收,但是栈中变量IoEvent和_info.state却没有重新初始化,state是在上次接收时在SchedulerImpl::loop中被设置成1了,因为recvn函数中的循环两次进入IoEvent::wait时state为1,所以这里要重新初始化一下。

idealvin commented 1 year ago

mo_relaxed

按这个改后,用最新代码重测下

bigbao9494 commented 1 year ago

@idealvin 刚刚我仔细测试和分析了这个问题,确定根本原因就是如上描述。 1、为什么前几天的新echo.cc程序没有问题呢,是因为你修改了:DEF_int32(l, 1024, "message length"); 把数据大小修改成了1K,之前是4K,4K一定会出问题(修改成4K一测便知),1K没有造成 “sock_win.cc中recvn函数会出现循环接收” 所以能够测试通过。 2、1K时测试,只是测试通过了,无论是单线程或多线程性能还是一样有问题,你测试过的 “windows 上单线程接近 6w req/s” ,这点确实奇怪。 3、和 mo_relaxed 这个应该是没有关系的。

idealvin commented 1 year ago

1、windows co::recvn确实有这个bug,后续修复 2、echo将默认线程数改成了1,测试结果是服务端单线程的处理能力,可以用co_sched_num设置线程数

# server
echo -s -co_sched_num 2

# client 
echo -c 256 -co_sched_num 2

也可以用 -l 指定 message 长度,server、client -l 参数要保持一致

bigbao9494 commented 1 year ago

还有一个问题: windows 上单线程接近 6w req/s” 我测试无论怎样修改都是达不到这个值的,不管是几个线程都只有1W左右,希望能够确认一下 WIN10,24G内存,WIN64,WINDOWS下环回测试

idealvin commented 1 year ago

还有一个问题: windows 上单线程接近 6w req/s” 我测试无论怎样修改都是达不到这个值的,不管是几个线程都只有1W左右,希望能够确认一下 WIN10,24G内存,WIN64,WINDOWS下环回测试

测试结果有截图吗?

bigbao9494 commented 1 year ago

我又更换了其它WIN11的电脑测试了结果一样的。。。。 截图一会儿晚点上传,外网不太方便

bigbao9494 commented 1 year ago

1024_4-thread 4096_1-thread 1024_1-thread

idealvin commented 1 year ago

recvn 的问题已经修复了,更新coost代码,用release版本再测下性能

bigbao9494 commented 1 year ago

添加了:if (_info->state != xx::st_wait) _info->state = xx::st_wait; 是否可以直接,不用判断:_info->state = xx::st_wait;

bigbao9494 commented 1 year ago

1、下面2次都是RELEASE下测试的:(WIN) .\echo.exe -l 1024 -co_sched_num 1 -cout server: 127.0.0.1:9988 connection num: 128, msg len: 1024, time: 10 seconds speed: 39851 request/sec, 39851 response/sec requests: 398515 responses: 398515

.\echo.exe -l 1024 -co_sched_num 2 -cout server: 127.0.0.1:9988 connection num: 128, msg len: 1024, time: 10 seconds speed: 78639 request/sec, 78639 response/sec requests: 786397 responses: 786397

2、DEBUG版本约比RELEASE小 8% 。(WIN)

3、LINUX下虚拟机4核心:(DEBUG) ./echo -l 1024 -co_sched_num 1 -cout server: 127.0.0.1:9988 connection num: 128, msg len: 1024, time: 10 seconds speed: 194410 request/sec, 194410 response/sec requests: 1944109 responses: 1944109

./echo -l 1024 -co_sched_num 2 -cout server: 127.0.0.1:9988 connection num: 128, msg len: 1024, time: 10 seconds speed: 339128 request/sec, 339128 response/sec requests: 3391289 responses: 3391289

4、总结: LINUX下虚拟机DEBUG版本:194410 request/sec 和 339128 request/sec WIN下真机RELEASE版本: 39851 request/sec 和 78639 request/sec

idealvin commented 1 year ago

windows就这样了,不能跟linux比