本文共 1122 字,大约阅读时间需要 3 分钟。
简而言之,如果将你的CPU的速度加快一倍,那么你通常可以获得接近两倍的吞吐量。仅仅将网络的容量加倍通常没有效果,因为瓶颈一般在主机上。
每一个到来的分组都会引发一个中断。在现代的流水线方式的处理器上,每个中断都会打断CPU流水线、干扰缓存的工作、要求改变内存管理环境,并且强迫保存相当数量的CPU寄存器。因此,在发送数据时将TPDU的数量减少n倍,则中断数和分组开销也相应减少n倍。
环境切换(比如从内核模式切换到用户模式)对于性能有严重的影响。如同中断一样,他们也具有一样的坏特性,最糟糕的是导致原谅大量的缓存无法命中。通过以下的方法可以减少环境切换:让发送数据的库过程在内部建立一套缓冲机制,直到有了相当的数量的数据之后才真正调用发送过程。类似地,在接收端,进来的小TPDU应该被收集起来,然后再成批地而不是单独地传递给用户,这样可以使环境的切换次数尽可能减少到最少。最好的情况是,一个进来的分组会导致从用户模式切换到内核模式,然后再切换到接收进程,并将心到达的数据交给它。
比多次切换更糟糕的是多次的复制操作。对于一个新到达的分组,在提取它的TPDU之前对该分组执行了3次或者4次的复制操作。当网络的接口卡将一个分组接收到专门的卡上硬件缓冲区之后,该分组通常需要被复制到内核缓存区中,在内核中,它又被复制到网络缓冲区中,然后复制到传输层缓冲区中,最后被复制到接收应用进程中。一个精巧的操作系统每次会复制一个字,但是在常见的做法中,每个字大约要求5条指令(加载、保存、索引寄存器递增、测试数据末尾和一个条件分支)。
接下来的三条规则涉及到通信,而不再是协议处理。第一条规则是:如果你想要更多的带宽,那么你直接购买带宽即可,但这样做并不能降低延迟。如果想要缩短延迟,则必须改进协议软件、操作系统或者网络接口。即使所有这些都做到的话,如果瓶颈是传输时间的话,则延迟还是无法降下来的。
“一分预防胜过十二分的治疗”。当一个网络拥塞的时候,分组会丢失,带宽会被浪费,传输过程中引入无用的延迟,等等。从拥塞中恢复过来并不容易,需要时间和耐心。最好的作法就是避免拥塞,这就像是打疫苗一样。
定时器在网络中是必要的,但是它们应该尽量少用,而且应该尽量少发生。当一个定时器到期的时候,通常需要重复执行某一个动作。如果确实需要重复执行这个动作,则执行这个动作;否则,不必要的重复就是一种浪费了。
转载地址:http://trwli.baihongyu.com/