< 返回版块

lithbitren 发表于 2020-12-21 00:04

Tags:异步,协程,async

我在actix里面试着用了休眠,结果超过100就不能异步了,一开始还以为是最大连接数的问题,但调了也没用,试了自带的actix_web::rt::time::delay_for,async-std的async_std::task::sleep都是这样,用tokio的休眠貌似不兼容。后来用tokio手撕了一个tcpsocket的简易http-helloworld服务,然后用tokio睡眠,还是一样最多同时休眠100个协程,实在搞不清楚是这么回事。

async fn index(_req: HttpRequest) -> &'static str {
    // sleep(Duration::from_secs(5)).await;
    // task::sleep(Duration::from_secs(5)).await;
    actix_web::rt::time::delay_for(Duration::from_secs(5)).await;
    "Hello world!"
}

actix路由句柄如上,本地100并发就是5秒返回,101并发就是10秒返回,1000并发就得50秒才能全部返回。

以前在win10用python3.7写fastapi的时候也遇到过,最大不超过512的协程连接数,改Linux或升3.8就解决了。

现在rust不知道是不是操作系统的问题还是我哪里没设置对的问题,求大佬解惑。

linux暂时没试,不知道在linux里面会不会正常。

评论区

写评论
作者 lithbitren 2020-12-22 03:19

都是开release的本地连接,根据网站测试结果不应该这么久吧,而且actix比我手撕的简易http还快,就是那种只要有链接就返回b"HTTP/1.1 200 OK\r\n\r\nhello_world!"的虚假服务,得快一倍,但和网测还是有差距。。

--

然后拿reqwest测了测actix单线程的hello-world,连接数连接多少都没多大问题,但一万协程并发actix连接收到带返回得要2-6秒不等,和www.techempower.com/benchmarks测试怎么差这么多。。。

疑惑了。

作者 lithbitren 2020-12-22 03:13

我傻了,又是python的问题,我用的是3.9的aiohttp异步请求,不知道哪里设置了默认100连接,查了下也不会调,可能又是上linux搞不好就正常了。

用tokio写了不用socket的纯休眠一点问题没有,客户端换了reqwest的并发也完全没问题,10000并发服务端休眠5秒,整体发送加返回时间在10秒左右。

用云服务器测了下reqwest单线程每秒入包最高能有近8000包,单机全核能有几万,python的aiohttp协程发包也能发出近3000包,单机全核多进程也能有近9000包,不晓得到底是咋回事,为啥aiohttp连接本地的actix就只能连100。

然后拿reqwest测了测actix单线程的hello-world,连接数连接多少都没多大问题,但一万协程并发actix连接收到带返回得要2-6秒不等,和www.techempower.com/benchmarks测试怎么差这么多。。。

疑惑了。

--
👇
spacemeowx2: 你这个。。我觉得不是休眠的问题,异步框架的sleep基本都是维护一个堆再用操作系统的休眠的。

你这个情况我认为大概率是TCP最大连接数被限制了

spacemeowx2 2020-12-21 02:22

你这个。。我觉得不是休眠的问题,异步框架的sleep基本都是维护一个堆再用操作系统的休眠的。

你这个情况我认为大概率是TCP最大连接数被限制了

1 共 3 条评论, 1 页