第八周总结
本周是性能优化的第二课,主要内容是磁盘 IO、网络IO、数据结构与算法,了解底层的一些知识。
磁盘 IO
计算机体系中数据存储主要是 CPU、内存、硬盘三级架构。三者数据读写的速度依次降低,而容量以及价格却依次上升。基于性价比硬盘存储是我们主要的存储介质。目前来说硬盘主要分为:
机械硬盘
机械硬盘由磁盘、磁头、磁头臂、主轴等构成;其中机械硬盘的转速一般是比较高的,但是磁头寻址的速度较慢,是机械硬盘的瓶颈。特别是随机读写的时候更慢。
固态硬盘
固态硬盘则与机械硬盘内部构成完全不同,其没有机械组成,而是由很多电子芯片和存储颗粒构成。相比较机械硬盘,电子控制的固态硬盘读写速度有大幅度提升,当然固态硬盘也有随机读写速度问题。
基于硬盘存储的这种特点,我们技术选型以及性能优化的时候可以借鉴。如 Mysql 数据库的 B+ 树结构
由于 B+树结构高度不为1,通常不同高度的节点位于不同的磁盘块,所以一次查询需要多次 IO。
在大数据时代有一种改进的结构为 LSM,典型的应用是 HBase,如下:
当然,为了扩展硬盘的数据存储容量,单机有 RAID 以及分布式条件下的 HDFS
网络 IO
1、一次 Http 网络请求是一个非常复杂的过程,涉及网络传输的7层协议(四层)
2、OSI 七层模型和 TCP/IP 四层模型
也就是说一次网络通讯是需要遵循上述的四层模型的协议,即
发送方:应用层 ==> 传输层 ==> 网络层 ==> 网络链路层 ==> 网卡
接收方:网卡 ==> 网络链路层 ==> 网络层 ==> 传输层 ==> 应用层
总结起来就是网络通讯就是基于通讯模型,每一层都加上或者拆分掉自己对应层的协议头并继续传输下去。
非阻塞 IO
1、网络编程主要是基于操作系统提供的接口进行传输层的编程,更底层的网络协议通信由操作系统实现(网卡)。
2、传统的网络编程是阻塞的主要指的是一个网络请求会有一个用户线程对应处理[1:1],而实际上网络通讯速度较慢,用户线程更多的是处理等待状态,即阻塞(对资源的浪费)。
这种模型在并发量较高的情况下,会有严重的资源浪费从而导致服务器的整体吞吐量较低。
3、非阻塞 IO 则是基于操作系统 epoll 机制
操作系统将客户端的 socket 请求注册到 eventpoll,非阻塞 IO 框架则通过一个 select 线程去查询 eventpoll 看当前有哪些待处理的 socket 请求,并唤醒对于的用户线程去处理,而非一个客户端的 socket 请求对应用户线程[N:1]。
总结起来,NIO 相对于 BIO,充分考虑到网络 IO 数据通信的速度与服务器用户线程处理速度的不匹配,可以通过合适的用户线程去处理大量的网络通信 socket,从而整体提高服务器的并发度。
版权声明: 本文为 InfoQ 作者【睁眼看世界】的原创文章。
原文链接:【http://xie.infoq.cn/article/2cf95e8f4c930c56660916134】。文章转载请联系作者。
评论