服务启动慢分析小记

news2024/11/17 23:36:39

文章目录

    • 1. 写在最前面
    • 2. 分析过程
      • 2.1 初步分析
    • 2.2 深入分析
        • 2.2.1 是否为 master 卡住
        • 2.2.2 分析 sidecar 侧
          • 2.2.2.1 gdb 调试
          • 2.2.2.2 dlv 调试
    • 3. 碎碎念
    • 4. 参考资料:

1. 写在最前面

不出意外,就是要出意外。还是忙忙碌碌木有学习 AI 知识的一个月,那只能浅浅的记录一下,这个月分析定位服务启动慢问题的方法,方便后续再遇到时候,还要从头分析。

背景: 笔者负责的业务是有多个服务组成的,即当客户请求的时候,会根据客户的请求的参数,动态判断需要拉起的服务组合。具体组成:

  • master : 负责拉起 sidecar ,及根据 sidecar 返回的需要拉起的服务说明拉起服务

  • sidecar :识别参数,然后返回需要拉起的服务内容

注:master 与 sidecar 之间是通过 pipe 交互的

现象: 请求会返回超时,原因是在 master 拉起 sidecar 的时候卡主超过了 5s 。

2. 分析过程

2.1 初步分析

这个现象在业务上 HCI 的时候,任务启动超时的现象很像,原因是在 hci 的 docker 上 pipe 大小被修改。

查看出现启动超时的机器的 pipe 大小:

#  ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128105
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

注:通过 ulimit -a 到 pipe size 一次原子写入为:512Bytes*8=4096 bytes, 而 linux pipe 的默认大小为 16内存页,即 4096 * 16 = 65536bytes

当时排查的时候记录过程:记一次神奇的 pipe 错误_pipe中数据小于4096无法读出

2.2 深入分析

2.2.1 是否为 master 卡住
  • 首先,将机器上会有多个 master ,数量缩减为 1

  • 其次,使用 strace 命令跟踪 master 的系统调用,观察其是否有卡住

    注:attached 到 PID 为 18551 的进程,开始跟踪其系统调用。

    # strace -p 18551
    strace: Process 18551 attached
    epoll_wait(4, [], 32, 622)              = 0
    epoll_wait(4, [], 32, 2)                = 0
    epoll_wait(4, [], 32, 998)              = 0
    epoll_wait(4, [], 32, 998)              = 0
    epoll_wait(4, [], 32, 2)                = 0
    epoll_wait(4, [], 32, 998)              = 0
    epoll_wait(4, [], 32, 997)              = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 997)              = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 997)              = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 997)              = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, [], 32, 1)                = 0
    epoll_wait(4, ^Cstrace: Process 18551 detached
     <detached ...>
    

结论:启动超时的卡顿不在 master 侧

2.2.2 分析 sidecar 侧
  • 首先,sidecar 这个进程在上述启动超时的情况下,只会保留 5s ,后面就会被 master 主动 kill,防止业务层级的资源泄漏

  • 其次,需要写一个捕获某个 pid 进程的脚本,防止抓不住卡顿的现场,捕获的具体代码如下:

    #!/bin/bash
    
    process_name="sidecar."
    
    # 获取进程的 PID
    pid=$(pgrep $process_name)
    
    # 检查是否获取到 PID
    if [ -n "$pid" ]; then
        echo "Attaching strace to process $process_name with PID $pid"
        strace -p $pid
    else
        echo "Process $process_name not found."
    fi
    

    注:将 strace 命令换为 gdb ,可以换为 gdb 调试的脚步

  • 最后,发现上述的脚步,无法分析更多的原因,只能上 log debug 大法。「最质朴的手段」

    在这里插入图片描述

结论:确实是 sidecar 卡主了,卡住的原因是同步初始化了内部的某个系统 client 卡主了 5s 以上

注:以后写代码,再着急的需求,也得把强弱依赖搞好!

2.2.2.1 gdb 调试

golang 的程序不要尝试使用 gdb 调试了,笔者亲测了,断点有的时候,跑在不同的线程上,似乎没有办法有效的断住。

  • Go 的运行时和调试信息可能会让 gdb 的某些功能变得复杂。特别是 goroutine 的调试可能不如在其他语言中那样直观。

  • Go 生态系统中有一个专门为 Go 设计的调试器,叫做 Delvedlv)。它提供了更好的 Go 支持,尤其是在处理 goroutine 和 Go 的特性时。使用 Delve 进行调试通常会更简单和有效。

