可扩展的UDP服务器

bra*_*tao 3 c++ performance networking udp

我需要制作一个能够监听并回答UDP数据包的服务器,它将监听10个端口.

数据包非常小,不超过20个字节.每个数据包都将修改或搜索到一个巨大的哈希表.

但它必须每秒处理15k数据包.

我可以用c,c ++或qt开发.

是否有任何特殊指导方针需要满足此要求?什么是基本设计?是否需要线程?

pay*_*yne 5

对于这种性能,我会考虑select()基于"换向器循环":

  • 打开侦听UDP套接字
  • 调用select()以确定具有可读数据的套接字
  • 对于每个可读的套接字,读取字节(非阻塞读取)
  • 当你得到一个完整的数据包,处理(并根据需要写)

您可以构建一个select()分析结果的简单表.

这种方法将为您提供最佳性能,因为它可以尽可能接近操作系统调用,并且开销最小.它作为单个进程运行,最小化上下文切换并获得最佳缓存位置.

接下来,如果您发现某些内容受CPU限制,请考虑使用具有多个线程或进程的多个CPU内核的方法.例如,您是否可以让每个处理器处理10个套接字中的N个,并在共享内存中使用哈希表.

最后,我要小心使用大量线程(例如大型工作线程池等).在极端性能级别,线程开销可能会变得很大.