Windows ゲーミングPCのリソース監視 ~ Prometheus + Grafana でのモニタリング環境を構築 ~

夏休みもそろそろ終わりですね。
イカしたエンジニアを目指してる駆け出しエンジニアのイカちゃんです。

初記事はプログラミングについてでも、Linuxについてでもなく、WindowsゲーミングPCのモニタリングについてです。

PCでゲームを行っていると、最近なんだかPCが調子悪い、ゲームが重たくなったと感じることがあります。
それって、CPU、GPUの性能不足?それともその他に問題があるの?
こういう問題の特定するのって難しいですよね。

自作erのように複数台あり、パーツごとに交換して問題を見つけることができるならいいのですが・・・

そういった逸般の誤家庭のように複数台もPCないのが一般的かと思います。

そこで、prometheusとgrafanaを入れて日々のリソースをロギングし、
PCのモニタリング環境を構築していきたいと思います。
モニタリング環境があれば、何か調子が悪い時の調査が少しは行いやすくなるかと思います。

0. 事前準備 wslの有効化 & docker install

prometheusとgrafanaはdockerで動かしていきますので、dockerを入れてない方は先にdocker for windowsを入れておいてください。 docker for windows導入にはwslの有効化が必要なため、先にwslの有効化を行います。

  1. wslの有効化 learn.microsoft.com

microsoft公式の導入手順通りにwslを有効化します

  1. docker install docs.docker.jp

docker documentを参考にdockerをinstallします。

1. 導入するアプリケーション一覧

  • exporter ( windows pcのリソース情報の取得 )
  • prometheus ( exporterからリソース情報を取得 )
  • grafana ( prometheusが集めたリソース情報のビジュアル化 )

これら3つを導入し、導入したアプリがPCの起動時に自動起動するように設定を行っていきます。

自動起動の方法として、exporterはwindows serviceに登録 prometheus, grafanaはdockerで構築し、restart=alwaysでコンテナを自動起動させるようにします。

2. exporterの導入

windowsのリソース取得として使えるexporterは、

の2種類がメジャーなのかと思いますが、今回はOhmGraphiteだけを入れていきます。

OhmGraphiteは、マザボ,cpu,gpuの温度やファンの回転数なども取ってくれるので自宅PCのリソース監視としてはかなり使い勝手がよいと思います。 windows_exporterはvmのリソース監視と同じような感じになるので温度などは取得されていないようです。

必要に応じて使い分けてください。必要なら両方入れてもいいかと思います。

OhmGraphiteの導入

  • OhmGraphiteをダウンロード
    OhmGraphite GitHub から zipファイルを落としてきて、適当なところに展開をしてください。
  • prometheus用にconfig修正
    OhmGraphiteのreadmeのprometheus configurationを参考に、解答したzipの中にあるOhmGraphite.exe.configを編集します。 編集後のconfigは下記のような感じになるかと思います。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="type" value="prometheus" />
    <add key="host" value="localhost" />
    <add key="port" value="4445" />
    <add key="interval" value="5" />
  </appSettings>
</configuration>
  • 動作確認
$ curl http://localhost:4445/metrics

でデータが取得できるか確認する

service への登録は、SCコマンドを使用して登録します。 ターミナルを管理者権限で実行します。

$ C:\Windows\System32\sc.exe create ohmgraphite binPath= "E:\exporter\ohmgraphite\OhmGraphite.exe" start= auto

system32へのpathは通ってたのですが、scコマンドが エラー: 認識されないコマンドです となってしまったのでフルパスで sc.exe を実行しています。 OhmGraphite.exe のpathは展開している場所を指定してください。私の環境では余っていたEドライブに全部配置しています。

  • serviceの登録確認

windowsツールの中にある 「サービス」を開いて、ohmgraphiteが登録されているか確認を行います。 参考画像のように登録されていればOKです。

prometheusとgrafanaの導入

prometheus configの準備

prometheus config yamlのテンプレートとして、GitHubからconfigを落とすことにします。 prometheus default config から、windows-amd64.zip のものをダウンロードしその中にある prometheus.yaml に下記を追記し、任意の場所に配置します。

