写点什么

架构师训练营第八周学习总结

用户头像
Gosling
关注
发布于: 2020 年 11 月 15 日

本周进入性能优化的第二周,主要围绕了I/O读写,数据结构与算法和网络通信这几点展开。

1.I/O优化

I/O操作从存储设备的角度,我们分为机械硬盘和固态硬盘。

机械硬盘

机械硬盘以机械装置驱动,马达带动磁盘旋转,操作系统控制磁头移动并落下读取磁盘上的数据。所以这里我们可以知道性能的瓶颈会出现在磁盘转速和磁头移动次数上。

磁盘转速目前市面上主流就是5400转和7200转,在大文件读写上,尤其是存储空间连续的情况下,5400转和7200转的差距并没有很大,而在连续读写小文件时,需要频繁切换存储的位置,这时候转速高的会体现出性能优势。

而磁头移动在存储空间连续的情况下也不会有太大问题,问题会出在使用了一段时间的磁盘,里面频繁的写入和擦除之后,会留下很多磁盘碎片,这时候没有连续空间存储大文件时,当读写大文件时就会导致频繁切换磁头的位置导致读写性能急剧下降。

所以我们会建议一段时间做磁盘碎片整理,把小文件搬运腾出连续的磁盘空间。

固态硬盘

固态硬盘(SSD)因为采用浮栅晶体管,通过加压捕获电子来存储数据,不需要通过机械式的移动来读取数据,所以会提升了极大的读写性能。



但无论是用什么类型的硬盘,在单机上总会受限于单块磁盘的性能瓶颈,在大数据上,我们如果要写入海量的数据时,需要依靠分布式文件系统来解决性能问题。

分布式文件系统

分布式文件系统把大文件拆分写到各个服务器上,利用多服务器上的存储设备来解决文件I/O的瓶颈问题,这时候的性能瓶颈就取决于整个环境网络的传输带宽,一般都在内网环境下传输。

2.数据结构与算法

数据结构大致分线性表和非线性表。

线性表

线性表比较有代表性的就是数组和链表,数组利用存储元素的一致性大小,通过数组头部地址和每个元素的大小来进行下标的随机存取,而链表需要依靠元素之间的链接指针进行查找。数组适合追加写入,不适合在数组中间进行插入或删除操作,而链表则相反。

栈和队列则是操作受限的线性表,本质上和数组或链表一致。有的还会使用收尾相连的循环队列来解决一些特殊的问题,也都是受限操作的线性表。

所以我们选择数据结构的时候最好结合业务场景来选择。

非线性表

而非线性表的代表就是树和图。

树是我们用来做检索的一个常用的数据结构,用于数据库索引和其他类型的文件系统索引中,通过构建平衡树来提高在有序场景下查找的目标的性能。

图分为无向图和有向图,主要用于构建路径搜索场景下的最优路径和NP问题的求解模型。

3.网络通信

网络通信过程中的同步阻塞是我们在性能优化时重点考虑的点。除了我们之前有提到过的负载均衡之外,这次我们重点讨论了异步无阻塞的网络I/O。

高并发下,BIO的通信模型会导致大量线程存活而得不到执行,构建异步的NIO的通信模型,通过操作系统底层提供的Epoll(Linux)或IOCP(Windows),构建多路复用的编程模型,把Select选择器和Channel进行事件驱动,让少量的线程可以服务大量的Socket连接。

通过NIO的方式,可以极大提升我们应用服务的并发连接。



本周通过这三点进一步把我们平时工作中需要考虑到的一些关于编码过程和网络消息传输过程中会出现哪些性能瓶颈进行了一次梳理。

发布于: 2020 年 11 月 15 日阅读数: 20
用户头像

Gosling

关注

这个家伙很懒,只留下这一句话 2017.10.28 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第八周学习总结