【发布时间】:2011-03-13 23:20:36
【问题描述】:
我正在开展一个项目,该项目使用 Twisted 提供高性能 UDP 服务器,该服务器能够处理 5k 数据包/秒的突发流量,数据包大小从 50 到 100 字节不等。我正在测试服务器的 PC 有一个四核 CPU 和 4GB RAM,运行的是 Ubuntu 10.1。
在我的性能测试中,我使用tcpreplay 尽可能快地将先前捕获的包含 500 个 UDP 数据包的流量发送到 Twisted UDP 服务器。测试在同一千兆 LAN 上的两台物理(非 VM)机器之间进行。根据 tcpreplay,我以约 1250 个数据包/秒的速度发送数据包,但在我发送的 500 个数据包中,Twisted UDP 服务器仅接收到约 350-400 个数据包。
我可以在 Twisted 中或在系统级别进行哪些性能调整以提高性能并防止丢弃过多的 UDP 数据包?
服务器代码
#!/usr/bin/env python
from twisted.internet import reactor
from twisted.internet.protocol import DatagramProtocol
packetCount = 0
class DeviceProtocol(DatagramProtocol):
"Show me how many packets the server has received"
def datagramReceived(self, datagram, address):
global packetCount
packetCount += 1
print "Received packet %s" % packetCount
def main():
reactor.listenUDP(7000, DeviceProtocol())
reactor.run()
if __name__ == '__main__':
main()
自定义 Sysctl.conf 设置
net.core.netdev_max_backlog=2500
net.core.rmem_max=16777216
net.core.wmem_max=16777216
更新答案
- CPU 使用率永远不会超过 10%
- 将输出重定向到文件,或仅打印每 100 个“已接收数据包”消息会产生很小的差异,我仍然看到 10-20% 的数据包丢失。
- 使用 iptraf 测试我的网络稳定且性能良好
【问题讨论】:
-
%CPU的使用量是多少?将输出重定向到文件有什么不同吗?只打印每 10 个数据包有什么不同吗? (输出到终端可能很昂贵)。 -
如果您每秒发送 10、100 个数据包而不是 1000 个,丢弃率是否保持不变?
-
通过
iperf测试UDP性能确认底层网络稳定。 -
您是否在发送或接收机器上运行了 tcpdump?你能确定哪台机器的内核正在丢弃数据包吗?如果是发送者,那几乎不是接收者的错。
-
编写了一个 python 脚本,用于对任何给定的 .pcap 文件执行 tcprewrite anandtechblog.blogspot.com/2011/12/…
标签: linux ubuntu udp twisted performance