tcp - 使用netty的低流量延迟更高
问题描述
在我们的生产环境中,出现了一个奇怪的问题:低流量时延迟更高。然后我用 Netty4 构建 Tcp Server 和 Client 并通过一个连接发送数据。每个请求是 100kB。qps(request per second)=1 的延迟远高于 qps=100 的延迟。条件:
- 服务器和客户端之间的 PING 延迟约为 2 毫秒。
- 选项 TCP_NODELAY 在两边都打开。
- 在服务器端,它将休眠 20 毫秒的 util 响应(模拟 prod 服务)。
测试结果:
- < 24ms,当 qps = 100(每个请求 100kB);
- > 35ms,当 qps = 1(每个请求 100kB);
- < 23ms,当 qps = 1(每个请求 1kB);
qps=1 时不同包大小的延迟
- ping延迟:1.66ms
- 100kB - 39ms
- 50kB - 32ms
- 20kB - 27.38ms
- 17kB - 26.15ms
- 15kB - 25.9ms
- 10kB - 22.62ms(可以接受)
我想找出低流量时性能不佳的原因。我想知道它是否是由某些 Tcp 选项引起的。
解决方案
最后,我们找出了这种高延迟低流量问题的原因。通过对不同包大小的测试,14KB 是转折点:如果包不大于 14KB,则延迟显示为预期,但如果包大小增加到 15KB,则延迟变差。所以我们尝试将 net.ipv4.tcp_init_cwnd 从 10 更新到 100,延迟下降,因为具有多个 TCP 包的请求可以包含在同一个滑动窗口中。
推荐阅读
- haskell - 为什么镜头包含用于 fromEnum/toEnum 的 Iso,但没有用于显示/读取的 Iso?
- css - Bootstrap 4 - align-items-* 类根本不起作用
- java - Extracting image src in HTML with jsoup
- r - 用带有对象的多行表达式注释 ggplot 图?
- reactjs - 使用 Graphql-dotnet 上传 Asp.net 核心文件
- django - “用户=验证(请求,用户名=用户名,密码=密码)”用户是无
- swift - How to create higher order functions in Swift?
- jquery - 如何在内联时让 2 个图像出现/消失
- tensorflow - Keras:矩阵大小不兼容:In[0]:[1,16384],In[1]:[1024,10]
- c# - 如何通过 USB 端口在两台计算机之间发送和接收字符串?C#