我正在开发一个项目,它使用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
答案 0 :(得分:2)
我使用iperf测试了我的网络,这是一个很好的工具,我将添加到我的工具箱中,我的网络可以毫无问题地处理所有流量。
事实证明我的问题是由于:
在我的测试中,如果数据包在小型捕获文件上循环过快,则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