我正在开发自己的UDP协议(在Linux下),用于缓存应用(类似于memcached),它只对对象执行INSERT/READ/UPDATE/DELETE操作,我不确定哪种设计最好:每个udp数据包有多个或单个请求?
- 每包发送一个请求。 (客户端准备请求并立即将其发送到服务器)
- 每个数据包发送多个请求。 (客户端将包中的请求排入队列中,并且当它满了时(接近MTU大小)将它发送到服务器)
请求的大小(即记录数据)可以从32字节到1400字节,我不知道它会是平均值,它完全取决于用户的应用程序。
如果选择每个数据包的单个请求,我将不得不管理很多小包,并且内核会被中断很多次。这会降低操作速度,因为从用户空间切换到系统时,内核必须保存寄存器。此外,如果用户的应用程序发送32字节的许多请求(udp的数据包开销约为28字节),网络流量将增加一倍,并且我将对传输速度产生很大影响,所以数据传输将会有开销。然而,高网络流量不一定意味着低性能,因为NIC具有其自己的处理器并且不会使CPU停滞。如果出现网络瓶颈,可以安装额外的网卡。 使用单个数据包的一大优点是服务器和客户端将如此简单,以便我能够节省指令并提高速度,同时我的bug也会减少,并且项目将尽早完成。
如果我使用每个数据包多个请求,我将有更少但更大的数据包,因此可以通过网络传输更多的数据。我将减少系统调用的数量,但服务器的复杂性需要更多的内存和更多的指令来执行,所以我们不知道如果以这种方式更快地执行它。可能会发生CPU将成为瓶颈,但添加CPU或网卡的更便宜吗?
应用程序应该有很重的数据加载,比如最新的CPU每秒100,000个请求。我不知道该怎么做。我正在考虑寻求“每个数据包的单个请求”,但是在我重写所有我已经为多个请求处理编写的代码之前,我想问一些建议。
在此先感谢。
你认为即使磁盘是SSD,CPU和磁盘也会成为瓶颈? – Nulik 2012-07-15 22:20:39
@Nulik数据库性能是一个复杂的主题,你应该执行你自己的基准测试。 – 2012-07-15 23:10:14