QPS概念扫盲 性能优化的常见招式有哪些

本文主要会介绍性能评估的一些简单概念以及性能压测/性能瓶颈的识别方法和一些常见的优化方式 。 虽然内容很多 , 但是目的在于让大家有个全局的认识;本文虽然深入度上面稍微欠缺 , 但是足以应对日常的性能分析 。
为什么大家觉得性能优化难?
很多人觉得性能优化难的原因 , 其实主要是不知道怎么去做评估 , 主要表现在一下几个方面:
1、不知道性能是什么?
2、不知性能的评估标准是什么?
3、不知道影响性能的相关元素是什么?
4、不知道性能问题的带来的现象是什么?
性能优化 , 必须知道的几个概念
关于性能的几个基础概念就像一把刀 , 你需要知道他可以用来削水果 , 还可以用来杀人 。
认知 , 决定了你能拿它干什么 , 决定了能否识别到本质 。
性能调优 , 就是一条通过现象看本质的认知之路 。
性能优化中必须知道的几个概念诸如:
1、 响应时间(RT)
2、 吐出量(QPS/TPS)
3、 资源(CPU、线程等)
下面通过对这几个概念的详细剖析 , 进行讲解 。
QPS概念扫盲
概念
QPS:Query Per Second
TPS:Transactions PerSecond
起源:数据库系统中表述性能的重要指标 。
现在:对于应用系统而言 , 现在QPS , TPS的概念有点混淆 , 泛指系统单位时间的处理能力 。
这两个概念是衡量性能很明确的指标 , 我们用它来泛指单位时间系统的处理能力 。 但是仅仅知道QPS/TPS的概念 , 就能做性能分析 , 性能调优了吗?是哪些因素会影响QPS/TPS?
接下来我一层层来剖析:响应时间模型 , 线程模型 , 已经线程和资源之间的关系 。
深入理解响应时间组成模型
很多人对响应时间的组成是不清晰 , 导致不能很好的判断 , 时间消耗在了什么地方 。 明白时间消耗的节点是很重要的一件事 。
不知道响应时间组成的优化就像是乱枪打鸟 。 需要明白时间消耗在什么地方 , 是什么原因造成的消耗 。
不要认为只有CPU消耗;更不要认为加CPU核数就可以解决问题 。
通常是通过埋点的方式把代码执行切分成一段一段的片段 , 获取各个节点、各类节点的消耗 , 用于观察性能情况 , 定位性能瓶颈点;链路上的埋点 , 可以配合监控系统统一来看 , 阿里是自己实现了一个简单的埋点类 。
响应时间是程序(进程、线程)在资源(CPU)运行的一个体现 。 所以 , 资源和程序运行的载体会影响这个结果 。 下面深度理解JAVA的线程模型 。
深入理解线程模型
进程/线程是程序运行的载体 , 所以深入理解线程的机制有助于帮助性能分析 。
请看下图
左上的图 , 是线程几个状态之间的扭转 。
左下的图 , 是线程在锁的争用时候的运行态 。
右上的图讲linux中 , java主进程、java线程/LWP轻量级进程和CPU调度 , CPU绑定运行的模型:
1、线程/进程是操作系统调度的关键资源 。
2、理解器运行机制有利于知道一个请求中的运算是消耗在什么节点 。 CPU只是一个点 , 其他资源也是会影响线程的执行 。
3、多线程情况下 , 线程不一定是满转的 , 遇到共享资源争用的时候 , 会造成阻塞 。
线程和CPU是程序运行的宝贵资源 。 资源不足会造成性能问题;资源富足优惠造成资源浪费 。 到底匹配多少资源才是最优的呢?
下一步解释最优线程数 , 如何最优化资源配比 , 理解资源之间的关系 。
深度剖析最优线程数
最优线程数定义

  1. 尽可能保持应用对资源的最大化使用 。
  2. 当线程数较少的时 , 有压力情况下 , 可能造成线程资源不足 , 请求需要等待线程释放后才能处理 。
  3. 当线程数较多的时 , 线程自身也是需要消耗内存资源的 , 导致资源的浪费 , 同时 , 线程较多的时候对于线程的调度和争用也会影响性能 。
如何确定或者使用尽量少的线程 , 就能让当前的资源高效利用呢?
可能大家有个疑问:怎么最优线程数 , 有毛用啊!我反正给他很多线程 , 这不就完事了吗?比如最后线程是100 , 我给你200(好 , 你是牛人 , 你是有钱人 , 哈哈)
但是我认为:对资源使用情况的合理理解和分析 , 是很重要的 , 尤其是如果你是个老板 , 你要关心钱用了多少吧 , 那些钱不该花吧!如果你是个技术人员 , 你要告诉你的老板这些是啊 , 毕竟你是一个有追求的程序员(不然老板就开了你 。 。 。 )

推荐阅读