4

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

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

我主要是一名 Linux 程序员,所以我不熟悉 Windows/BSD API,但我已经找到了一些关于 BSD 的好信息,所以我想我可以弄清楚。我在追踪 Windows 系统调用时遇到了麻烦(我不知道获取 Windows 手册页的方法......)。我设法找到了这些资源(适用于 Windows):

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

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

我几乎在寻找系统调用和如何使用它们的示例。

如果我走错了方向,请告诉我。我不赞成轮询内核以获取系统信息的想法,但在我看来,这似乎是获取该信息的最可靠方法。我更愿意以弱势用户身份运行该应用程序。

4

1 回答 1

4

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

这使我能够获取 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/网络统计信息,我应该被设置。

于 2012-07-25T07:57:04.497 回答