您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

Go: gops如何与Go运行时交互?

时间:2020-09-07 11:22:46  来源:  作者:

:information_source: 本文基于Go1.13和gops 0.3.7

gops致力于帮助开发者诊断Go进程并与之交互。它提供跟踪运行中程序数秒,通过pprof获取CPU分析数据,甚至可以直接和GC交互的能力。

发现

gops提供了一种发现服务,该服务可以罗列出计算机上运行的Go进程。不带参数的运行gops仅显示Go进程。为了举例说明,我启动了一个计算高达一百万素数的程序。这是输出结果:

295 1 gops          go1.13 /go/src/github.com/google/gops/gops
168 1 prime-number* go1.13 /go/prime-number/prime-numbe

gops发现了上面启动的程序和自己本身的进程。让我们先来了解下gops如何过滤Go进程。

首先,gops列出所有的进程。然后对于每个进程,它打开二进制文件读取符号表:

Go: gops如何与Go运行时交互?

 

如果符号表包含 runtime.main (主goroutine入口)或者 main.main (我们程序的入口),它会被标记成Go程序。

如果想了解更多主goroutine,建议阅读之前的文章 Go: g0, 特殊的goroutine

gops还可以通过阅读符号表里 runtime.buildVersion 来获取使用的Go版本。但是,由于可以从二进制中删除符号表,所以gops需要另一种方式来检测Go二进制文件。让我们用删除符号表后的二进程文件再试一次:

295 1 gops            go1.13             /go/src/..../gops
168 1 prime-number-s* unknown Go version /go/.../prime-number-

程序能够被正确的标识为Go二进制文件,但是因为缺少符号表而不能检测出Go版本。根据ELF,MZ等可执行文件格式,gops会读取各段来查找嵌在二进制文件中的构建ID。一旦发现流程结束,它就可以开始与程序交互。

交互

与其他Go程序进行交互的唯一条件是确保它们启动gops代理。该代理是一个简单的监听器,将为gops请求提供服务。只需添加以下行即可:

if err := agent.Listen(agent.Options{}); err != nil {
    log.Fatal(err)}

然后,任何启动了代理的程序都可以和gops交互。这里是执行stats命令的例子:

# gops stats 168
goroutines: 6210
OS threads: 9
GOMAXPROCS: 2
num CPU: 2

更多命令,你可以查阅官方手册。如果代理缺失,你将会在交互时收到一个报错:

Couldn't resolve addr or pid 168 to TCPAddress: couldn't get port for PID 168

该错误表明gops通过TCP寻找暴露的端口以便与程序进行交互。让我们画出这个包的工作流来了解它。

工作流

gops与要读取的程序之间的通信是通过TCP和程序暴露的端口来完成的:

Go: gops如何与Go运行时交互?

 

分配给每个程序的端口都写在一个配置文件中,例如 path/to/config/{processID} ,这使得 gops 很容易知道暴露的端口。然后, gops 可以将命令标识发送给程序,代理 将会收集数据并响应:

Go: gops如何与Go运行时交互?

 

编译自:

https://medium.com/a-journey-with-go/go-how-does-gops-interact-with-the-runtime-778d7f9d7c18



Tags:gops   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
:information_source: 本文基于Go1.13和gops 0.3.7gops致力于帮助开发者诊断Go进程并与之交互。它提供跟踪运行中程序数秒,通过pprof获取CPU分析数据,甚至可以直接和GC交互的...【详细内容】
2020-09-07  Tags: gops  点击:(91)  评论:(0)  加入收藏
▌简易百科推荐
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Go语言中文网    Tags:Go语言   点击:(12)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Go语言中文网    Tags:slices 包   点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  crossoverJie    Tags:Go   点击:(29)  评论:(0)  加入收藏
go-micro是基于 Go 语言用于开发的微服务的 RPC 框架,主要功能如下:服务发现,负载均衡 ,消息编码,请求/响应,Async Messaging,可插拔接口,最后这个功能牛p安装步骤安装proto...【详细内容】
2021-09-06    石老师小跟班  Tags:go-micro   点击:(196)  评论:(0)  加入收藏
GoLand 2021.2 EAP 5 现已发布。用户可以从工具箱应用程序中获得 EAP 构建,也可以从官方网站手动下载。并且从此 EAP 开始,只有拥有有效的 JetBrains 帐户才能加入该计划。手...【详细内容】
2021-06-29  IT实战联盟  今日头条  Tags:GoLand   点击:(185)  评论:(0)  加入收藏
作者:HDT3213今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器。支持: 5 种数据结构(string、list、hash、set、sortedset) 自动过期(TTL) 发布订阅、地理位...【详细内容】
2021-06-18  HelloGitHub  今日头条  Tags:Go   点击:(125)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  1024课堂    Tags:Go语言   点击:(232)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  HelloGo  今日头条  Tags:Go语言   点击:(223)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:Go语言   点击:(236)  评论:(0)  加入收藏
1.简介channel是Go语言的一大特性,基于channel有很多值得探讨的问题,如 channel为什么是并发安全的? 同步通道和异步通道有啥区别? 通道为何会阻塞协程? 使用通道导致阻塞的协程...【详细内容】
2021-05-10  程序员麻辣烫  今日头条  Tags:Go通道   点击:(272)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条