- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 Linux 上尝试调整 TCP 缓冲区大小,但各种结果让我感到困惑。
测试程序包括服务器和客户端。服务器简单地监听一个端口,等待客户端从映射文件发送数据。使用 recv
将接收到的数据复制到应用程序缓冲区中,然后将其丢弃。发送数据时,客户端使用 send
并将映射缓冲区的完整大小作为初始参数。
程序在来自两个不同数据中心的两个节点上运行,它们之间的 ping 响应时间约为 9 毫秒。两个节点都安装了两个千兆以太网 Controller 。最大吞吐量为 256 MB/s,发送/接收缓冲区大小的适当设置应约为 256 MB/s * 0.09 s ~ 2415919 字节。
我做了几个实验。
在第一次运行中,我运行了一个服务器实例和一个客户端实例。我没有设置发送缓冲区或接收缓冲区的大小,让内核自动调整它们。本案例的目的是为其他实验建立基线。
此设置中的实际吞吐量约为 117 MB/s。在这种情况下,一对服务器和客户端仅使用一个 eithernet Controller 。检查 ifconfig
,我发现大多数数据包都通过 eth0
和 eth1
之间的单个接口(interface)。
然后我尝试了两个服务器和两个客户端,这次吞吐量上升到大约 225 MB/s,更接近理想的最大吞吐量。
这是第一个让我困惑的问题:
为什么我需要多个进程才能用完带宽? FWIW,下面是 /proc/net/bonding/bond0
的一部分:
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
然后我为一对服务器和客户端尝试了几种发送/接收缓冲区大小的组合。下表总结了结果:
| send buf size | recv buf size | throughput | comment |
| (client) | (server) | (MB/s) | |
| 1048576 | - | 51.5 | |
| 2621400 | - | 48.6 | server uses autotuning |
| 524288 | - | 43.3 | |
| 8388608 | - | 36.3 | |
| 2621400 | 2621400 | 33.0 | somewhat the theory value |
| - | 2621400 | 30.4 | client uses autotuning |
| 4194304 | - | 30.3 | |
| 262144 | - | 29.1 | |
| - | 1048576 | 27.9 | |
| 6291456 | 6291456 | 26.5 | |
| 8388608 | 8388608 | 23.9 | |
| 6291456 | - | 22.2 | |
| - | 4194304 | 20.8 | |
| 1048576 | 1048576 | 19.8 | |
| 4194304 | 4194304 | 19.3 | |
| - | 8388608 | 19.3 | |
| - | 6291456 | 13.8 | |
以下是从上表中提出的其他几个问题:
提前致谢。
最佳答案
我对几个问题的分析。
需要注意的一件事是,即使链接速度为 1 Gbits/sec(128MBps),但由于在操作系统上运行,我们永远不会直接获得相同的吞吐量。应用程序/内核延迟导致链接空闲,因此我们获得较少的吞吐量。
Why do I need more than one process to use up the bandwidth?
/proc/net/bonding/bond0
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
如绑定(bind)接口(interface)信息中所述,拾取一个从站取决于 L3 header (IP src 和 dst)和 L4 header (src 和 dst 端口)。在您运行多个客户端应用程序的情况下,您实际上使用不同的 src 端口,因此可能会选择不同的从站,这与拥有单个应用程序的情况不同。检查这个wiki用于传输哈希策略。
- Why does the theory value not result in the best throughput (117 MB/s)?
如前所述,在操作系统上运行时很难获得链接速度。尝试使用 UDP 而不是 TCP,您可以看到您更接近链接速度。 TCP 具有较低的吞吐量,因为 TCP 是可靠的,因此缓存数据,有时依赖于定时器触发器(低频定时器)来传输数据包。尝试使用 TCP_NODELAY 选项要求 tcp 堆栈在应用程序调用 sendmsg() 后立即发送数据你也可以试试 iperf测量 TCP/UDP 吞吐量的应用程序,它具有在同一套接字上运行多个线程的选项。
- Why is the best result (51.5 MB/s) still not as good as the result of kernel autotuning (117 MB/s)?
不确定,但可能是因为,我看到内核通过调用 tcp_sndbuf_expand() 调整 sk_sndbuf通常基于服务器传播的 TCP 窗口大小。因此它会根据指标(如拥塞、服务器处理时间等)不断更改 sndbuf 大小
关于TCP 缓冲区大小和以太网绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34133568/
我正在寻找的服务器是: 轻量级, 非 buggy , 支持.NET, 在客户端上运行以进行测试, 在Windows上运行 Cassinni太过马车,IIS太昂贵,Apache很难安装,XSP仅是lin
所以我有大约10个短的css文件,可以与mvc应用程序一起使用。 有像 error.css login.css 等等... 仅有一些非常短的CSS文件,这些文件使更新和编辑变得容易(至少对我而言)。我
我正在编写程序来自动化 win32 表单。我正在使用 Microsoft UI 自动化库。我不知道如何获取和调用该表单上的预定义快捷键。现在我只需获取 MenuItem 的 AutomationEle
我有一个在后台线程上运行的及时操作。运行时,我当前将光标置于等待状态: Mouse.OverrideCursor = Cursors.Wait 我刚刚实现了一项功能,允许用户在厌倦等待时单击“取消”按
如何找到所有可能直接或间接调用给定方法的单元测试?当我更改方法时,我希望知道要运行的最佳测试;必须有一个工具! 因为我们有很多接口(interface),所以我对所有调用接口(interface)方法
我想知道,一个类会被装箱吗?我一直假设每个类都有一个虚拟表,可以用来标识类,所以它需要装箱吗? 最佳答案 只有值类型(结构)被装箱。类实例不会被装箱。 关于.net - 类是盒装的吗? 。网,我们在S
所以接下来有一个按钮调用(页面)。它的 href 链接是 site/blah/#。所以我知道它真正运行的 javascript 代码。在我解析完第一页后,我想解析下一页。我如何模拟鼠标点击,以便我可以
我想知道是否有人对解决以下设计问题有好的建议/模式。我有一个命令类的层次结构。在最抽象的层面上,我有一个 ICommand 接口(interface)。执行 ICommand 的 RunCommand
我在资源(xsd 文件)中有几个文件可用于验证收到的 xml 消息。我使用的资源文件名为 AppResources.resx,它包含一个名为 clientModels.xsd 的文件。当我尝试使用这样
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
(最后的简短版本) 我目前正在开发的软件需要跟踪任意数量的 MS Office 文件,现在需要提供将所有这些文件一起打印的功能,以及一些应用程序数据(可能会发送到打印机作为 .xps、.html 或
我想在不指定命名空间或程序集的情况下按名称(字符串)实例化一个类。像这样(Unity 语法): var processor = container.Resolve("SpecialProcessor"
我有一些代码可以对 64 位整数进行大量比较,但是它必须考虑数字的长度,就好像它被格式化为字符串一样。我无法更改调用代码,只能更改函数。 最简单的方法(除了 .ToString().Length 之外
使用遗留代码,我发现我有很多这样的语句(超过 500 个) bool isAEqualsB = (a == b) ? true : false; 这样重写有意义吗? bool isAEqualsB =
我有这个: AudioPlayer player = new AudioPlayer(); player.Directory = vc.Directory; player.StartTime = vc
我已经阅读了很多关于双重检查锁定的危险的文章,我会努力远离它,但话虽如此,我认为他们的阅读非常有趣。 我正在阅读 Joe Duffy 的这篇关于使用双重检查锁定实现单例的文章: http://www.
对于可变类型,值类型和引用类型之间的行为差异很明显: // Mutable value type PointMutStruct pms1 = new PointMutStruct(1, 2); P
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this q
我有一个 Cordova pp 我在 Controller 中调用post方法 它可以在浏览器中工作,但是在构建和调试apk时出现错误 ionic.bundle.js:23826 POST http:
我们正在尝试将时间戳附加到某些 URL 以让内容缓存但在它们发生更改时更新它们。我们有代码可以归结为: DateTime ts = File.GetLastWriteTime(absPath); 其中
我是一名优秀的程序员,十分优秀!