网络 I/O 优化。

网络I/O优化通常有如下一些基本处理原则。
    减少网络交互的次数。要减少网络交互的次数通常需要在网络交互的两端设置缓存,如Oracle的jdbc驱动程序就提供了对查询的SQL结果的缓存,在客户端和数据库都有,可以有效地减少对数据库的访问。除了设置缓存还有一个办法,即合并访问请求,如在查询数据库时,我们要查10个ID,可以每次查一个ID,也可以一次查10个ID。再比如,在访问一个页面时通常会有多个JS或CSS的文件,我们可以将多个JS文件合并在一个HTTP链接中,每个文件用逗号隔开,然后发送到后端Web服务器,根据这个URL链接再拆分为各个文件,最后打包再一并返回给前端浏览器。这些都是常用的减少网络I/O的办法。
    减少网络传输数据量的大小。减少网络数据量的办法通常是将数据压缩后再传输,如在HTTP请求中,通常Web服务器将请求的Web页面gzip压缩后再传输给浏览器。还有就是通过设计简单地协议,尽量通过读取协议头来获取有用的价值信息,如在设计代理程序,4层代理和7层代理都是在尽量避免要读取整个通信数据来取得需要的信息。
    尽量减少编码。通常在网络I/O中数据传输都是以字节形式进行的,也就是说通常要序列化。但是我们发送的要传输的数据都是字符形式的,从字符到字节必须编码。但是这个编码过程是比较耗时的,所以在要经过网络I/O传输时,尽量直接以字节形式发送,也就是尽量提高将字符转化为字节,或者减少从字符到字节的转化过程。
    根据应用场景设计合适的交互方式。所谓的交互场景主要包括同步与异步、阻塞与非阻塞方式,下面进行详细介绍。
    1、同步与异步
    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能完成,这时一种可靠的任务序列。要成功都成功,要失败都失败,两个任务的状态可以保持一致。而异步不需要等待被依赖的任务完成,指示通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖他的任务无法确定,所以他是不可靠的任务序列。我们可以用打电话和发短信来很好的比喻同步与异步操作。
    在涉及I/O处理时通常都会遇到是同步还是异步的处理方式的选择问题,因为同步异步的I/O处理方式对调用者的影响很大,在数据库产品中都会遇到这个问题,因为I/O操作通常是一个非常耗时的操作,在一个任务序列中I/O通常都是性能瓶颈。但是同步与异步的处理方式对程序的可靠性影响非常大,同步能够保证程序的可靠性,而异步可以提升程序的性能,必须在可靠性和性能之间保持平滑,却没有完美的解决办法。
    2、阻塞与非阻塞
    阻塞与非阻塞主要是从CPU的消耗上来说的,阻塞就是CPU停下来等待一个慢的操作完成以后,CPU才接着完成其他的工作。非阻塞就是在这个慢的操作执行时,CPU去做其他工作,等这个慢的操作完成时,CPU再接着完成后续的操作。虽然从表面上看非阻塞的方式可明显的提高CPU的利用率,但是也带来另外一种后果,就是系统的线程切换增加。增加的CPU使用时间能不能补偿系统的切换成本需要好好评估。
    3、两种方式的组合
    组合的方式有4种,分别实同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,如下表所示。这4种方式都对I/O性能有影响。

组合方式 性能分析
同步阻塞 最常用的一种用法,使用也是最简单的,但是I/O性能一般很差,CPU大部分处于空闲状态
同步非阻塞

提升I/O性能的常用手段,就是将I/O的阻塞改成非阻塞方式,尤其在网络I/O是长连接同时传输数据爷不是很多的情况下,提升性能非常有效。

这种方式通常能提升I/O性能,但是会增加CPU消耗,要考虑增加的I/O性能能不能补偿CPU的消耗,也就是系统的瓶颈是在I/O上还是在CPU上

异步阻塞

这种方式在分布式数据库中经常用到,例如,在一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,还有2~3份备份记录会写到其他机器上,这些备份记录通常都采用异步阻塞的方式写I/O。

异步阻塞对网络I/O能够提升效率,尤其像上面这种同时写多份相同数据的情况

异步非阻塞

这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,集群之间的消息同步机制一般用这种I/O组合方式。如Cassandra的Gossip通信机制就采用异步非阻塞的方式

他适合同时要传多方呢相同的数据到集群中不同的机器,同时数据的传输量虽然不大却非常频繁的情况。这汇总网络I/O用这种方式性能能达到最高

    虽然异步和非阻塞能够提升I/O的性能,但是也会带来一些额外的性能成本。例如,会增加线程数量从而增加CPU的消耗,同时也会导致程序设计复杂度的上升。如果设计得不合理反而会导致性能下降,在实际设计时要根据应用场景综合评估。

猜你喜欢

转载自blog.csdn.net/en_joker/article/details/81301843