scrape_configs:
  - job_name: "ohmgraphite"
    static_configs:
      - targets: ["host.docker.internal:4445"]

targetのhostは、dockerコンテナからホストマシンへのアクセスになるので、localhost ではなく、host.docker.internal になります。

docker-compose.yamlの準備

prometheus, grafanaをまとめて管理するためにdocker composeを使用します。 versionはlatestで最新版を使用するようにしていますが、version固定したい場合はversion指定を行って下さい。 prometheusのコンテナが消えた時に、過去のメトリクスも消えてしまわないようにprometheusのデータディレクトリのホストとマウントさせています。 これで、コンテナを作り直した場合にもメトリクスは残っている状態を保つことができます。

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/data:/prometheus
    command: >
      "--config.file=/etc/prometheus/prometheus.yml"
      "--storage.tsdb.retention.time=90d"
    ports:
      - 9090:9090
    restart: always
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    restart: always

docker の起動

prometheus.yaml, docker-compose.yamlの準備ができたら、docker-compose.yamlを配置しているディレクトリで docker-composeを起動させます。 ※ terminal wslから /mnt/${drive}/${docker-compose のpath} で実行

$ docker-compose up -d

初回はimageのダウンロードなどで多少時間がかかる場合があります。 起動が完了したら、コンテナが起動しているか確認を行います。

> docker-compose ps
   Name                 Command               State           Ports
----------------------------------------------------------------------------
grafana      /run.sh                          Up      0.0.0.0:3000->3000/tcp
prometheus   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp

prometheusの動作確認

ブラウザで、prometheus http://localhost:9090 を開き Status > Targetsを開きます。

target に、ohmgraphite のstateがupになっていれば、promethuesの設定は成功です。

endopointが表示されていない場合は、prometheus.yamlが間違っているか、dockerコンテナにconfigを配置できていないかだと思います。 endpointが表示されていて、stateがdownになっている場合は、prometheusからexpoterへのアクセスができていない状態になるので、こちらの場合は。prometheusのconfigが間違っているか、exporterが動いていないのどちらかかと思ういますので、設定を見直してください。

補足

prometheusのデータ保持期間はデフォルト15日と短いので prometheus起動時引数で期間を変更しています。 compose.yamlのcommandで渡している

--storage.tsdb.retention.time=90d

で保持期間を変更しています。 ここはストレージ容量と相談しつつ好きに変更してください。

grafanaの設定

promtheusまで動けばあとはGUIでポチポチ設定するだけで完了です。 ブラウザでgrafanaを http://localhost:3000 を開きます。 初回ログイン時は id/password は admin/admin になります。

Data Sourceの設定

ログイン後 Configuration > Data source AddData source から prometheusを選択します

docker コンテナの grafana -> prometheusになるので、 HTTP URLが、http://prometheus:9090 になります。 ※ コンテナ名などでホストは変わるので適時読み替えてください。

他の設定はデフォルトのままでも動きます。

設定後、Save & Test を押して、 Data source is working が表示されたらOKです。

Dashbordの設定

Dashbordには、Ohm Windows Desktop を設定します。 Dashbords > Import

Import via grafana.com に、 11587 を入力し Load します。 ダッシュボードの名前はお好きなものに、 Data sorusは先ほど設定したprometheusを選択します。 選択後 import を実行します。

import後リソースが表示されていれば成功です。 No Dataなど表示されない場合はどこか設定を間違っているか起動していないものがいるので見直しをおこなってください。

上手く設定できていれば、画像のように現在のリソース状況が表示されています。

PC再起動後

再起動後も自動で、exporter, docker, prometheus, grafanaが動いているはずですが、何かしらが動かないなどある場合は自動起動の設定がうまくいっていないので設定の見直しを行ってください。

モニタを一つ追加して、常にgrafana表示させてモニタリングしている気分を味わえます。 注意としては、データ保持期間次第ではストレージを圧迫しますので、いい感じに調整してください。 メトリクス取得しご計画的にPCのアップグレード計画を立てましょう!

ではでは、みなさんも良きゲーミングライフを