【问题标题】:Golang: how to verify number of processors on which a Go program is runningGolang:如何验证运行 Go 程序的处理器数量
【发布时间】:2012-10-25 10:40:28
【问题描述】:

我是 Google Go (Golang) 的新手。我的问题与What exactly does runtime.Gosched do? 这个帖子有关。代码结构复制如下。我的问题是,当我更改 GOMAXPROCS 中的处理器数量时,我如何验证它正在运行多少个处理器。当我执行 'top' 时,它会显示一个消耗 100% 或更少资源的进程,即使 GOMAXPROCS 大于 1。我会感谢您的帮助。

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func doTasks() {
    fmt.Println(" Doing task ")
    for ji := 1; ji < 100000000; ji++ {
        for io := 1; io < 10; io++ {
            //Some computations
        }
    }
    runtime.Gosched()

    wg.Done()
}

func main() {
    wg.Add(1)
    runtime.GOMAXPROCS(1) // or 2 or 4
    go doTasks()
    doTasks()
    wg.Wait()
}

【问题讨论】:

  • 你在什么操作系统上测试这个?了解您使用的 CPU 也会有所帮助。我无法重现该行为。
  • cat /etc/*-release 返回:Red Hat Enterprise Linux Workstation 版本 6.3(圣地亚哥)。操作系统是linux。 CPU 是 Intel(R) Xeon(R) CPU,X5460 @ 3.16GHz。 NumCPU 返回 8。
  • 看来你的大括号没有配对(func doTasks())。这很重要,因为调用 runtime.Gosched() 的位置很重要......
  • 请尝试合理地格式化您的代码。您可以将其粘贴到 play.golang.org 并单击format,它会为您执行此操作。您会注意到它会失败,因为您的代码无效。当您的代码有效时,更容易为您提供帮助。
  • 我不确定top(这些天我很少碰它)但htop 默认显示所有运行在每个过程的上下文。当然,这不是 正在运行 线程的数量,但至少它可以让您了解 Go 运行时是否决定为您的程序创建另一个线程。跨度>

标签: parallel-processing go


【解决方案1】:

进程在给定时间可以运行的最大逻辑 CPU 数量不超过 runtime.GOMAXPROCS(0)runtime.NumCPU() 的最小值。

func MaxParallelism() int {
    maxProcs := runtime.GOMAXPROCS(0)
    numCPU := runtime.NumCPU()
    if maxProcs < numCPU {
        return maxProcs
    }
    return numCPU
}

【讨论】:

  • +1 这看起来是一个正确的解决方案(或者至少很有趣)。但是您是否有一些关于缺乏更好和更持久的方法的消息来源?
  • 不确定是不是只有我一个人,但 MaxParallelism 在我的 2011 Macbook Air 和运行 Debian 7 的 8 核 Intel 服务器上返回 0。我的解决方法是使用 runtime.NumCPU,它为 MBA 返回 4(2 个线程在每个 2 个核心)和服务器上的 8 个 CPU(有 8 个非超线程核心 XEON)。使用 Go 1.2 完成测试。
  • @PeterKrnjevic:我无法重现这个。 Macbook air 10.9,去 1.2。
  • @MattJoiner:在我的 Macbook Air 10.9.1 上运行这个play.golang.org/p/IFnlTmTD6Q,使用 go1.2rc2,打印 1。在使用 go1.2 linux/amd64 的 Debian 服务器上也是如此。它可能与64位有关吗?很好奇我之前是如何得到 0 的,但在那种情况下,我在一个更大的程序中使用了你的 MaxParallelism - 很可能是 pebcak。
  • @PeterKrnjevic:我不确定。 Macbook 也是 64 位的。对于 runtime.NumCPU 工作,但不是 GOMAXPROCS 会在 Go 运行时提示错误。更新到稳定版本并检查它没有发生。
【解决方案2】:

核心数量可通过http://golang.org/pkg/runtime/#NumCPU查询。

文档说:“NumCPU 返回本地机器上逻辑 CPU 的数量。”

【讨论】:

  • 谢谢。但是,我想问一下,如何知道当前 go 程序正在运行的 CPU 数量。此数字小于或等于 NumCPU。
猜你喜欢
  • 2016-02-29
  • 2015-10-23
  • 2023-02-21
  • 2016-04-10
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多