前言

大家在观察压测&日常线上请求的平响、cpu使用时通常都能见到n多的毛刺,有的毛刺凸显并且有规律可循,有的杂乱无章,这些毛刺到底是因为什么产生的,对应的解决解决套路是怎么样的?

排队和并发

说毛刺之间先来看一下cpu工作的模式:排队和并发,并发指的是我们在某一时刻同时处理多个任务,而排队是指对于cpu而言任务调度处理的机制。这两者直接决定了任务处理的时延,落到用层面也就是我们的用户体验。
认知cpu底层性能的工具和方法有很多种,如果之前没有相对清晰的认知可以看下这篇文章:
https://zhuanlan.zhihu.com/p/213720319
https://zhuanlan.zhihu.com/p/142284880

cpu毛刺

cpu毛刺通常是某时间段(相对较短)cpu消耗攀升导致的,cpu毛刺会导致很多很多不好的事情发生,比如:平响毛刺、任务挤压、缓存更新不及时等n种搞掉你服务可用性的事情,这些问题本质就是一开始提到的时延问题。
攀升的原因通常有这么几点:

大量消耗CPU的定时任务

我们代码中经常起几个线程定时刷一下本地缓存、ct任务定时检查下服务状态或者其他什么事、logstream基础设施,这类定时任务难免会占用cpu,如果这些操作中涉及大量RSA操作、正则过滤、IO操作 CPU瞬间升高是不可避免的,如果压测过程中没有碰到这部分任务,但是线上峰值来了恰好定时任务也执行了,服务可能就部分不可用了,所以在评估真实容量时一定要把所有的cpu消耗全部考虑进来。如果涉及到极端场景下的性能优化,就要考虑把这些东西给停掉保证服务器的纯粹,只干一件事,互不影响。

有人在搞事情

大部分公司线上机器的权限是收敛的不错的,能够限制在操作系统上操作的命令,但是也存在部分场景收敛不到位,或者即使收敛到位了,有人在正则&awk查一个1个G的日志文件也是有可能的。
这里最好的方式就是进一步限制,日志、脚本等操作可以统一收敛入口。

机器问题

我们无法保证机器是完全没有问题的,虽然这应该是op干的活,但是身为rd我们还是需要保持对于服务各种强依赖的不信任,就比如我们的服务器,很多快过保的服务器可能提前发生性能衰退,如果用容器的话,每次可能宿主机都不相同,这样的情况更要谨慎。

可预知但是没在意的工具逻辑

拿Java来说,我们在关注我们代码中相对耗性能的操作,比如说IO、RSA计算等,却时常忽略了进程中GC对于性能影响的占比,在常规流量情况下GC的占比可能也就1%以下,但是如果流量升高之后我们代码的“垃圾特性”就开始凸显了,动辄几个Full GC,整个gc过程的cpu消耗可能都会占到整个进程的cpu使用的50%以上。
拿Redis来说,导致redis cpu used飙升的hgetall、大key、lua脚本等,我们知道会导致cpu 飙升,但是觉着就偶尔几次所以没在意。
很多时候我们会忽略这些特性,觉着工具本身能帮我们解决或者我们无能为力,实际恰恰相反从一开始写代码我们就需要关注到并且深入了解我们所有的工具,向上到服务层面的影响、向下到cpu、内存的影响,对外到对于其他进程的影响。

耗时毛刺

耗时毛刺会直接影响到我们的服务可用性,分析解决问题通常也是从平响毛刺下手再到代码再到CPU、内存、带宽等最后重回代码来操作的。对于耗时,出现毛刺通常是因为在某一时间间隔内请求处理受到阻塞(包括连接处理的阻塞、连接内处理逻辑的阻塞),其中的主要的原因大概率是上面提到的cpu毛刺。

连接处理的阻塞

