高性能涉及的东西有很多,该怎么才能记住呢?
我觉得这是一个很有代表性的问题,相信很多人都有类似的困惑,所以决定写篇文章来好好聊聊这个问题。
确实是这样,当初在准备高性能相关的面试问题时,也是同样的感受,有好多东西啊,该想个什么办法把它们都串起来呢?
计算机运行的本质,或者说程序执行的本质,就是CPU不断取出内存中的指令,然后执行它。
在这个过程中,CPU需要与内存打交道,因为程序指令在这里面;还需要与硬盘、网卡等一些外部设备打交道,存储数据、传输数据。
CPU、内存、外部设备,这三个是计算机最主要的三个东西,所以我们在思考高性能的问题时,围绕这三个东西,就可以把很多技术串起来。
比如提高CPU主频、指令流水线技术、乱序执行、分支预测等等。
缓存技术在计算机中无处不在,CPU中有存放数据和指令的一二三级缓存,还有存放内存地址翻译的TLB缓存。
操作系统中的文件系统管理硬盘数据也使用了页缓存Page Cache。
后端服务为了快速获取数据,使用Redis/Memcache作为内存数据缓存,避免每次都从数据库中查询。
浏览器中为了加快渲染速度,也有前端资源的缓存,避免每次都找网站服务器请求。
网站服务器为了提高响应速度,也有CDN缓存。
最典型的就是网络数据包处理,如果在很大网络流量下,网卡每来一个数据包都通过中断告诉CPU,那CPU一天别干活了,烦都要烦死了。
所以Linux内核中的NAPI技术通过轮询网卡,减少中断次数就能显著提高性能。
另外DMA技术通过把数据传输的工作外包出去,解放CPU,也是这一思想的应用。
比如内存映射、零拷贝技术就属于这一类技术。
另外高性能抓包技术DPDK,让应用程序直接读取网卡,减少数据拷贝也是这种思想的体现。
如CPU的多核技术,超线程技术、单指令多数据技术SIMD等。
多线程技术、NUMA技术、多节点负载均衡技术等。
后端服务开发中的I/O多路复用技术(select/poll/epoll)。
所以减少锁的竞争也是提高性能的一种方式,这方面的技术有原子操作、无锁编程等。
体现这类思想的技术有B+树、SQL批量执行等。
良好的数据结构与算法能够从根本上解决高性能的问题。
这方面思想的体现有哈希表、B+树、跳表等。
最后来总结一下,下次回答提高性能可以从四个增加、四个减少、一个良好来展开:
增加CPU速度、增加缓存、增加并行度、增加资源池
减少内存拷贝、减少I/O次数、减少CPU被打断次数、减少锁竞争
良好的数据结构与算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/25221.html