老薛读书会
1 第一本书大话java性能调优
书籍简单介绍,今天和大家读的是<span style="color:green">大话java性能调优</span>这本书,IBM技术专家周明耀先生编纂。书籍java基础类库的调优策略->并行程序优化策略->JVM调优监控做了比较系统的解读,如果你也想在编写程序时,有一个很好的全方位把控,我个人还是比较推荐这本图书的。
2 章节介绍
今天和大家介绍的的是性能调优策略概述,本书的第一章节,第一章节主要是让大家管中窥豹,在脑海里构建一个稍微全面一点的关于调优的系统概念。
2-1 第一章知识图谱
2-1-1 为什么调优:
1:百万、千万PV访问时如何保证数据一致性?淘宝,12306对于库存数据的一致性要求极高但是如何应对高并发下的性能瓶颈问题?
这里有个例子,为什么奥运会门票票务系统采用抽奖方式?核心还是不需要支持抢购业务,后期只负责手机信息,不保证数据一致性,这样没有并发锁带来的一系列问题,通过水平扩展就可以提高克服性能瓶颈。
2:对于百度等每天访问量很高的业务,如何提高访问速度问题?
为什么前台网站上的很多图片都会加宽度高度,就是为了浏览器解析时能够提高一丢丢效率,当然我们说的缓存等在这里我们暂且不提。
3:如何提高减少编写代码?
比如对于查找1-1000000之间的素数,如何更高效。好的算法和数据结构能够我写更少的代码。更高效的完成业务模型。当然又是我们将简单需求通过很多类层面构建则不再这个考虑范围内,毕竟那是在提高后期扩展性桑考量的,不再一个维度上面
4:CPU如何带动网络资源的这个牛车。
多核多硬件,利用更多的cpu资源做更多的事情,充分压榨cpu的能力。比如缓存,比如异步,比如并行等。目前通过虚拟化打破硬件之间的不可分割障碍,更好的节省成本,提高运维便利,但是同样java应用部署到物理机和虚拟化环境的部署也变相提高了程序员的综合能力。
2-1-2 哪些方向可以让我们调优:
I 冯诺依曼结构弊端分析:
冯诺依曼结构的特点
①:总线结构,所有资源通过IO总线链接
②:指令和数据是存储在一起的
- 1:CPU的执行效率和内存容量增长大于两者之间流量,导致CPU花费大量时间将内存数据搬入搬出。总线瓶颈。
- 2:流水线的工作,导致数据准备好,也必须按照串行指令执行。降低了系统运行效率。
- 3:高级语言最后总会经过编译器去将语言解释为一个线性存储模型进行执行,越高级的语言或者越简洁的代码的可读性以及编译速度都在一定程度上降低了。
- 4:冯诺依曼数值处理很在行,但是对于非数值处理效率较低
解决方案:
- 1:并行计算以及高速缓存区提高CPU的效率。
- 2:数据流驱动程序执行,数据准备好执行相关操作
- 3:不用二进制的作为信息载体,使用光子、量子计算机。
II 计算资源瓶颈问题:
- 某些资源对于cpu的征用时长导致拖慢整个系统。比如视频分析等。
- 内存的大小,最严重的就是OOM等问题
- 磁盘IO和网络传输都是由于本省就很低效。程序执行可能等待磁盘IO的读写或者网络环境的不确定性,导致系统瓶颈。
- 数据库的资源链接以及读写操作的等锁等等操作,都有可能造成系统过慢。
- 多线程程序开发,或者高并发程序下的锁竞争问题,导致程序cpu利用率降低,上下文切换的耗时都会带来过度的资源损耗。还要严重的死锁问题。
- 异常的捕获和处理是很消耗性能的。
III 衡量指标:
IV 优化的目标:
- 1: 编写高效的代码,缩短程序的CPI(就是执行一个cpu指令所消耗的cpu的时钟数)。
- 2: 使用更加高效的算法。比如对于数组的排序选择比较简单的快速排序而不是冒泡或者是选择排序。
- 3:减少锁的竞争。
V 优化策略:
- 1:用时间换空间,比如网络传输过程中压缩数据的算法。由于网络传输的本身瓶颈在与网络传输部分,所以虽然压缩算法比较耗时,但是可以通过时间来换取空间。
- 2:用空间换时间,比如增加的缓存层,数据镜像或者是负载均衡都是用空间换区时间。
- 3:简化代码,比如减少递归的使用,当然尾递归除外。或者尽量通过一些判定保证代码的健壮性而不是直接通过异常等等。
- 4:并行处理,将多核cpu的利用率更好的提升。或者将单核cpu进行资源隔离,将cpu的计算资源进行切分,这样也可以。
注意所有的内容都是基于28法则,大多数80%的资源消耗可以通过改变20%的系统设计或者程序代码而提高。不一定要做的所有的面面俱到。
2-1-3 如何调优:
- 1:负载: 通过CDN让用户连接到最近的服务器,通过DNS的负载均衡将用户请求均发到多个Web服务器上。
- 2:减少连接数: 通过css切分图片,将单一用户的连接数降低。
- 3:减少网页大小增加带宽
- 4:页面静态化:内存直接读取不变信息,减少磁盘IO
- 5:优化查询:通过Redis等方式加入缓存,同样需要解决缓存更新,如何保证缓存和数据库数据的一致性问题,缓存换页:比如常见的LRU、FIFO等算法
- 1:数据冗余:降低表连接
- 2:数据镜像:Docker实现
- 3:数据分区:比如逻辑切分表,字段切分表,平均切分表等等
- 4:负载均衡:F5、Tengine、Nginx
- 5:异步:延时处理某些内容,然后将各个程序做成并行化的
- 6:节流阀:防止外部调用超过系统自己的最大负载,导致系统被拖垮
- 7:批处理: 相同类别的信息放在一起请求批量处理,一般适用于离线模式。
- 8:垃圾回收:作为java程序员必回的技能,在后续章节会系统概述
- 云计算:每秒10万亿次的运算,提高计算能力。提供比如按需付费等模式
- 虚拟化:比如目前用的很多的Docker
- 多核技术:多线程、多进程程序得以执行的前提
- 异构计算:在异构计算系统进行并行计算称之为异构计算,比如我们跑的一些数据模型可能会在GPU进行这就是一个典型的异构计算
- 高速的网络技术
最后还有一些架构层面上而言,我们一般将安全作为一个首要指标。
一般情况下我们调优时通过两种途径解决问题,从下而上,自上而下。简单而言自下而上就是从底层硬件配置开始逐渐向上的方式进行分析,查找性能问题,与之相反则就是自下而上。
如果大家也想加入老薛的读书会,请直接私信我即可,或者后台留言回复。