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查看帮助
  • F10Ctrl+C退出应用

roumon会实时显示所有活跃goroutine的状态、数量变化等信息,帮助你监控和分析Go程序的并发情况。


更多关于golang实时监控所有活跃goroutine状态的命令行工具插件roumon的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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状态。

作为独立工具运行

  1. 首先安装roumon CLI工具:
go install github.com/becheran/roumon/cmd/roumon@latest
  1. 监控运行中的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状态,开发者可以更早地发现并发问题,提高程序的稳定性和可靠性。

回到顶部