Я работаю над проектом, который использует Twisted для обеспечения высокопроизводительного UDP-сервера, способного обрабатывать пакетный трафик со скоростью 5 тыс. Пакетов в секунду, с размером пакета от 50 до 100 байт.ПК, на котором я тестирую сервер, имеет четырехъядерный процессор с 4 ГБ ОЗУ и работает под управлением Ubuntu 10.1.
В своих тестах производительности я использую tcpreplay для отправки ранее захваченноготрафик, состоящий из 500 пакетов UDP, на сервер Twisted UDP максимально быстро.Тесты проводятся между двумя физическими (не 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
Обновленные ответы
- Загрузка ЦП никогда не превышает 10%
- Перенаправление вывода в файл илитолько распечатка каждого 100-го сообщения «Полученный пакет» не имеет большого значения, я все еще вижу 10-20% пропущенных пакетов.
- Проверено, что моя сеть стабильна и работает хорошо с использованием iptraf