multithreading - 使用 GO 时如何测量系统过载

标签 multithreading performance go scalability

我正在用 GO 重写一个旧系统,在旧系统中我正在测量系统负载平均值,以了解是否应该增加线程池中的线程数。

在 Go 中,人们不使用线程池或 goroutine 池,因为启动 goroutine 非常便宜。 但是仍然运行太多的 goroutine 效率会降低到足以将 cpu 使用率保持在 100% 附近

因此有一种方法可以知道有多少 goroutine 已准备好运行(未阻塞)但当前未运行。或者有没有办法获得预定的可运行goroutine“运行队列”的数量。

最佳答案

查看 runtime/pprof package .

要打印“所有当前 goroutines 的堆栈跟踪”,请使用:

pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)

要打印“导致同步原语阻塞的堆栈跟踪”,请使用:

pprof.Lookup("block").WriteTo(os.Stdout, 1)

您可以将这些与 runtime package 中的功能结合使用。如runtime.NumGoroutine获取一些基本报告。

这个例子故意创建了许多阻塞的 goroutine 并等待它们完成。它每 5 秒打印一次 block pprof 配置文件的输出,以及仍然存在的 goroutine 的数量:

package main

import (
    "fmt"
    "math/rand"
    "os"
    "runtime"
    "runtime/pprof"
    "strconv"
    "sync"
    "time"
)

var (
    wg sync.WaitGroup
    m  sync.Mutex
)

func randWait() {
    defer wg.Done()
    m.Lock()
    defer m.Unlock()
    interval, err := time.ParseDuration(strconv.Itoa(rand.Intn(499)+1) + "ms")
    if err != nil {
        fmt.Errorf("%s\n", err)
    }
    time.Sleep(interval)
    return
}

func blockStats() {
    for {
        pprof.Lookup("block").WriteTo(os.Stdout, 1)
        fmt.Println("# Goroutines:", runtime.NumGoroutine())
        time.Sleep(5 * time.Second)
    }
}

func main() {
    rand.Seed(time.Now().Unix())
    runtime.SetBlockProfileRate(1)
    fmt.Println("Running...")
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go randWait()
    }
    go blockStats()
    wg.Wait()
    fmt.Println("Finished.")
}

我不确定这是否是您所追求的,但您可以对其进行修改以满足您的需要。

Playground

关于multithreading - 使用 GO 时如何测量系统过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19718842/

相关文章:

html - 性能权衡——CSS 效率、CSS 文件大小、HTML 文件大小

go - 如何从 map[string]interface{} 编码 XML?

testing - CLI测试如何处理 "fmt"golang库包

go - 如何使用Golang组织异步消息发布到RabbitMQ?

java - 摆脱 Android UI 线程的繁重计算

multithreading - MATLAB 上的进程间通信

ios - 如何在glkview中使用dispatch_async?

c# - 从 C# 调用 WaitForSingleObject

python - DataFrame 各列的有效计数不同,按行分组

javascript - AngularJS + 单核 CPU = 几乎 100% CPU