« ディスクへの書き込みが多い | トップページ | Tシャツの襟のバックリ割れを修繕 »

2024年4月30日 (火)

ディスクの総書き込み量を取得

朝には雨が止み、曇り。

お昼前から、ちょこちょこと太陽が顔を出してくれ、基本曇りの、時々晴れ。

夕方に、ちょっと雨。

 

昨日の続きのようなもの。

ディスクの書き込み量を見ている時に、S.M.A.R.T.情報を取得したいと思った。

その情報の中には、ディスクの総書き込み容量もあるので。

有名なところでは、

Crystal Dew World [ja] - CrystalMark Retro

の「CrystalDiskInfo」がある。

とても重宝するのだけれど、起動時に、UACが起動して、はいを選択しないといけないし、複数のディスクがつながっていると、表示されるまでに時間が掛かる。

必要な情報は、総書き込み容量だけ。

そのためだけに、これを起動するのも面倒。

VB.NETやPyahon、PowerShellとかを使って、Windows API経由でS.M.A.R.T.情報を取得出来ないかと思って調べてみたけれど、一筋縄ではいかなさそうだった。

出来れば、自前のプログラムでやりたかったけれど、ツールを使って、それが出す情報を加工して使うのが一番簡単そう。

そこで、コマンドライン・ツールの

S.M.A.R.T. Monitoring Tools download | SourceForge.net

を使わせてもらうことにした。

「smartctl.exe」を使って、ディスクのS.M.A.R.T.情報を表示させる。

一番簡単なのは、「.\smartctl -a /dev/sda」。

スルッと色んなS.M.A.R.T.情報を表示してくれる。

これが出力する情報から、ディスクの総書き込み量を取得し、PowerShellで加工して、自分好みに表示するようにしてみた。

cd "smartctl.exeへのパス"
$json = (.\smartctl -A -j /dev/sda | ConvertFrom-JSON)
$wrRaw = $親の項目名.data_units_written
$tbwt = $wrRaw * 512 / 1024 / 1024 / 1024
$tbwg = $wrRaw * 512 / 1024 / 1024

Write-Host ""
Write-Host "【ディスクの総書き込み量】"
Write-Host ("{0:0.0000}" -f $tbwt + " TB" + " / " + $tbwg.toString("##,### GB"))
Write-Host ""
$host.UI.RawUI.ReadKey()

簡単に説明すると、まずは、「smartctl.exe」のパスを記述し、移動する。
「cd」で移動するのではなく、「Set-Location "パス"」でもいいと思う。

次に、「親の項目名」について。

PowerShellを開いて、「.\smartctl -A -j /dev/sda | ConvertFrom-JSON」を実行してほしい。

JSON形式で出力されるので、出力結果の右側から、「data_units_written」を探す。

その親が左側に書かれているので、それを「親の項目名」に置き換えよう。

これは、接続されているディスクによって違っていると思うので、こういう風に記述した。

これを、「ファイル名.ps1」として保存し、PowerShellから起動するショートカットを作って、それを実行すればいい。

そうすると、「TB」と「GB」で、ディスクの総書き込み量が表示される。

CrystalDiskInfoで表示されているディスクの総書き込み量は、「TB」の方と同じなので、確認してみてほしい。

この情報は、JSON形式で表示されているので、ほしい情報があるなら、「$親の項目名.ほしい値の項目名」という記述にしておけば、簡単に取得出来るのでとても楽。

他にほしい情報があるなら、そのように指定して、好みに加工して表示するようにすればいいだろう。

最後の「$host.UI.RawUI.ReadKey()」について。

PowerShellって、pauseが出来ないらしいので、これを最後に記述することによって、キー入力待ち状態にして、疑似的ポーズにしている。
ショートカットで呼び出した時に、PowerShellのウインドウが消えないように、これを記述している。

上記が基本的なことで、自分の場合は、これだけではなく、前日の総書き込み量との差分を表示したり、ログとして、ファイルに出力するようにしている。

このやり方であれば、管理者権限は不要だし、ショートカットキーで呼び出せば、すぐに情報が表示されるので、とてもいい。
(自分の場合は、Lauchyを使って呼び出している。)

更に、下記のようなスクリプトを追加して、より、ディスクへの書き込み状態がわかるようにしてみた。

まずは、気になるプロセスの書き込み量を見るためのもの。

$ProcessName = "firefox.exe"
$totalWriteTransferCount = 0
$Processes = Get-WmiObject -Class Win32_Process -Filter "Name = '$ProcessName'" | Sort-Object -Property WriteTransferCount -Descending

foreach ($process in $Processes) {
$totalWriteTransferCount += $process.WriteTransferCount
Write-Host $process.ProcessName.ToString().PadRight(20) "|" $process.ProcessID.ToString().PadLeft(6) "|" $process.WriteTransferCount.ToString("##,### B").PadLeft(17) -ForegroundColor green
}

if($i -eq 0){
Write-Host "No $ProcessName processes."`n`n -ForegroundColor red
} else {
# 合計値を表示
Write-Host `n
Write-Host "Total WriteTransferCount for $ProcessName processes: "$totalWriteTransferCount.ToString("##,### B")`n -ForegroundColor red
}

上記は、「firefox.exe」を見るようにしているけれど、自分の見たいプロセス名に置き換えればいい。

そして、プロセス毎による、書き込み量トップ10

$topProcesses = Get-WmiObject -Class Win32_Process |
Sort-Object -Property WriteTransferCount -Descending |
Select-Object -First 10

$sc = 1
$topProcesses | ForEach-Object {
$process = $_
$processName = $process.ProcessName
$processID = $process.ProcessID
$writeTransferCount = $process.WriteTransferCount

Write-Host "($($sc.ToString("00")))" $process.ProcessName.ToString().PadRight(15) "|" $process.ProcessID.ToString().PadLeft(6) "|" $process.WriteTransferCount.ToString("##,### B").PadLeft(17)
$sc+=1
}

これはそのまま使える。

PowerShellのウインドウを閉じたくなければ、先述の「$host.UI.RawUI.ReadKey()」を、スクリプトの最後に記述しておけばいい。

と、こういうスクリプトを作ったことにより、ディスクの総書き込み量が簡単に取得できるようになったし、今、何のプロセスがどのくらい書き込んでいるかがわかるようになったので、ディスクの書き込みをチェックするのがめちゃくちゃはかどるようになったのである。

|

« ディスクへの書き込みが多い | トップページ | Tシャツの襟のバックリ割れを修繕 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ディスクへの書き込みが多い | トップページ | Tシャツの襟のバックリ割れを修繕 »