转到CPU /内存/网络

时间:2012-07-24 05:18:10

标签: windows go cpu-usage

我正在编写一个作为守护进程运行的跨平台Go应用程序。它基本上监听文件系统的更改以及对服务器的复制/下载更改。这个想法是它永远不应该减慢机器的速度,排队任务直到机器空闲。

为此,我想监控CPU,RAM和网络使用情况,但监控网络使用情况(如果可能)。我目前的目标是Windows 7 +,Mac OS 10+和Linux 3 +。

我主要是Linux程序员,所以我不熟悉Windows / BSD API,但我已经找到了一些关于BSD的好信息,所以我想我能搞清楚。我在跟踪Windows系统调用时遇到问题(我不知道如何获取Windows手册页......)。我已经设法找到这些资源(对于Windows):

我更喜欢使用系统调用而不是shell / out包装C ++ API。显然,我会对已经这样做的任何其他Go库感兴趣。

最终,我正在寻找这样的事情:http://nodejs.org/api/os.html

我非常关注系统调用以及如何使用它们的示例。

如果我朝错误的方向前进,请告诉我。我没有结合轮询内核获取系统信息的想法,但在我看来,这是获取该信息的最可靠方法。我更喜欢以弱势用户身份运行该应用程序。

1 个答案:

答案 0 :(得分:3)

我找到了https://github.com/AllenDang/w32,这是一个为许多Windows API调用提供包装器的项目。我添加了对GetSystemTimes in my fork的调用,这就是我目前正在使用的内容。我已经打开了拉取请求,所以它应该很快合并。

这允许我获取CPU信息(空闲,内核和用户的时间,类似于/proc/stats),并且它似乎工作得很好。这是一些示例代码:

package main

import (
    "w32"
    "fmt"
    "time"
)

func main() {
    var idle, kernel, user w32.FILETIME

    w32.GetSystemTimes(&idle, &kernel, &user)
    idleFirst   := idle.DwLowDateTime   | (idle.DwHighDateTime << 32)
    kernelFirst := kernel.DwLowDateTime | (kernel.DwHighDateTime << 32)
    userFirst   := user.DwLowDateTime   | (user.DwHighDateTime << 32)

    time.Sleep(time.Second)

    w32.GetSystemTimes(&idle, &kernel, &user)
    idleSecond   := idle.DwLowDateTime   | (idle.DwHighDateTime << 32)
    kernelSecond := kernel.DwLowDateTime | (kernel.DwHighDateTime << 32)
    userSecond   := user.DwLowDateTime   | (user.DwHighDateTime << 32)

    totalIdle   := float64(idleSecond - idleFirst)
    totalKernel := float64(kernelSecond - kernelFirst)
    totalUser   := float64(userSecond - userFirst)
    totalSys    := float64(totalKernel + totalUser)

    fmt.Printf("Idle: %f%%\nKernel: %f%%\nUser: %f%%\n", (totalIdle / totalSys) * 100, (totalKernel / totalSys) * 100, (totalUser / totalSys) * 100)
    fmt.Printf("\nTotal: %f%%\n", (totalSys - totalIdle) * 100 / totalSys)
}

如果我能找到RAM /网络统计数据,我应该设置。