连接处理的阻塞往往意味着服务处理的极限,因为连接内部整体cpu消耗相对平均,由于cpu资源受限很多连接虽然建立了,但是部分请求迟迟得不到处理致使请求处理存在问题(不响应:502发生)或者处理时间十分长(毛刺产生)。
如果应用如果已经优化到极致了,可以理解为这种情况就是服务器的处理极限了,这时候解决方式只有扩容。如果代码还没有优化,那就先针对各种性能分析的profile优化代码吧,比如减少单个请求中要消耗的CPU、请求处理过程的耗时,针对IO处理的(尽可能不做、合并IO、同步改异步、使用更加高效的API),针对CPU大量消耗的(只能尽可能的不做或者替换代价小的操作方式,何种序列化操作、RSA操作通通干掉)

连接内处理逻辑的阻塞

这个情况的原因有很多:

  • Java、Go中的GC操作导致用户线程暂停

stw一直是GC算法中无法避免的问题,即使现在用写屏障、读屏障等钩子代码标记联动来尽可能减少stw的时间,但是最初的stw仍然无法避免,这是存在GC逻辑的语言中最大的痛,因为stw 期间用户线程完全是暂停的。
我们能做的只有 优化代码尽可能少的stw,根据场景选择选择垃圾回收器,适合的最好的。如果你写Java:ZGC、G1、CMS、parralell GC总有一款适合你,如果你写Go 不如看看bfe重写GC模块的案例。

  • 下游响应较慢,但超时时间较长

很多时候平响毛刺并不直接因为我们服务的原因,下游耗时时间忽然增加,又恰好我们的超时时间又设置的很长,毫无疑问我们会随着下游的抖动而一起抖动,如果依赖的下游很多,我门这样随机出现毛刺的概率也会相应的提升。

  • 某时段CPU消耗骤升

这一块的原因其实就是一开始说的cpu毛刺,某小时间段内的cpu使用率飙升我们的操作迟迟得不到处理或者处理缓慢就会出现大量的毛刺。

  • 误用epoll的问题

这是一个很小的原因,但是很多时候线上出现的很长时间的无效链接、大量的接入层502可能就是这个原因导致的。
epoll(event poll)可以理解为是一个盒子收集缓冲区信号通知,内部维护了socket注册列表(epoll_ctl:红黑树)和一个就绪队列(epoll_wait:rdllist双向链表)对外提供事件通知,外部会拿到epoll_wait返回的就绪文件描述符集合,然后循环事件进行处理。

epoll有两种模式:LT、ET。LT水平触发相当于会只要可读、可写就会有事件给出。但是在ET边缘触发模式(条件触发)下,有数据到来仅通知一次(系统不会充斥大量不关心的就绪文件描述符,只返回新的)。


ET模式下:
有多个连接同时到达,服务器的就绪队列瞬间积累多个就绪连接,accept只处理一个连接,导致就绪队列中剩下的连接都得不到处理,可能会发生饥饿现象,导致一些连接始终到达不了出发条件而一直无法处理产生无响应状态,导致毛刺或者接入层502的产生。
还有一种情况是:文件描述符如果不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。这样就不能在阻塞在epoll_wait上了,造成其他文件描述符的任务饥饿,导致无法处理。

remarks:图都是网上找的

定位问题

火焰图

