系统性能

       当今是个快速消费的时代,各种“新”技术层出不穷,框架百家争鸣,但观其本质,个人认为出发点有其三,一者,在有限的资源条件下尽可能提升程序的处理能力;二者,满足各类业务场景的特定需求(例如当先最火热的机器学习、大数据、区块链);三者 ,提升程序员的开发效率。目前对系统性能方面的认知还仅处于研究生阶段水平,虽然不高,但也算入门了,可以总结下,不一定全对,后期如果发现有错再更正,算练练笔。

        系统服务能力取决于CPU、存储、IO的综合能力,就像一个木桶能装多少水,取决最短的那块木板,系统的最高服务能力取决于几者最弱的一项。我们开发的不同系统对各类资源的消耗不一,例如,一些图像处理算法是计算密集型,CPU可能成为资源瓶颈,因而出现了计算能力更高效的GPU;视频分发程序对网络IO依赖较强,P2P方案的问世,巧妙的解决了这一难题;一些对数据库操作访问量频繁Mis系统,磁盘IO可能成为短板,因而就出现了SSD,内存数据库等等。

        研究生时期曾做了个很无知的实验,老板出题曰:在linux环境,写一高效的程序大文件(上百G、T级的)拷贝程序,当时自恃读研前写过今年程序,得题以后就对着电脑“大显身手”,紧接着我的无知便暴露无遗,我的大致思路是利用多线程来解决这一问题,主线程先计算文件大小,然后将大文件逻辑上切成几个小文件,创建多个子线程来负责读写这些文件块,每根线程根据计算好的文件偏移量读指定的一小块文件,然后写到另一个文件中,老板看到我一脸专注且很牛逼的样子,过来问了下我的思路,脸上露出了一个诡异但又包容的笑容说“对,就要对尝试尝试”,然后走开了,在调试期间我发现开一根线程读写是最快的,第一时间我没去请教老板,借助nmon,网上到处查查,后来涨姿势了,这类程序的瓶颈是在磁盘IO上,我这个多线程的设计,线程间的切换开销不算最大的问题,最大的问题在于,磁盘本身是机械设备,多线程读写统一文件间来回切换,会导致磁盘可能在磁道间来回切换,多线程反而变慢了。搞明白了,去找老板聊了下,老板脸上露出了幸福的笑容,我觉得我的人生或者说程序生涯开窍是从那一刻开始的,感谢老板当时没有点破我的无知,留给了我一个自己认清自己的机会。开窍很重要,各个行当都有自己的规则、玩法,开窍了就能触类旁通,提升认知的高度,更容易搞清楚本质的东西。我把这类东西定义为一类工匠品质。

       因而在做程序架构时,要根据系统的应用特性,分析系统的性质,哪些资源可能成为瓶颈,再做具体的技术方案,计算密集型的可使用GPU、多线程、多进程,IO密集型可用一些能提升系统IO能力的技术,如内存数据库,化整为零、分治、分库等等思路。系统性能测试时也可以根据CPU、存储、IO的监控情况来分析系统瓶颈。

猜你喜欢

转载自blog.csdn.net/zouhaozl2008/article/details/84295540