Windows Server で大きなサイズのダミーファイルを作成する PowerShell スクリプトをスケジュール実行しディスク負荷テストをおこなう

Windows Server で fsutill コマンドを使い 10GiB のダミーファイルを作成する PowerShell スクリプトを作ってタスクスケジューラーでスケジュール実行します。
2024.02.24

コーヒーが好きな emi です。

本記事では Windows Server でディスク負荷テストを実施するまでの検証手順を記載します。
Windows Server には fsutill という任意のサイズのファイルを作成するコマンドがあります。このコマンドをタスクスケジューラーで定期実行することで、じわじわとディスクの使用率をあげていく作戦です。

fsutil file createnew <filename> <作成するファイルの Byte 数>

事前準備

EC2 で Windows Server を構築します。構築手順は以下のブログを参照ください。今回は Windows Server 2022 を構築しました。C ドライブで負荷テストを行うと危険なので、以下ブログでは D ドライブとして新たに EBS ボリュームをアタッチしています。

Windows Server や PowerShell を日本語化する方法は以下ブログを参照ください。

今回は D ドライブで負荷テストをおこないます。最初に D ドライブの容量を確認しておきます。何もファイルを置いていないので、29.9GiB 空いています。

負荷テスト用の大きなファイルを配置するフォルダを作成しておきます。

今回は D:\work\dummyfile\ というフォルダを作りました。

コマンドを直接実行する

冒頭でも紹介しましたが、大きなサイズのファイルを作成するためのコマンドの構文はこちらです。

fsutil file createnew <filename> <作成するファイルの Byte 数>

まず始めにコマンドを PowerShell で直接実行し、コマンドの挙動を確認します。
では、5GiB のファイルを作成する以下のコマンドを実行しましょう。

fsutil file createnew D:\work\dummyfile\dummyfile_202402232027.txt 5368709120
  • filename:D:\work\dummyfile\dummyfile_202402232027.txt
  • 作成するファイルの Byte 数:5368709120(5,368,709,120Byte = 5GiB)

▼実行結果

PS C:\Users\Administrator> fsutil file createnew D:\work\dummyfile\dummyfile_202402232027.txt 5368709120
ファイル D:\work\dummyfile\dummyfile_202402232027.txt が作成されました
PS C:\Users\Administrator>

作成しておいたフォルダを確認すると、dummyfile_202402232027.txt という名前の、サイズ 5,242,880 KiB(= 5GiB)のファイルができています。

D ドライブも 5GiB 使用済みになりました。

PowerShell スクリプトを作成して実行する

次は、PowerShell スクリプトを作成してスクリプトを実行することでファイルを作成します。
使用するスクリプトは以下です。

CreateDummyFile.ps1

# 現在の日時を取得し、年月日時分秒の形式でフォーマット
$timestamp = Get-Date -Format "yyyyMMddHHmmss"

# ダミーファイルのパスとファイル名を設定(作成時間を含む)
$filePath = "D:\work\dummyfile\dummyfile_created_by_CreateDummyFile_$timestamp.txt"

# ファイルサイズを Byte 単位で設定
# 1GiB = 1,073,741,824 Byte
# 5GiB = 5,368,709,120 Byte
$fileSize = 5368709120

# fsutil コマンドを使用してダミーファイルを作成
fsutil file createnew $filePath $fileSize

作成するファイル名にタイムスタンプを含むようにしました。

このファイルを、D:\work\ に配置します。D:\work\ フォルダ内に新規テキストファイルを作成し、スクリプトをコピーして、ファイル名は「CreateDummyFile.ps1」として保存しました。 ブラウザでクリップボードのアクセスを許可しておけば、スクリプトを Windows Server 上にペーストできます。

ブラウザでクリップボードのアクセスを許可する方法は [アップデート] WindowsインスタンスにAWS Systems Manager Fleet ManagerからRDP接続できるようになりました | DevelopersIO - Fleet ManagerからRDP接続 を参照ください。

D:\work\ で Shift を押したまま右クリックすると「PowerShell ウィンドウをここで開く」というメニューが出てくるので、クリックします。

PowerShell ウィンドウを開けたら、以下のコマンドを実行し ps1 ファイルを実行します。

.\CreateDummyFile.ps1

▼実行結果

PS D:\work> .\CreateDummyFile.ps1
ファイル D:\work\dummyfile\dummyfile_created_by_CreateDummyFile_20240223203943.txt が作成されました
PS D:\work>

作成しておいたフォルダを確認すると、dummyfile_created_by_CreateDummyFile_20240223203943.txt という名前の、サイズ 5,242,880 KiB(= 5GiB)のファイルができています。

