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

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

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

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

计算机运行的本质,或者说程序执行的本质,就是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被打断次数、减少锁竞争

良好的数据结构与算法

原创文章,作者:AIRF,如若转载,请注明出处:http://www.ai-rf.com/index.php/2022/12/07/%e9%ab%98%e6%80%a7%e8%83%bd%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9f%e5%85%b6%e6%9c%ac%e8%b4%a8%e6%98%af%e4%bb%80%e4%b9%88%e4%b8%9c%e4%b8%9c%ef%bc%9f/

(0)
AIRFAIRF
上一篇 2022年12月5日 下午10:00
下一篇 2022年12月31日

相关推荐

  • DDoS防御方法汇总

    前言 DDoS攻击是一种常见攻击,可确实是个困扰运维人员最为恼火的问题,可导致网站宕机、服务器崩溃、内容被篡改甚至品牌/财产严重受损。其实防御DDoS攻击除了运维人员日常的一些防范…

    芯片设计 2023年12月10日
  • 解除申诉失败爆红域名教程

    解除申诉失败爆红域名教程 如果你的域名红了 申请也不能恢复请进来 本次教程测试的是在腾讯云注册的域名(其他自己测试) 教程 1.打开微信搜《腾讯云助手》2.找到在线客服《域名问题》…

    芯片设计 2024年4月25日
  • 反转了?360 在系统组件拉屎,微软给其擦屁股,最后火绒背锅

    分享一下有关近期火绒安全误杀 Windows 资源管理器 explorer.exe 导致用户电脑黑屏的事件。 事件发生后,B 站 UP 主 epcdiy 和 UP 主边亮_网络安全…

    2024年2月22日
  • 激励自己好好工作的文案

    1.你向往的地方,别人去过了。你喜欢的人,别人睡过了。你想要的东西,别人早有了。 2.当一个人不爱你的时候。你撒娇就是作,你吃醋就是小心眼,你想念就是打扰,你关心就是闲得慌。 3.…

    生活情感 2022年9月26日
  • 同时使用国内CDN服务和CloudflareCDN

    对于国内和国际用户,我们可以通过CNAME解析的方式,同时使用腾讯CDN和Cloudflare CDN服务,以实现全球范围内的内容加速。 第一步:确定CDN服务供应商 首先,你需要…

    2024年12月30日
  • 宝塔第三方云端的php站点程序

    网上经常说宝塔开心脚本版有后门,所以很多小伙伴都不敢用网上那些所谓的开心版脚本,最近博主在github上找到一款自行搭建的宝塔云端,重要的是这程序它开源。博主也自行搭建了一份,有需…

    2024年4月30日
  • MQ9.0升级至9.1

    1.ps -ef | grep mqm2.kill -9 进程号3.查看是否删除完成ps -ef |grep mqm4.卸载目前版本 rpm -qa | grep MQM rpm …

    芯片设计 2022年9月26日
  • Windows激活工具及秘钥

    密钥对照表 Windows 11 专业版安装密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T 1.Windows Server 2019 Windows Serve…

    2022年9月24日
  • Python自动化Cc压测攻击脚本V2

    仅供压测自己服务器使用,不得用于非法攻击 CCATK-V1 使用socks4 / 5代理攻击http服务器的脚本。 删除了混合代理洪水 新特性: 快速套接字重用 改进的CC模式 随…

    2023年8月31日
  • Centos7.X搭建trilium笔记

    当初笔记软件选择我对比了很多家,最终选择了trilium。trilium是一款支持层级结构的笔记软件——Trilium Notes,与其说它是一款笔记工具,倒不如说是一款用来构建知…

    2024年5月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(0条)