高性能是什么?其本质是什么东东?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

高性能涉及的东西有很多该怎么才能记住呢

我觉得这是一个很有代表性的问题相信很多人都有类似的困惑所以决定写篇文章来好好聊聊这个问题。

确实是这样当初在准备高性能相关的面试问题时也是同样的感受有好多东西啊该想个什么办法把它们都串起来呢

计算机运行的本质或者说程序执行的本质就是CPU不断取出内存中的指令然后执行它。

在这个过程中CPU需要与内存打交道因为程序指令在这里面还需要与硬盘、网卡等一些外部设备打交道存储数据、传输数据。

CPU、内存、外部设备这三个是计算机最主要的三个东西所以我们在思考高性能的问题时围绕这三个东西就可以把很多技术串起来。

1、让CPU执行指令更快一点
程序是CPU在执行最容易想到的当然就是让CPU跑的更快一些。这方面主要是涉及硬件技术跟软件关系不大。

比如提高CPU主频、指令流水线技术、乱序执行、分支预测等等。

2、使用缓存
程序运行经常需要读取和加载数据当程序经常需要从一个慢速设备读取数据时性能势必会受到影响。所以可以先把数据缓存到一个能快速获取的地方加快数据加载速度然后选择适当的时机来更新缓存中的数据。

缓存技术在计算机中无处不在CPU中有存放数据和指令的一二三级缓存还有存放内存地址翻译的TLB缓存。

操作系统中的文件系统管理硬盘数据也使用了页缓存Page Cache。

后端服务为了快速获取数据使用Redis/Memcache作为内存数据缓存避免每次都从数据库中查询。

浏览器中为了加快渲染速度也有前端资源的缓存避免每次都找网站服务器请求。

网站服务器为了提高响应速度也有CDN缓存。

3、减少CPU被打断次数
CPU在运行过程中不是一直埋头执行程序它时不时的会被打断这就是中断。

最典型的就是网络数据包处理如果在很大网络流量下网卡每来一个数据包都通过中断告诉CPU那CPU一天别干活了烦都要烦死了。

所以Linux内核中的NAPI技术通过轮询网卡减少中断次数就能显著提高性能。

另外DMA技术通过把数据传输的工作外包出去解放CPU也是这一思想的应用。

4、减少内存拷贝
很多时候程序需要频繁拷贝数据但拷贝数据的过程时比较耗时的如果能减少拷贝的次数无疑会提高程序性能。

比如内存映射、零拷贝技术就属于这一类技术。

另外高性能抓包技术DPDK让应用程序直接读取网卡减少数据拷贝也是这种思想的体现。

5、并行与并发
这个思想很直接一个人干活忙不过来那就多找几个人一起干。并行与并发的思想同样在计算机领域无处不在。

如CPU的多核技术超线程技术、单指令多数据技术SIMD等。

多线程技术、NUMA技术、多节点负载均衡技术等。

后端服务开发中的I/O多路复用技术select/poll/epoll。

6、减少锁的竞争
前面提到多线程技术而提到多线程就离不开锁。很多时候线程在锁的竞争上浪费了太多时间上下文的切换这些都需要有开销。

所以减少锁的竞争也是提高性能的一种方式这方面的技术有原子操作、无锁编程等。

7、资源池化技术
很多程序运行启动时就预先分配好资源而不是在需要的时候才去分配这也是一种提高性能的方法。最常见的有线程池、内存池。

8、减少I/O次数
程序运行的时候经常要从硬盘上读取数据而这类操作是非常耗时的如果能减少I/O的次数合并I/O次数对性能的提升将是巨大的。

体现这类思想的技术有B+树、SQL批量执行等。

9、良好的数据结构与算法
程序的灵魂是数据结构与算法前面说了那么多即便都做到了但如果你的数据结构和算法设计的一塌糊涂那也是白搭。

良好的数据结构与算法能够从根本上解决高性能的问题。

这方面思想的体现有哈希表、B+树、跳表等。

总结
上面这几个点不是孤立存在的很多时候都是互相交织在一起的综合应用。比如零拷贝技术既是减少内存拷贝的思想也是减少打扰CPU的思想。在I/O多路复用epoll中既是并发思想体现也有减少内存拷贝思想的体现。

最后来总结一下下次回答提高性能可以从四个增加、四个减少、一个良好来展开

增加CPU速度、增加缓存、增加并行度、增加资源池

减少内存拷贝、减少I/O次数、减少CPU被打断次数、减少锁竞争

良好的数据结构与算法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6