首页 > 其他分享 >一次系统延迟性优化案例

一次系统延迟性优化案例

时间:2023-03-07 23:22:38浏览次数:45  
标签:协程 系统 案例 sql go 优化 cpu 延迟

一次系统延迟性优化案例

服务监控系列文章

服务监控系列视频

延迟的本质

本质是cpu没有及时的运行程序代码。

进程内部

网络io,磁盘io,cpu调度 达到瓶颈

第三方系统

调用的第三方系统慢,mysql,redis等基础组件调度慢, 第三方应用系统调用慢

问题背景

线上隔三差五晚上10点左右总会有sql报警出现,且是同样的sql,我们的sql报警是在应用程序内部通过对sql操作增加钩子函数,对sql前后执行的位置进行计时,然后sql执行完毕后,对时间进行判断,大于1s则报警。
晚上10点正好是我们的业务高峰。部分接口也会在此期间出现超过2s的响应。
image.png

探索过程

排查sql慢查询

通过后台的慢查询日志,没有发现这条慢sql打印出来,且重新执行该sql,执行时间仍然在毫秒内完成,排除掉sql写法本身带来的性能问题。

排查系统各项指标

查看系统cpu,网络带宽Mbps,磁盘iops,Bps,均未到达瓶颈,仅在高峰期有波峰。
image.png系统是4核系统,唯一达到瓶颈的也就是系统负载达到了5。说明有进程或线程在等待执行。
为什么系统各个硬件指标都不是很高,程序反而慢了呢,cpu为什么没有干更多活来执行更多的指令呢。

考虑程序在执行一个cpu使用率不高的动作,但是这个动作却不是在执行用户代码

一般通过go tool pprof 查看cpu的使用率是查看hot-cpu,也就是cpu真正执行的时间,但是如果要看等待cpu的时间得看off-cpu,go提供了这样的工具(github.com/felixge/fgprof)
image.png可以看到一个方法在执行时由于查询了数据库,cpu在withLock 和等待数据库返回数据库时耗费了很多等待时间。但是这里只能看出这部分代码等待cpu的时间占所有等待时间的大部分,无法确定程序真正等待的时间。

用go trace分析系统延迟

基于上面分析,为更进一步确定是数据库查询带来的耗时, 采用更加精确化的工具 go trace分析程序运行时的动作。go trace 是golang提供的官方工具。
image.png
进行了3s的采样,其中网络io等待时间就占了2秒多,我的理解程序会在网络io系统调用开始时记录下此时协程的时间,并将协程从p队列拿下来,然后异步等到epoll回调通知,等到文件描述符可读后,将协程重新加入到p队列,重新执行调度。这里的Network wait就是从p队列拿下来到加入到p队列的时间间隔,然后真正执行是要等待Scheduler wait 调度等待时间才会被调度。
这里协程的网络等待时间长,但是不能完全说明是导致系统延迟的原因,因为在keepAlive开始时,一个协程是有可能处理多个网络请求的,所以有可能是多次请求间,读等待时间较长导致。所以继续看下其他指标。
image.png
协程从就绪可运行状态到真正被调度耗时了879ms,可见协程调度的压力也是过大的。
image.png
由于程序阻塞带来的延迟开销也是不小的,达到778ms。
对应于之前off-cpu看到的网络和阻塞开销就是执行数据库操作时的网络请求以及withlock操作,由于阻塞更加剧了协程调度的开销。每次阻塞都会引发协程的重新调度。当然go trace左上角可以点击graph同样能观察得出上述结论。

优化

由于程序的阻塞虽然不是慢查询导致,但是依然是由于数据库操作带来的,所以简单直接的优化就是减少数据库操作,或者更直接点说,在高并发接口下,尽可能减少网络等阻塞操作。
将这部分查询数据提前存到内存里,通过内存直接查询。

成果

image.png可以看到对比之前情况,除开22点峰值,已经没有超过2s的响应了,但是22点峰值时还是会有,原因是我们线上的机器同时部署了多台服务,由于其他服务的影响导致,所以后续可能还会继续做优化,将其他服务的处理接口能力提升上去,或者更好的做好隔离。

结论

go trace 是个很好的分析系统延迟的工具。
对高并发接口的设计最好减少网络以及其他阻塞操作,流量上去后,这些阻塞很可能带来系统延迟。

标签:协程,系统,案例,sql,go,优化,cpu,延迟
From: https://www.cnblogs.com/hobbybear/p/17190146.html

相关文章

  • SQL优化
    insert优化1.批量插入2.手动提交事务3.主键顺序插入4.大批量插入数据(load)客户端连接时加入参数--local-infilemysql--local-infile-uroot-p开启全局参数......
  • #yyds干货盘点#【愚公系列】2023年03月 .NET CORE工具案例-.NET Core使用MiniExcel
    前言1.MiniExcel的介绍MiniExcel是一个简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内......
  • 优化 CSS 代码的12个小技巧
    优化CSS代码的12个小技巧2022-11-2509:03·Echa攻城狮 大家好,我是Echa。今天来分享12个优化CSS代码小技巧!1.避免高消耗属性分析表明,一些CSS属性的渲染速......
  • 前端布局小案例,如何创建漂亮的毛玻璃输入表单卡片效果
    前端布局小案例,如何创建漂亮的毛玻璃输入表单卡片效果原创2023-03-0607:30·前端达人转载说明:原创不易,未经授权,谢绝任何形式的转载在当今互联网时代,用户体验是至关重......
  • TCL 拥抱云原生,实现 IT 成本治理优化
    作者:行疾TCL工程师团队基于阿里云企业云原生IT成本治理方案沉淀了一套成熟的IT企业成本治理流程与系统,通过阿里云容器服务提供的开箱即用的成本洞察、资源智能画像......
  • IDEA的使用及优化
    IDEA的使用及优化一、IDEA安装傻瓜式安装(https://www.jetbrains.com/idea/)IDEA优化1、方法分割线1、打开设置Settings...2、Editor-->General-->Appearanc......
  • 关键路径与时序优化
    关键路径关键路径通常是指同步逻辑电路中,组合逻辑时延最大的路径(这里我认为还需要加上布线的延迟),也就是说关键路径是对设计性能起决定性影响的时序路径。对关键路径进行时......
  • 为什么99%的程序员都做不好SQL优化?
    连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安......
  • 为什么99%的程序员都做不好SQL优化?
    连接层最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安......
  • 对某万年历的优化
    前言本篇随笔将一份万年历系统稍加注释,并添加了一个新功能,供大家参考对原代码的理解主要功能:查询某日期是周几查询某年是否为闰年打印某年的日历查询某月的最大天......