2012-07-14 75 views
0

我正在开发自己的UDP协议(在Linux下),用于缓存应用(类似于memcached),它只对对象执行INSERT/READ/UPDATE/DELETE操作,我不确定哪种设计最好:每个udp数据包有多个或单个请求?

  1. 每包发送一个请求。 (客户端准备请求并立即将其发送到服务器)
  2. 每个数据包发送多个请求。 (客户端将包中的请求排入队列中,并且当它满了时(接近MTU大小)将它发送到服务器)

请求的大小(即记录数据)可以从32字节到1400字节,我不知道它会是平均值,它完全取决于用户的应用程序。

  1. 如果选择每个数据包的单个请求,我将不得不管理很多小包,并且内核会被中断很多次。这会降低操作速度,因为从用户空间切换到系统时,内核必须保存寄存器。此外,如果用户的应用程序发送32字节的许多请求(udp的数据包开销约为28字节),网络流量将增加一倍,并且我将对传输速度产生很大影响,所以数据传输将会有开销。然而,高网络流量不一定意味着低性能,因为NIC具有其自己的处理器并且不会使CPU停滞。如果出现网络瓶颈,可以安装额外的网卡。 使用单个数据包的一大优点是服务器和客户端将如此简单,以便我能够节省指令并提高速度,同时我的bug也会减少,并且项目将尽早完成。

  2. 如果我使用每个数据包多个请求,我将有更少但更大的数据包,因此可以通过网络传输更多的数据。我将减少系统调用的数量,但服务器的复杂性需要更多的内存和更多的指令来执行,所以我们不知道如果以这种方式更快地执行它。可能会发生CPU将成为瓶颈,但添加CPU或网卡的更便宜吗?

应用程序应该有很重的数据加载,比如最新的CPU每秒100,000个请求。我不知道该怎么做。我正在考虑寻求“每个数据包的单个请求”,但是在我重写所有我已经为多个请求处理编写的代码之前,我想问一些建议。

在此先感谢。

回答

1

你更关心什么:延迟带宽

  • 如果是延迟,尽快发送请求,即使这意味着数据包末端和整个数据包更多的“松弛”。
  • 如果带宽捆绑多个请求,以消除“松弛”并发送更少的数据包整体。

注:网络,而不是CPU,可能会在两种情况下你的主要瓶颈,除非你正在运行在一个非常快速的网络。即使你这样做,数据库中的INSERT/READ/UPDATE/DELETE可能花费的CPU和I/O也比数据包所需的CPU工作更多。

+0

你认为即使磁盘是SSD,CPU和磁盘也会成为瓶颈? – Nulik 2012-07-15 22:20:39

+0

@Nulik数据库性能是一个复杂的主题,你应该执行你自己的基准测试。 – 2012-07-15 23:10:14

0

另一种折衷的每个数据包发送多个请求是

  • ,一方面,UDP的不可靠的性质可能导致您的时间下降的多个请求,从而使重传更加昂贵。
  • 在另一方面,内核将使用更少的缓冲区来实现你的数据,减少数据的可能性降到

然而,分析是不完整的部署体系结构的理解,如缓冲区NIC,交换机和路由器的大小以及其他网络硬件。

但建议是用相对简单的实现(每包单个请求)启动,但以这样的方式编写的代码,这样就不会太困难,如果需要增加更多的复杂性。

+0

感谢,我同意,每个分组的单个请求会像的基础上,然后我可以添加对于一些应用多请求。 – Nulik 2012-07-15 22:01:08