在分析服务性能极限,优化代码性能时通常会用火焰图来打印各种profile来进行分析。
挂火焰图分析通常是压服务极限时使用的。(
常见压测的套路:
1、压服务极限(发现代码问题,优化现有代码)
2、压单机极限(用来评估整体容量,通常和第一步合并进行,cpu used 60%~70%)
3、压集群极限(按照目标峰值压测)
4、按照上述环节压降级

直接贴几个工具吧:
C :sudo perf record -F 99 -p 22645 -g -- sleep 30
Go 语言:go-torch
Java :https://github.com/jvm-profiling-tools
https://github.com/brendangregg/FlameGraph 生成图片就可以了。

shell 命令

对于线上的应用火焰图可能不太合适,因为拉取cpu、内存profile的过程对于cpu、带宽消耗很多,所以通常就找一台机器用原生的命令拉取一下快照(也会有损耗但是还好)
通常来说:
1、top 看一下当前消耗较大的进程
2、top -p 拉目标进程分析单个进程内消耗情况
3、找到最大的线程
4、jstack 看一下对应的具体情况(如果是Java 应用的话)

性能分析 -- 各种毛刺相关推荐

  1. Go 学习笔记(81)— Go 性能分析工具 pprof

    Go 语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU消耗 .内存分配及阻塞分析 .具体作用如下: 性能分析首先需要使用 runtime.pprof 包嵌入到待分 ...

  2. App性能分析数据监控

    App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...

  3. Tesla T4视频编码性能分析

    Tesla T4视频编码性能分析 从开普勒开始的所有 NVIDIA GPUs 都支持完全加速的硬件视频编码: GPUs 支持完全加速的硬件视频解码.最近发布的图灵硬件提供了张量核心和更好的机器学习性能 ...

  4. Yolov4性能分析(下)

    Yolov4性能分析(下) 六. 权重更新 "darknet/src/detector.c"–train_detector()函数中: ....../* 开始训练网络 */floa ...

  5. Yolov4性能分析(上)

    Yolov4性能分析(上) 一.目录 实验测试 1) 测试介绍 2) Test 3) Train 二.分析 1.实验测试 1 实验测试方法 Yolov4训练train实验方法(Darknet shou ...

  6. 关于 Rocksdb 性能分析 需要知道的一些“小技巧“ -- perf_context的“内功” ,systemtap、perf、 ftrace的颜值

    文章目录 内部工具 包含头文件 接口使用 核心指标 Perf Context IOStats Context 外部工具 Systemtap 工具 Perf工具 Ftrace 工具 2020.8.20 ...

  7. Linux性能分析命令工具汇总

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  8. C#中判断空字符串的3种方法性能分析【月儿原创】

    C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.28  3种方法分别是:string ...

  9. php 生成动态键值 数组_你的PHP项目遇到性能问题了吗?看完这篇性能分析恍然大悟...

    你的项目中遇到性能问题了吗?遇到性能问题你是如何解决的呢?你的解决方式是否正确呢?下面就跟大家一起分享php项目的性能问题. PHP语言级性能分析 php在什么情况下会遇到性能问题呢? 在讨论性能问题 ...

最新文章

  1. 关于释放内存的那点事
  2. 【倒计时】Qtum量子链全节点超级大奖1000QTUM,不要错过!
  3. (王道408考研数据结构)第八章排序-第三节2:堆与堆排序
  4. Python组合数据类型:序列sequence,列表list、元组tuple
  5. SpringCloud学习笔记018---SpringBoot前后端分离_集成_SpringSecurity_简单实现
  6. MyBatis入门到精通——Mybatis入门篇
  7. 学校计算机机房台账,机房工作
  8. 腾讯游戏人脸识别系统更新!刷脸的同时语音提示付款成功_游侠网 Ali213.net
  9. oracle数据库中sql语句性能提升之to_char改造
  10. 强化学习中值迭代收敛性推理证明
  11. vue -- v-cloak解决刷新或者加载出现闪烁(显示变量)
  12. 关于可达矩阵的O(N*N)算法和强分图的O(E)算法
  13. 【简单的小技巧】如何从网页上下载内嵌的PDF文件?
  14. Exploring Sparsity in Image Super-Resolution for Efficient Inference
  15. 医院子母钟时钟系统方案
  16. win10 caffe安装,mnist训练,测试
  17. 洛谷 P1567 统计天数
  18. html+css简单的实现360搜索引擎首页面
  19. html中如何把一张图片分块,神奇图片分割软件有哪些分割模式 图片分割器如何检验能否无缝拼图...
  20. arcsde93安装好了之后,配置连接sde库失败, 提示st_domain_methods报错

热门文章

  1. 上周热点回顾(7.4-7.10)
  2. java微信开发需具备的条件
  3. 25 Nacos实战:灰度配置如何实现?
  4. tomcat安装以及部署jpress
  5. r730xd服务器重装系统后风扇声音大,重装Win10系统后散热风扇噪音特别大的处理方法...
  6. 呼叫中心外呼系统与双呼系统对比
  7. 百度地图加载过慢问题
  8. 借机,贷记,往帐,来帐
  9. python报错:SyntaxError: Non-UTF-8 code starting with ‘\xe6‘ in file
  10. 软件设计学习笔记1_架构