异步服务器真正的优势是什么?这篇写一个最小的 tokio 回显服务,在同一台机器上与「每连接一线程」对比三个数字:能撑多少连接、占多少线程与内存、单连接的延迟。
服务端:一个连接结束,共回显 5 字节(对端 IP 127.0.0.1)
客户端:发 "hello" 收 "hello"
服务端:一个连接结束,共回显 10 字节(对端 IP 127.0.0.1)
客户端:发 "tokio echo" 收 "tokio echo"阻塞式 TCP 与线程版见TCP Listener 与 TcpStream;非阻塞与 poll 见非阻塞 IO。tokio 1.x 从 crates.io 下载。
tokio:建立并保持 3000 个连接用时 162 ms;其中 1000 个各做一次回显往返用时 7 ms,1000 个正确
线程数 5 → 5(tokio 工作线程 + 主线程等),RSS 2 MB → 5 MB 线程服务:建立 1507 个连接用时 393 ms,第 1507 个失败:Connection reset by peer (os error 54)
线程数 1 → 1509,RSS 2 MB → 29 MB线程数与 RSS 通过 ps 读取;失败位置与系统限制有关,换机器会不同。
tokio 服务端 平均往返 22.9 µs
线程服务端 平均往返 20.3 µs异步运行时的调度见Tokio 任务调度。