D ドライブの容量も更に 5GiB 増え、約 10GiB を占有しています。

タスクスケジューラーで定期実行する

定期実行をスケジュールするため、タスクスケジューラーの設定をおこないます。[スタート] - [Windows 管理ツール] - [タスクスケジューラー] をクリックします。

「タスクスケジューラーライブラリ」をクリックし、空白の領域で右クリックして「新しいタスクの作成」をクリックします。

「全般」タブ

タスクの名前、説明、セキュリティオプションを設定します。
今回は検証なので、ログインしている Administrator ユーザーを実行ユーザーとし、ユーザーがログインしているときのみ実行とします。構成は「Windows Server 2022」としました。

「トリガー」タブ

タスクのトリガーを設定します。「新規」をクリックします。

実行タイミングを設定します。今回は以下のように設定しました。

  • タスクの開始:スケジュールに従う
    • 1回
    • 開始:2024/02/23 20:30:00
      • 今回は手動で実行開始したいので、現在の時刻より前の時刻を開始時間にしました。
  • 繰り返し間隔:5 分間
  • 継続時間:無制限※非推奨
    • 継続時間を無制限にすると 5 分置きにスクリプトが実行され続けますので注意してください。 後述します。
  • 停止するまでの時間:30分
    • 繰り返しの停止ではなく、実行する操作に時間がかかるような場合に 30 分で停止する、というもののようです。私が認識誤っており、今回は意味のない設定となってしまいました。後述します。
  • 有効

最後に「OK」をクリックします。

トリガーが設定されました。

「操作」タブ

トリガーで実行する操作を設定します。「新規」をクリックします。

今回は以下のように設定します。

  • プログラム/スクリプト:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • 引数の追加:-ExecutionPolicy Bypass D:\work\CreateDummyFile.ps1
  • 開始:D:\work

プログラムとして PowerShell を実行するようにして、引数にスクリプト(ps1 ファイル)を設定しています。設定したら「OK」をクリックします。

スクリプトが設定できました。

「条件」タブ、「設定」タブ

今回は条件タブと設定タブで設定変更はおこなわず、デフォルトのままとします。設定出来たら、「OK」をクリックします。

タスクが設定できました。

D ドライブが 30GiB しかなく、既に 10GiB を占有しているので、一回のスクリプト実行で作成されるファイルのサイズを小さくしておきます。5GiB → 1GiB にスクリプトを変更しました。

タスクスケジューラーを手動で開始します。作成したタスクを右クリックし「実行する」をクリックします。

状態が「実行中」になりました。

右のメニューで「最新の情報に更新」をクリックすると、画面が更新されます。ファイルの作成は一瞬で終わるので、状態は「準備完了」となりました。

5 分置きにタスクが自動実行され、ダミーファイルが増えているのが確認できます。

50 分程席を外し、戻ってきたらまだタスクが実行されていました。 、

タスクを右クリックし「無効」にします。

フォルダを見ると、1GiB のファイルが 5 分置きに作成されていたのが確認できました。今回は 12 ファイルできました。

D ドライブの占有率も上がっています。10GiB 程の占有率だったのが、22GiB 程まで増えました。1GiB のファイルが 12 個できたので、計算通りです。

タスクスケジューラーのトリガーの変更

30 分でタスク実行を停止させたかったのですが、うまく設定できておらず、ずっとタスクが実行され続けてしまいました。今度は以下のように設定変更しました。

  • タスクの開始:スケジュールに従う
    • 1回
    • 開始:2024/02/23 22:31:00
  • 繰り返し間隔:5 分間
  • 継続時間:30分間
  • 有効

30 分たったらタスクの実行を止める設定です。

タスクの開始時間になり、タスクが実行され始めました。

30 分後、タスクは停止し、「次回の実行時刻」が空白になりました。良かったです。

D ドライブがいっぱいになったときの挙動

さて、ダミーファイルでドライブがいっぱいになったらどうなるでしょうか。途中までタスクスケジューラーを使っていましたが、ギリギリまで D ドライブがいっぱいになってきたところで手動で確かめます。
結果、以下のようなエラーでファイルが作成できないことがわかりました。

エラー: ディスクに十分な空き領域がありません。

fsutil コマンドで作成したダミーファイルの中身

fsutil コマンドで作成したダミーファイルの中身はどうなっているでしょうか。1GiB 以上のファイルだとサイズが大きすぎて開けないので 1024Byte で作成してメモ帳(notepad)で開いてみると、空白がたくさん含まれているようです。

Visual Studio Code では開けませんでした。

終わりに

Windows に慣れた方ならよくやる方法かと思いますが、備忘のためにも書き残しておくことにしました。どなたかのお役に立てば幸いです。

参考