2.2.2.2 dlv 调试

这部分网上已经有很多的具体介绍了,这里我就不冗余记录了,但是有一点要注意:

{
	// Use IntelliSense to learn about possible attributes.
	// Hover to view descriptions of existing attributes.
	// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
	"version": "0.2.0",
	"configurations": [
	  {
	    "name": "Launch Remote",
	    "type": "go",
	    "request": "attach",
	    "mode": "remote",
	//  "remotePath": "xxx", //项目远程根路径
	    "port": 8669, //监听端口
	    "host": "101.64.234.xxx", //远程主机/IP
	    "cwd": "/xxxx",//vscode本地工作目录
	    "trace": "verbose" //输出详情
	   }
	]
      }

如果反复尝试,但是还是没有办法成功,可以尝试注释 remotePath 字段,笔者亲测有效

在这里插入图片描述

3. 碎碎念

九月和十月,真的是打工人的福利月,断断续续的假期,让人工作的时候也不会很烦躁:

  • 就是只做好想做的和该做的事情

    对结果没什么执念、内心清澈、平静、松弛

    不是懒散享乐,不是躺平摆烂,不是什么都不在乎

    而是尽力之后对结果的随遇而安

    是无所畏惧,活出自在心安,是坚持自己的本心

  • 在成为大人的路上,去做自己喜欢的事情

4. 参考资料:

  • linux下,pipe的容量的讨论与查看(转)

  • https://elixir.bootlin.com/linux/v3.10/source/include/linux/pipe_fs_i.h#L4

  • 使用Visual Studio Code和delve进行golang远程调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux配置git

一、生成新的 SSH 密钥 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 按照提示操作&#xff1a; 当提示 Enter file in which to save the key (/root/.ssh/id_rsa): 时&#xff0c;直接按回车键使用默认路径。 当提示 Enter passphrase (empty for no p…

CSS样式的4种引入方法

1.行内样式 1.只能影响标签内的样式 2.行内样式可以应用在<body>标记内的所有子标记包括<body>标记在内&#xff0c;但是不能用在<head><title><meta>中 3&#xff0c;行内样式的标记优先级最高 语法&#xff1a;直接再标记内写style属性 &…

PCL 用八叉树方法压缩点云

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1点云压缩 2.1.2点云解压缩 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

基于深度学习的数字识别系统的设计与实现(python、yolov、PyQt5)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

VisualStudio如何卸载Resharper插件?

本来按理说&#xff0c;卸载插件应该就是在扩展下的已安装插件中&#xff0c;找到该插件&#xff0c;点一下就会出现卸载的按钮的。 没想到这个Resharper这么吊&#xff0c;卸载按钮居然是个灰色的&#xff0c;意思就是此路不通&#xff0c;有特权的。 那么这种情况下&#x…

DC-DC动态响应度的优化

DC-DC动态响应度的优化 以MP2315模块为例到底怎么样才能改变动态响应度呢&#xff1f;修改前馈电容修改电感也可以改善动态响应度 以MP2315模块为例 DC-DC输出位置再增加电容 从下面的波形图看出&#xff0c;多了一颗输出电容之后的结果&#xff0c;似乎有那么一点点作用但是…

【JS】严格模式/非严格模式的区别

