使用Tcpreplay进行UDP调整

时间:2011-03-13 23:20:36

标签: linux ubuntu udp twisted performance

我正在开发一个项目,它使用Twisted来提供一个高性能的UDP服务器,能够处理5k包/秒的突发流量,包的大小从50到100字节不等。我正在测试服务器的PC有一个四核CPU,内存为4GB,运行的是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
  • 测试我的网络稳定且运行良好

2 个答案:

答案 0 :(得分:2)

我使用iperf测试了我的网络,这是一个很好的工具,我将添加到我的工具箱中,我的网络可以毫无问题地处理所有流量。

事实证明我的问题是由于:

  • 使用小型捕获文件
  • 使用tcpreplay的--loop选项
  • 重播捕获

在我的测试中,如果数据包在小型捕获文件上循环过快,则tcpreplay会丢弃数据包。我的捕获文件由100个数据包组成,循环四到五次会导致10-20%的数据包无法发送到接收端。

答案 1 :(得分:0)

尝试使用基于poll的反应器:

from twisted.internet import pollreactor
pollreactor.install()

http://docs.huihoo.com/python/twisted/howto/choosing-reactor.html#poll