4

デーモンとして実行されるクロスプラットフォームの Go アプリケーションを作成しています。基本的に、ファイルシステムの変更をリッスンし、サーバーとの間で変更をコピー/ダウンロードします。アイデアは、マシンがアイドル状態になるまでタスクをキューに入れ、マシンの速度を決して低下させるべきではないということです。

これを行うには、CPU、RAM、およびネットワークの使用状況を監視したいのですが、ネットワークの使用状況 (可能であれば) を監視します。現在、Windows 7 以降、Mac OS 10 以降、および Linux 3 以降をターゲットにしています。

私は主に Linux プログラマーであるため、Windows/BSD API には詳しくありませんが、BSD に関するいくつかの有益な情報を既に見つけているので、理解できると思います。Windows システムコールを追跡するのに問題があります (Windows のマニュアル ページを取得する方法がわかりません...)。これらのリソースを見つけることができました(Windows用):

C++ API をシェル化/ラップする代わりに、syscall を使用することをお勧めします。もちろん、すでにこれを行っている他の Go ライブラリにも興味があります。

最終的に、私は次のようなものを探しています: http://nodejs.org/api/os.html

システムコールとその使用例を探しています。

間違った方向に向かっている場合は、お知らせください。私はシステム情報を得るためにカーネルをポーリングするという考えに固執していませんが、それがその情報を取得する最も信頼できる方法のように思えました。権限のないユーザーとしてアプリケーションを実行したいと思います。

4

1 に答える 1

4

https://github.com/AllenDang/w32を見つけました。これは、多くのWindowsAPI呼び出しのラッパーを提供するプロジェクトです。フォークに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 に答える