golang实时监控所有活跃goroutine状态的命令行工具插件roumon的使用
Golang实时监控所有活跃goroutine状态的命令行工具插件roumon的使用
简介
roumon是一个用于在shell中跟踪活跃goroutine状态的监控工具,主要功能包括:
- 实时跟踪所有活跃goroutine的状态
- 使用termui开发的终端用户界面
- 简单集成pprof服务器进行实时监控
- 动态显示goroutine数量历史记录
- 支持全文过滤
- 提供routine状态概览
安装
go install github.com/becheran/roumon@latest
或者从发布页面下载预编译的二进制文件。
使用方法
准备pprof服务器
在需要监控的Go程序中,首先需要导入pprof并启动一个HTTP服务器:
import _ "net/http/pprof"
// 启动pprof服务器
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
启动程序后,可以通过浏览器访问http://localhost:6060/debug/pprof
确认pprof是否正常工作。
使用roumon
在命令行中启动roumon,可以使用以下可选参数:
Usage of roumon:
-debug string
调试文件路径
-host string
pprof服务器的IP或主机名 (默认 "localhost")
-port int
pprof服务器端口 (默认 6060)
示例命令:
roumon -debug=logfile -host=192.168.10.1 -port=8081
这个命令会监控192.168.10.1:8081
的pprof数据,并将调试日志写入./logfile
。
完整示例
下面是一个完整的示例程序,展示如何设置pprof服务器并使用roumon监控:
package main
import (
"log"
"net/http"
_ "net/http/pprof" // 导入pprof
"time"
)
func worker() {
for {
time.Sleep(1 * time.Second)
}
}
func main() {
// 启动5个goroutine
for i := 0; i < 5; i++ {
go worker()
}
// 启动pprof服务器
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// 主程序继续运行
select {}
}
启动这个程序后,在另一个终端运行:
roumon
界面操作
在roumon的终端用户界面(TUI)中:
- 按
F1
查看帮助 - 按
F10
或Ctrl+C
退出应用
roumon会实时显示所有活跃goroutine的状态、数量变化等信息,帮助你监控和分析Go程序的并发情况。
更多关于golang实时监控所有活跃goroutine状态的命令行工具插件roumon的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实时监控所有活跃goroutine状态的命令行工具插件roumon的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
roumon - Golang实时监控Goroutine的命令行工具
roumon是一个用于实时监控Go程序中所有活跃goroutine状态的命令行工具插件。它可以帮助开发者了解程序运行时goroutine的数量、状态和堆栈信息,对于调试goroutine泄漏或性能问题非常有用。
安装roumon
go get github.com/becheran/roumon
基本用法
roumon可以作为库集成到你的Go程序中,也可以作为独立的命令行工具运行。
作为库集成
package main
import (
"time"
"github.com/becheran/roumon"
)
func worker() {
for {
time.Sleep(1 * time.Second)
}
}
func main() {
// 启动roumon监控
roumon.Start()
// 启动一些goroutine
for i := 0; i < 5; i++ {
go worker()
}
// 保持程序运行
select {}
}
运行程序后,roumon会在默认端口(例如:6060)启动一个HTTP服务器,你可以通过浏览器访问查看goroutine状态。
作为独立工具运行
- 首先安装roumon CLI工具:
go install github.com/becheran/roumon/cmd/roumon@latest
- 监控运行中的Go程序:
roumon -pid <your_go_program_pid>
主要功能
实时监控goroutine数量
roumon会显示当前活跃goroutine的总数,并按状态分类:
- Runnable
- Running
- Waiting
- Syscall
- Other
查看goroutine堆栈
可以查看每个goroutine的完整调用堆栈,帮助定位问题。
历史趋势图
roumon可以显示goroutine数量的历史变化趋势,便于分析goroutine泄漏问题。
过滤功能
支持按goroutine状态、函数名等条件过滤显示结果。
高级用法
自定义配置
roumon.StartWithConfig(roumon.Config{
Host: "localhost",
Port: 7070,
RefreshInterval: 2 * time.Second,
EnableHistory: true,
HistorySize: 100,
})
集成到Web应用
roumon的监控数据可以通过HTTP API获取,方便集成到自己的监控系统中:
resp, err := http.Get("http://localhost:6060/api/goroutines")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
实际应用示例
package main
import (
"context"
"log"
"net/http"
"time"
"github.com/becheran/roumon"
)
func leakyWorker(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
time.Sleep(100 * time.Millisecond)
}
}
}
func main() {
// 启动roumon监控
roumon.Start()
// 模拟goroutine泄漏
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for i := 0; i < 10; i++ {
go leakyWorker(ctx)
}
// 启动HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, check goroutines at :6060"))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
运行此程序后,访问localhost:6060
可以看到goroutine监控界面,观察goroutine数量是否随时间增长来判断是否存在泄漏。
总结
roumon是一个简单但功能强大的goroutine监控工具,特别适合用于:
- 检测goroutine泄漏
- 分析程序并发性能
- 调试复杂的goroutine交互问题
- 监控生产环境中的goroutine状态
通过实时监控goroutine状态,开发者可以更早地发现并发问题,提高程序的稳定性和可靠性。