Linux性能优化杂谈
文章目录
性能不仅仅是一串串数字,性能体现更大的吞吐量及更低的延迟;如果网络延迟增加0.1秒,google每秒损失100W,不是人民币是美元;网页响应慢0.1秒,运营成本每天增加100万美金。亚马逊的数据也显示,网页延迟1秒可能导致全年损失16亿美金;移动页面加载时间时长超过5秒,74%的用户会选择离开,高性能主要体现下面三个方面:
- 少资源
- 高吞吐
- 低延迟
在具体网络转发性能优化过程中对性能优化有以下几点体会与总结:
软硬结合
软件灵活,硬件高效,软硬结合就像双剑合壁,威力巨大;具体在网络设备中交换机就是一个很好的例子:通常由CPU完成协议的处理,下发转发表项到芯片,由芯片完成报文的转发,在这种思路下才会cisco,H3C,Huawei的大容量的交换机;如果完全交给CPU来处理成本很高,而且在现有技术下很难完成那么大的交换容量(1T以上)。在这种情况对于软件上来说基本不需要优化,本文后面的优化是针对软转的优化;
分离与分解
控制与转发分离 由控制平面维护转发表项,转发平面根据表项完成转发
针对性优化
性能优化一定要指定优化场景,例如对于收包优化针对不同的接入方式,不同报文类型;
快慢结合,先慢后快
对于交换机与路由机这种网络转发设备,通过首包建流,后续报文匹配流实现快慢结合提高报文转发效率;
缓存
缓存大法好,在现在各种系统与应用中缓存无处不在,硬件上看,有硬盘缓存,RAID卡缓存,存储缓存,主存,NUMA特性,CPU cache;软件架构上看,有全局数据缓存,私有数据缓存,连接池,应用服务器缓存,WEB服务器缓存,CDN缓存,客户端文件缓存,客户端内存缓存等等。
do more with less
性能优化大体就是开源与节流,do more with less需要考虑如何提高cpu,存储,网络的利用效率
预处理
兵马未动粮草先行 例如在报文发送针对不同流准备相应的链路层头,避免发送报文再逐字段填充,作到一次性完成报文贴头处理;其实很多应用系统的线程池,内存池,连接池等也是类似思想
二八原则
主要体现如下:
- 对于优化的代码,集中精力优化是关键20%的代码
- 在具体的系统性能优化过程刚开始投入20%可以使取得整个优化成果的80%,而最后的20%需要花费80%的时间来完成,而且涉及的挑战会更多,更有难度,所以优化过程越到后面越难,需要良好的心态与意志
无profile,不优化
If you can’t measure it, you can’t improve it。若无度量,则无提高。优化一定要有一套profile方法,profile以下几个方面的作用:
- profile建立一个性能基线,有利于优化过程中比较与参考
- profile查找系统的瓶颈,在一个大型的系统查找到性能瓶颈是一件很有挑战的事情,通过profile有利于快速定位瓶颈
- profile评估优化结果,对每一个优化点有一个数字化清晰的记录
- profile指导优化的方向
避免过度优化
在性能优化过程中切忌一味追求性能,忽略了业务,没有关注优化对系统带来的哪些不好影响,例如:
- 优化使系统变得更复杂,不利于维护
- 优化影响了其他业务
- 优化忽略了业务功能(功能正确性,功能可扩展性等等)
- 优化只是特定环境下数据提升并不适用具体应用
减少状态的改变
在报文处理与协议处理过程中设计更精简的状态机,避免过多的状态变化处理的开销。
避免代码的黑盒
避免代码的黑盒,主要有下面几点:
1.优化过程忽略部分代码,导致这一部分代码未能出现优化对象中
2.虽然考虑了所有该关注的代码,但是没有理解代码,特别这一部分代码涉及跨团队,个人经验:这一部分代码需要重点关注,往往有意想不到的收获
总之,性能优化需要充分理解业务,根据数据,实现硬件,系统,业务三者最佳协同。
文章作者 沉风网事
上次更新 2015-05-24