こんにちは。よっしーです(^^)
今日は、k6を利用した大規模なテスト実行におけるOSの設定についてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6を利用した負荷テストについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
リミット設定の変更
設定の変更前に考慮すべき最初のことは、テストが必要とするネットワーク接続の量です。 k6の結果サマリーのhttp_reqsメトリクスはこれを示唆できますが、最大VU数 * 単一のVUイテレーションでのHTTPリクエスト数の基本的な計算は公平な近似値を提供します。 k6はテキストファイルや他のリソースも扱うため、これらは「オープンファイル」クォータに含まれますが、ネットワーク接続が最も多くのリソースを消費します。
macOSで制限を無効にする
macOSでシステムに課せられた制限を変更する前に、これを防ぐために導入されたセキュリティ機能を無効にする必要があります。これを行うには、OS X El Capitanで導入されたSystem Integrity Protection(システム完全性保護)を無効にする必要があります。これにより、適切な特権を持たないプロセスからシステムが所有する特定のファイルやディレクトリが変更されるのを防ぎます。
これを無効にするには、Macを再起動し、起動時にCommand + Rキーを押し続けます。これにより、リカバリモードで起動します。
そこで、画面の上部にあるメニューバーにある「ユーティリティ」に移動し、ターミナルを開きます。ターミナルを開いたら、次のコマンドを入力します:
csrutil disable
Enterキーを押してターミナルを閉じたら、Macを通常通り再起動し、アカウントにログインできます。
ソフトリミットの変更
Linux
たとえば、1000のVUテストを実行し、1イテレーションあたり4つのHTTPリクエストを行いたいとします。この場合、追加のネットワーク以外のファイル使用を考慮に入れて、オープンファイルの制限を5000に増やすことができます。これは次のコマンドで行えます:
ulimit -n 5000
これは現在のシェルセッションのみで制限を変更します。
この変更を将来のセッションに永続化したい場合、シェルの起動ファイルにこれを追加できます。Bashの場合、次のようにします:
echo "ulimit -n 5000" >> ~/.bashrc
macOS
ソフトリミットが低すぎる場合、現在のセッションを次のように設定します(ここに書かれた値は通常、デフォルト値に近いものです):
sudo launchctl limit maxfiles 65536 200000
sudoが必要なため、パスワードが求められます。
ハードリミットの変更
Linux
上記のコマンドが「cannot modify limit: Operation not permitted」または「value exceeds hard limit」というエラーを返す場合、それはハードリミットが低すぎることを意味し、前述のようにルートユーザーのみが変更できることを意味します。
これは、/etc/security/limits.confファイルを変更することで行うことができます。
たとえば、aliceアカウントのプロセスごとのオープンファイルの量のソフトリミットとハードリミットを設定するには、お好きなテキストエディタでルートとして/etc/security/limits.confを開き、次の行を追加します:
alice soft nofile 5000
alice hard nofile 1048576
新しい制限はログアウトして再ログインした後に適用されます。
または、* hard nofile 1048576
は、すべての非ルートユーザーアカウントに設定を適用し、root hard nofile 1048576
はルートユーザーに適用されます。このファイルのドキュメンテーションや man bash
コマンドのドキュメンテーションを参照して、ulimit
コマンドの詳細を確認できます。
macOS
次に、新しいファイル制限を設定します。ターミナルを開き、次のコマンドを貼り付けます:
sudo nano /Library/LaunchDaemons/limit.maxfiles.plist
これにより、ターミナルウィンドウ内でテキストエディタが開き、ユーザーパスワードを入力するように求められ、その後に次の内容を貼り付けます:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Control + Xを押すと、変更が保存され、エディタが終了します。これを貼り付けて保存することで、maxfiles制限に2つの異なる制限を導入しました。最初の制限(64000)はソフトリミットで、これに達するとMacは新しいファイルを開くのを停止する準備をするが、まだファイルを開くことを許可します。2番目の制限(524288)はハードリミットで、再び「ファイルが多すぎる」というエラーメッセージが表示されるでしょう。
次に、プロセスの制限を増やすために同じ手順を使用します。
ターミナルで次のコマンドを使用して、同様のファイルを作成します:
sudo nano /Library/LaunchDaemons/limit.maxproc.plist
これで、Macを再起動してRecoveryモードに戻り、ターミナルを開き、csrutil enableコマンドを使用してSIPを再度有効にし、最初に使用したコマンドで制限が変更されたかどうかを確認するだけです。
ほとんどの場合、これらの制限は、一時的に多くの単純なテストをローカルで実行するのに十分であるはずです。ただし、テストで必要な値にこれらのファイルを変更できます。
警告
これらの制限は、メモリリークのように大量のメモリをリークする可能性がある、不適切に書かれたファイルやアプリケーションからオペレーティングシステムを保護するために設定されています。値を過度に設定しないことをお勧めし、RAMが不足した場合、システムが非常に遅くなる可能性があることに注意してください。
おわりに
今日は、k6を利用した大規模なテスト実行におけるOSの設定についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント