我正在开发一个简单的Android应用程序.在我的应用程序中,我实现了一个工具栏和一个动作栏,ViewPager
用于在片段之间进行滑动,我使用a RecyclerView
来填充电影列表,一切都很顺利.
该应用程序不会崩溃,但Log Cat
每次我滚动列表并在片段之间滑动时出现一个常量错误,我注意到我的应用程序运行缓慢,并有一个糟糕的用户体验.
我希望能够很快找到答案.我目前正在尝试从iOS设备到我的ubuntu桌面和服务器测量RTT.但是,我发现iOS上的iperf版本是iperf3(这可能是我每次尝试执行简单测试时都会收到错误消息的原因).我能够从iOS设备ping到我的主机.
所以现在,我正在尝试将iperf3安装到我的Ubuntu 14.04桌面和服务器中(具有相同版本的概念将解决问题),但不断收到错误,即未安装iperf.
当我做apt-get iperf时,它会安装.但是当我去检查版本(iperf -vl)时,我得到版本2.0.5-3.
我得到的任何帮助非常感谢.
我iperf
在两台服务器之间运行测量,通过10Gbit链路连接.我试图将我观察到的最大窗口大小与系统配置参数相关联.
特别是,我观察到最大窗口大小为3 MiB.但是,我在系统文件中找不到相应的值.
通过运行sysctl -a
我得到以下值:
net.ipv4.tcp_rmem = 4096 87380 6291456
net.core.rmem_max = 212992
Run Code Online (Sandbox Code Playgroud)
第一个值告诉我们最大接收器窗口大小为6 MiB.但是,TCP倾向于分配两倍的请求大小,因此最大接收器窗口大小应为3 MiB,正如我测量的那样.来自man tcp
:
请注意,TCP实际上分配的次数是setsockopt(2)调用中请求的缓冲区大小的两倍,因此后续的getsockopt(2)调用将不会返回与setsockopt(2)调用中请求的缓冲区大小相同的缓冲区.TCP使用额外空间用于管理目的和内部内核结构,并且/ proc文件值反映了与实际TCP窗口相比更大的大小.
但是,第二个值net.core.rmem_max
表示最大接收器窗口大小不能超过208 KiB.根据以下情况,这应该是硬限制man tcp
:
tcp_rmem max:每个TCP套接字使用的接收缓冲区的最大大小.该值不会覆盖全局值
net.core.rmem_max
.这不用于限制在套接字上使用SO_RCVBUF声明的接收缓冲区的大小.
那么,为什么我会观察到最大窗口大小大于指定的窗口大小net.core.rmem_max
?
注意:我还计算了带宽 - 延迟产品:window_size = Bandwidth x RTT
大约3 MiB(10 Gbps @ 2毫秒RTT),从而验证我的流量捕获.
客户端完成后,该过程将自动关闭。我想在服务器端执行相同的操作,因为我想使某些进程自动化,但是服务器端完成但仍保持打开状态。
我在两个终端之间执行 iperf 并能够获得如下输出:
2017-01-09 16:43:03: Connecting to host 192.168.234.2, port 5201
2017-01-09 16:43:03: [ 4] local 192.168.234.1 port 36544 connected to 192.168.234.2 port 5201
2017-01-09 16:43:03: [ ID] Interval Transfer Bandwidth Retr Cwnd
2017-01-09 16:43:03: [ 4] 0.00-1.00 sec 553 KBytes 4.53 Mbits/sec 1 29.7 KBytes
2017-01-09 16:43:03: [ 4] 1.00-2.00 sec 499 KBytes 4.09 Mbits/sec 1 26.9 KBytes
2017-01-09 16:43:03: [ 4] 2.00-3.00 sec 515 KBytes 4.22 Mbits/sec 0 32.5 KBytes
2017-01-09 16:43:03: [ 4] 3.00-4.00 sec 508 KBytes …
Run Code Online (Sandbox Code Playgroud)我想知道为什么 iperf 在 TCP 中表现出比 UDP 更好的性能。这个问题和这个问题非常相似。
UDP 应该比 TCP 快得多,因为没有确认和拥塞检测。我正在寻找解释。
$ iperf -u -c 127.0.0.1 -b10G
------------------------------------------------------------
Client connecting to 127.0.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 208 KByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 52064 connected with 127.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 962 MBytes 807 Mbits/sec
[ 3] Sent 686377 datagrams
[ 3] Server Report:
[ 3] 0.0-10.0 sec 960 MBytes 805 …
Run Code Online (Sandbox Code Playgroud) 我正在研究使用Docker Container进行Haproxy"性能评估"的个人项目.我正在用Python编程并使用iperf进行流量生成.
我创建了几个Docker容器作为客户端和服务器.客户端应该通过Haproxy容器将udp流量发送到服务器,Haproxy容器充当负载均衡器.
问题是当我尝试将udp流量从客户端发送到服务器时,Haproxy拒绝连接.我没有在官方文档中找到如何绑定或监听UDP端口.
提前感谢您的回复.
这是我的haproxy.cfg的副本.
global
quiet
nbproc 4
daemon
listen tcp_haproxy 172.17.4.230:5001
balance roundrobin
server server0 172.17.4.227:5001
server server1 172.17.4.228:5001
server server2 172.17.4.229:5001
我在 2 个不同的 ubuntu 系统上安装了相同版本的 iperf (2.0.5)。但是当我iperf -s -p 45678
在一个系统和iperf -c 172.18.41.17 -p 458 -t 10
另一个系统上执行命令时。它给了我错误“连接失败:没有到主机的路由”。
任何帮助,将不胜感激。
编辑:一个系统作为服务器工作,但同一个系统不作为客户端工作。
我们可以以连续模式从 iperf 生成器发送数据包吗?目前,我正在使用命令以突发模式发送数据包
iperf -c 10.0.0.2 -u -b 1m -t 1
Run Code Online (Sandbox Code Playgroud)
其中 u 是 UDP 数据包,1m 是带宽 (1 Mbps),t 是 1 秒的时间。
但我想以连续模式发送。
我正在使用iperf(https://iperf.fr/)通过IPv6 进行一些UDP带宽测试.使用具有以下命令行的Linux UDP客户端时,我的结果非常糟糕:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m
Run Code Online (Sandbox Code Playgroud)
调查Wireshark的问题我发现在客户端发送数据时存在一些碎片.更准确地说,我看到UDP客户端传出的数据包大小为1510字节和92字节,交替.例如,我看到的UDP数据包具有以下模式(大小):1510,92,1510,92,1510,92,...,1510,92,...
阅读iperf2文档我读了以下选项(-l):
要读取或写入的缓冲区的长度.iPerf通过多次写入len个字节数组来工作.TCP的默认值为8 KB,UDP的默认值为1470字节.注意UDP,这是数据报大小,当使用IPv6寻址到1450或更低时需要降低以避免碎片.另请参见-n和-t选项.
我尝试通过使用以下内容替换Linux iperf UDP客户端命令行来执行相同的带宽测试:
iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m -l1450
Run Code Online (Sandbox Code Playgroud)
我看到了很好的结果.看看Wireshark捕获,我看不到任何碎片了.
在IPv4上进行相同的测试我不需要更改默认的UDP数据报大小(我不需要使用'-l'选项)来获得良好的结果.
所以我的结论是碎片(通过IPv6)导致带宽性能不佳.
无论如何,我想知道在IPv6上将UDP数据报大小设置为1450时会发生什么.为什么我在IPv6上存在碎片,而不是在UDP上使用UDP数据报大小的默认值?此外,为什么在将UDP数据报大小减小到1450时没有碎片?
谢谢.