JS的严格模式和非严格模式 js运行有两种模式&#xff1a;一种是普通模式&#xff1b;一种是严格模式。 严格模式是ES5添加的&#xff0c;是比普通模式多一部分的js规则。如果在ES5之前js解析引擎&#xff0c;会忽略严格模式。 js一般默认是普通模式&#xff0c;ES6的模块和Cla…

【优选算法之位运算】No.7--- 经典位运算算法

文章目录 前言一、位运算几种模型&#xff1a;1.1 基础的位运算&#xff1a; << >> ~ & | ^1.2 几种模型&#xff1a;1.3 模型练习 二、位运算示例&#xff1a;2.1 判定字符是否唯⼀2.2 丢失的数字2.3 两整数之和2.4 只出现⼀次的数字 II2.5 消失的两个数字 前…

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时&#xff0c;可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件&#xff0c;本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容&#xff1a; 腾讯云服务器&#xff1a;https://curl.qcloud.com/Sjy0zKjy 2…

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ▐ 微服务带来的挑战 二.微服务解决方案SpringCloud ▐ SpringCloud的版本 ▐ SpringCloud和SpringBoot的关系 ▐ SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ▐ Spring Cloud 实现对比 在入门Spring Cloud 之前&#xff…

太速科技-383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡

基于kintex UltraScale XCKU060的双路QSFP光纤PCIe 卡 一、板卡概述 本板卡系我司自主研发&#xff0c;基于Xilinx UltraScale Kintex系列FPGA XCKU060-FFVA1156-2-I架构&#xff0c;支持PCIE Gen3 x8模式的高速信号处理板卡&#xff0c;搭配两路40G QSFP接口&#xff…

DataX3.0:深入探索与实战应用

DataX3.0是阿里云DataWorks数据集成的开源版本&#xff0c;它继承了DataX1.0的优良基因&#xff0c;并在此基础上进行了全面的升级和扩展。新版本的DataX3.0不仅支持更多的数据源和目标端&#xff0c;还提供了更高效的数据同步能力&#xff0c;能够满足企业在数据迁移、数据同步…

虚拟硬盘数据恢复(vmdk、vdi、vhd等虚拟磁盘文件)

我们用的虚拟机有时候用着用着就启动不起来了&#xff0c;可能是操作系统启动扇区出了问题或者硬盘数据损坏。如果还有重要的数据文件在虚拟机里面&#xff0c;不要慌&#xff0c;一般只是操作系统的问题&#xff0c;硬盘里面的文件一般是不会丢失损坏的&#xff0c;即使磁盘有…

【论文阅读】RISE: 3D Perception Makes Real-World Robot Imitation Simple and Effective

Abstract 在模仿学习中&#xff0c;精确的机器人操作需要丰富的空间信息。基于图像的policies模型对象位置来自固定摄像头&#xff0c;对摄像头视图变化很敏感。利用3d点云的策略通常预测关键帧而不是连续动作&#xff0c;这在动态和联系人丰富的场景中造成了困难。为了有效地…

C++核心编程和桌面应用开发 第六天(this指针 友元)

目录 1.this指针 1.1C中空类的大小 1.2类中成员的存储方式 1.3this指针 1.3.1常函数 1.3.2常对象 2.友元 2.1全局函数做友元 2.2类做友元 2.3成员函数做友元 1.this指针 1.1C中空类的大小 1.2 类中成员的存储方式 1.3this指针 this指针指向被调用的成员函数所属的对…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号&#xff0c;先经过数据预处理进行数据集的制作和加载&#xff0c;然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文&#xff08;文末附10分类数据集&#xff09;&#xff1a; Pyth…

详解机器学习经典模型(原理及应用)——支持向量机

一、什么是支持向量机 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的机器学习算法&#xff0c;可用于解决数据分类&#xff08;二分类&#xff09;和回归问题。在分类问题上&#xff0c;SVM的核心思想是在特征空间中找到一个最优的超平面&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https:…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …