一、性能的构建
性能是一个相对概念,是对某种场景下对系统的一个数值评价,是满足程度的一个衡量;
性能是设计出来的,不是优化出来的,因此,必须在架构上对性能需要达到的目标进行合理的设计;也就是说,使用场景与成本定义出来后,性能架构就随之定义出来,包括软硬件;
粗略的说,在硬件上,需要大容量高吞吐率就上大容量盘,网卡配大点;需要低时延就上SSD\NVDIMM,软件技术上引入DPDK\SPDK\DMA\RDMA等等;
架构与硬件确定好后,系统的性能上下限就被定义出来,要想通过性能优化翻盘,那是不可能的;就好比你买了一个摩托车,想要改造成飞机的性能,那咋可能;
二、性能优化
优化是一个长期的过程,没有终点,所以,一切无目标或者无数据的性能优化都是耍流氓;
性能优化的正确思路是,基于测试数据,聚焦耗时占比最长部分,解决该部分最大问题;俗话说就是关注主要矛盾,聚焦矛盾主要部分;
你需要有一个数据测试工具,观察出性能瓶颈在哪里,一般来说,性能瓶颈最终会体现在三个硬件上,网卡、CPU、磁盘;
在网络上,观察IOPS型还是带宽型,传输数据量小,就做聚合,传输数据量大,就优化转发模型,或者对数据进行协议压缩;(默认这个时候再上新硬件、新软件来不及,所以不考虑RDMA等方式优化,如果需要,可以继续优化设计);或者在网口的时间或者物理维度上分布不均衡,调整即可,重要是数据;
在CPU上,如果是某几个CPU一枝独秀的高,优化下调度模型,多核分担;如果都高,是不是有很多无效计算,优化下;如果系统占用很高,是不是系统调用方式问题;这里要做的太多了,而且一般深水区优化就会来到这里,包括函数调用分析,CPU占用分析等等,都有各种各样的工具,三言两语也介绍不清楚,搜索引擎上非常多资料;
在磁盘上,是不是某个盘比较高,优化热点盘模型,增加缓存机制;或者盘的等待时延比较高,那就是盘处理不过来了,IO可以合并或者减少下盘次数;如果是一波一波抖动,那就可能IO模型有问题;
上面的问题,其实都可以考虑下缓存,各层都合理的设计缓存模型,会将外部业务很好的消化掉,最终体现到性能提升上来;比如CDN缓存、反向代理缓存、本地读写缓存、分布式缓存如memcached、redis等等等等;但是缓存引入又会带来诸如一致性、穿透、雪崩等其他问题,所以因系统而异,选择自己合适的即可;
最后再强调一句,一定是基于测试数据的,在一定范围内的,针对主要的性能瓶颈,解决该部分的主要问题的,要关注全局,要关注全局,要关注全局,重要的事情说三遍!!!