对golang的io型进程进行off-cpu分析

news2025/2/28 23:53:23

背景:

对于不能占满所有cpu核数的进程,进行on-cpu的分析是没有意义的,因为可能程序大部分时间都处在阻塞状态。

实验例子程序:

以centos8和golang1.23.3为例,测试下面的程序:

pprof_netio.go

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	//"time"
)

func main() {
	go func() {
		_ = http.ListenAndServe("0.0.0.0:9091", nil)
	}()
	//并发数
	var ConChan = make(chan bool, 100)
	for {
		ConChan <- true
		go func() {
			defer func() {
				<-ConChan
			}()
			doNetIO()
		}()
	}
}

func doNetIO() {
	//fmt.Printf("doNetIO start: %s\n", time.Now().Format(time.DateTime))
	for i := 0; i < 10; i++ {
		_, err := http.Get("http://127.0.0.1:8080/echo_delay")
		if err != nil {
			fmt.Printf("i:%d err: %v\n", i, err)
			return
		}
	}
	//fmt.Printf("doNetIO   end: %s\n", time.Now().Format(time.DateTime))
}

测试请求的是nginx,nginx配置如下:

agent-8080.conf

server{
    listen 8080 reuseport;
    index index.html index.htm index.php;
    root /usr/share/nginx/html;
    access_log /var/log/nginx/access-8080.log main;
    error_log /var/log/nginx/access-8080.log error;

    location ~ /echo_delay {
        limit_rate 30;
        return 200 '{"code":"0","message":"ok","data":"012345678901234567890123456789"}';
    }

    location ~ /*.mp3 {
        root /usr/share/nginx/html;
        limit_rate 10k;
    }

    location ~ /* {
        return 200 '{}';
    }
}

编译运行程序:

go build pprof_netio.go
./pprof_netio

top查看,cpu利用率非常低:

通过pprof:profile查看on-cpu耗时情况:

go tool pprof -http=192.168.36.5:9000 http://127.0.0.1:9091/debug/pprof/profile

默认采样总时长30s,on-cpu时间才690ms,准确说是在30s内只采样到69次,每次采样间隔10ms,pprof推算on-cpu时间是690ms,总之cpu利用率很低。

通过perf查看off-cpu耗时情况:

查看perf支持的调度事件:

以centos8为例,安装依赖:

yum install kernel-debug kernel-debug-devel --nogpgcheck
echo 1 > /proc/sys/kernel/sched_schedstats

perf生成off-cpu火焰图脚本:

perf-offcpu.sh

#/bin/sh
  
if [ "$1" == "" ]; then
    echo “usage: $0 prog_name”
    exit
fi
pid=`ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-offcpu' | awk '{print $2}'`
echo prog_name:$1
echo pid:$pid
perf record -e sched:sched_stat_sleep -e sched:sched_switch \
    -e sched:sched_stat_iowait -e sched:sched_process_exit \
    -e sched:sched_stat_blocked -e sched:sched_stat_wait \
    -g -o perf.data.raw -p $pid -- sleep 30
perf inject -v -s -i perf.data.raw -o perf.data
perf script -F comm,pid,tid,cpu,time,period,event,ip,sym,dso,trace | awk '
    NF > 4 { exec = $1; period_ms = int($5 / 1000000) }
    NF > 1 && NF <= 4 && period_ms > 0 { print $2 }
    NF < 2 && period_ms > 0 { printf "%s\n%d\n\n", exec, period_ms }' | \
    stackcollapse.pl | \
    flamegraph.pl --countname=ms --title="Off-CPU Time Flame Graph" --colors=io > offcpu.svg

进行采样:

sh perf-offcpu.sh 'pprof_netio'

perf的off-cpu火焰图:

可以看出阻塞时间的65%都在等待网络连接的建立、发送、读取。

通过bcc/tools/offcputime查看off-cpu耗时情况:

centos8安装bcc-tools:

yum install bcc-tools --nogpgcheck

bcc生成off-cpu火焰图脚本:

bcc-offcputime.sh

#/bin/sh
  
if [ "$1" == "" ]; then
    echo “usage: $0 prog_name”
    exit
fi
pid=`ps aux | grep $1 | grep -v 'grep' | grep -v 'bcc-offcputime' | awk '{print $2}'`
echo prog_name:$1
echo pid:$pid
/usr/share/bcc/tools/offcputime -df -p $pid 30 > out.stacks
flamegraph.pl --color=io --title="bcc Off-CPU Time Flame Graph" --countname=us < out.stacks > offcpu-bcc.svg

进行采样:

sh bcc-offcputime.sh 'pprof_netio'

bcc的off-cpu火焰图:

可以看出阻塞时间的67%都在等待网络连接的建立、发送、读取。

通过fgprof以代码侵入方式对golang程序进行off-cpu耗时分析:

修改代码,添加fgprof支持:

pprof_netio.go

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"

	//"time"

	"github.com/felixge/fgprof"
)

func main() {
	//fgprof支持
	http.DefaultServeMux.Handle("/debug/fgprof", fgprof.Handler())
	go func() {
		_ = http.ListenAndServe("0.0.0.0:9091", nil)
	}()
	//并发数
	var ConChan = make(chan bool, 100)
	for {
		ConChan <- true
		go func() {
			defer func() {
				<-ConChan
			}()
			doNetIO()
		}()
	}
}

func doNetIO() {
	//fmt.Printf("doNetIO start: %s\n", time.Now().Format(time.DateTime))
	for i := 0; i < 10; i++ {
		_, err := http.Get("http://127.0.0.1:8080/echo_delay")
		if err != nil {
			fmt.Printf("i:%d err: %v\n", i, err)
			return
		}
	}
	//fmt.Printf("doNetIO   end: %s\n", time.Now().Format(time.DateTime))
}

进行fgprof采样:

go tool pprof --http=192.168.36.5:9000 http://localhost:9091/debug/fgprof?seconds=30

fgprof的off-cpu火焰图:

从图看,能大致定位到是阻塞在网络读写上,但给人感觉采样的范围和频率不及perf和bcc,而且看资料不支持采样cgo程序。

参考资料:

Off-CPU Flame Graphs

Linux perf_events Off-CPU Time Flame Graph

fgprof package - github.com/felixge/fgprof - Go Packages

--end--

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

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

相关文章

VS项目,在生成的时候自动修改版本号

demo示例&#xff1a;https://gitee.com/chenheze90/L28_AutoVSversion 可通过下载demo运行即可。 原理&#xff1a;通过csproject项目文件中的Target标签&#xff0c;实现在项目编译之前对项目版本号进行修改&#xff0c;避免手动修改&#xff1b; 1.基础版 效果图如下 部…

springcloud-gateway获取应用响应信息乱码

客户端通过springcloud gateway跳转访问tongweb上的应用&#xff0c;接口响应信息乱码。使用postman直接访问tongweb上的应用&#xff0c;响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类&#xff0c;在该类中获取了上游应用接口的响应信息&#xff0c;直…

node安装,npm安装,vue-cli安装以及element-ui配置项目

node.js Node.js主要用于开发高性能、高并发的网络服务器&#xff0c;特别适合构建HTTP服务器、实时交互应用&#xff08;如聊天室&#xff09;和RESTful API服务器等。‌它使用JavaScript语言&#xff0c;基于Chrome V8引擎&#xff0c;提供模块化开发和丰富的npm生态系统&…

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…

MCU驱动使用

一、时钟的配置&#xff1a; AG32 通常使用 HSE 外部晶体&#xff08;范围&#xff1a;4M~16M&#xff09;。 AG32 中不需要手动设置 PLL 时钟&#xff08;时钟树由系统自动配置&#xff0c;无须用户关注&#xff09;。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …

简单的bytebuddy学习笔记

简单的bytebuddy学习笔记 此笔记对应b站bytebuddy学习视频进行整理&#xff0c;此为视频地址&#xff0c;此处为具体的练习代码地址 一、简介 ByteBuddy是基于ASM (ow2.io)实现的字节码操作类库。比起ASM&#xff0c;ByteBuddy的API更加简单易用。开发者无需了解class file …

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…

python 高级用法

1、推导列表 ans [ x for x in range(6)] print(ans)ans [ x for x in range(6) if x > 2] print(ans)ans [ x*y for x in range(6) if x > 2 for y in range(6) if y < 3] print(ans) 2、map 函数 a list(map(list,"abc")) print(a) b list(map(ch…

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇&#xff0c;可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装&#xff1a; pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…

Redis 7.x如何安装与配置?保姆级教程

大家好&#xff0c;我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程&#xff0c;今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务&#xff0c;然后使用对应客户端连接使用…

如何编辑调试gradle,打印日志

在build.gradle.kts中输入 println("testxwg1 ") logger.lifecycle("testxwg2") logger.log(LogLevel.ERROR,"testxwg5") 点刷新就能看到打印日志了

electron-vite【实战系列教程】

创建项目 https://blog.csdn.net/weixin_41192489/article/details/144442262 安装必要的插件 UI 库 element-plus npm install element-plus --save安装 element-plus 图标 npm install element-plus/icons-vue安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -…

【开源项目】数字孪生轨道~经典开源项目数字孪生智慧轨道——开源工程及源码

飞渡科技数字孪生轨道可视化平台&#xff0c;基于国产数字孪生引擎&#xff0c;结合物联网IOT、大数据、激光雷达等技术&#xff0c;对交通轨道进行超远距、高精度、全天侯的监测&#xff0c;集成轨道交通运营数据&#xff0c;快速准确感知目标&#xff0c;筑牢轨交运营生命线。…

Rstudio安装

Rstudio提供了良好的R语言代码编辑环境&#xff0c;R程序调试环境&#xff0c;图形可视化环境以及方便的R工作空间和工作目录管理。 下载网址&#xff1a;https://posit.co/products/open-source/rstudio/ 进入网址&#xff1a; 下滑找到&#xff0c;点击进入 找到Dsektop&am…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材&#xff0c;但偶尔内容很长无法截全&#xff0c;需要多次截屏再拼接&#xff0c;过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美&#xff0c;如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

【工具】通过js获取chrome浏览器扩展程序列表id及名称等

【工具】通过js获取chrome浏览器扩展程序列表id及名称等 第一步 打开扩展程序页面 chrome://extensions/ 第二部 注入js获取 let 扩展字典 {} document.querySelector("body > extensions-manager").shadowRoot.querySelector("#items-list").shadow…

基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视…

Midjourney参数大全

基本参数​ 纵横比&#xff0c;宽高比​ --aspect&#xff0c;或--ar更改生成的纵横比。 混乱​ --chaos <number 0–100>改变结果的变化程度。更高的数值会产生更多不寻常和意想不到的结果。 图像权重​ --iw <0–2>设置相对于原始图像相识度。默认值为 1&a…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…

Loki 微服务模式组件介绍

目录 一、简介 二、架构图 三、组件介绍 Distributor&#xff08;分发器&#xff09; Ingester&#xff08;存储器&#xff09; Querier&#xff08;查询器&#xff09; Query Frontend&#xff08;查询前端&#xff09; Index Gateway&#xff08;索引网关&#xff09…