既成の Linux イメージを実行する Windows Azure 仮想マシンのスワップ領域 - パート 1
このポストは、7 月 29 日に投稿された SWAP space in Windows Azure Virtual Machines running pre-built Linux Images – Part 1 の翻訳です。
この記事は、Azure CAT チームの Piyush Ranjan (MSFT) が執筆したものです。
近年、Windows Azure のインフラストラクチャ サービス (仮想マシンおよび仮想ネットワーク) の一般的な普及に伴い、クラウドの経済性、規模、速さという利点を得るために、より多くの企業のワークロードがパブリック クラウドに移行してきています。私は最近そのような企業のワークロード、つまりクラウド内のビッグ データ関連のプロジェクトにかかわっていました。ここではこれらに関連するいくつかのヒントとベスト プラクティスを皆さんにお伝えしたいと思います。
このプロジェクトでは、既成の Linux イメージを使用して、Windows Azure に複数ノードの Hadoop クラスターをデプロイする必要がありました。私は Windows Azure イメージ ギャラリーから入手した CentOS 6.3 イメージを使用して中規模な仮想マシン (VM) を準備し、単一ノードのコア Hadoop をデプロイしました。デプロイ自体は成功しましたが、テスト開始時にやや重いワークロードがかかっており、VM が頻繁にフリーズしたり応答を返さないという現象がみられました。
CPU コア 2 基とメモリ 3.5 GB しかない、中規模の VM のリソースが問題であることは容易に推測できました。しかし、VM 全体が応答を返さなかったり接続が途切れたりすることは予想外でした。この問題について友人や同僚と話し合ったところ、VM にはまったくスワップ (Windows ではページ ファイルと呼ばれる) が構成されていないことが判明しました。つまり、仮想メモリ システムはメモリ負担が増大したときに、ディスクにスワップすることができなかったのです。
システムによるメモリ制御状況を調べるには、Linux シェル プロンプトから "free" コマンドを実行します。特に、"cat /proc/swaps" を使用すると、スワップ領域の状態について、構成されているサイズと使用中のサイズを確認できます。下のスクリーンショットをご覧ください。
スワップ領域がまったく構成されていない場合 (Windows Azure 仮想マシンに用意された Linux VM のデフォルト状態)、"cat /proc/swaps" は何も返しません。同様に、"free" コマンドもスワップでの動作状況を何も表示しません。
興味深いのは、Linux ライブラリ イメージ (Windows Azure イメージ ギャラリーから入手するなど) を使用する VM プロビジョニングはなぜ自動的にスワップ領域を構成しないのか、ということです。ユーザーがスワップの大きさと場所を決め、プロビジョニング後にその設定を行うべきであると思われます。しかし、あるユーザーがスワップを構成せずに VM の使用を続け、やがてプロセスがクラッシュし始めたり VM がフリーズしたりすることは十分にあり得ます。
そうは言っても、必要なのはスワップ領域を確保することであると気付いた後、簡単な手順に従ってファイル ベースのスワップをリソース ディスクに構成しました。その結果、Windows Azure の中規模の仮想マシンには 135 GB のリソース ディスクが "/mnt/resource" としてマウントされました。ファイル ベースのスワップ領域を VM 上に構成する手順を以下に示します。
- "fallocate" コマンドを使用して、適切なサイズ (たとえば 5 GB) のスワップ ファイルをリソース ディスクに割り当てます。構文は "fallocate -l 5g /mnt/resource/swap5g" であり、"swap5g" はファイルの名前です。
- "chmod" コマンドを使用してファイルのパーミッションを変更し、root ユーザーのみがスワップ ファイルの読み取り/書き込み権限を持つようにします。構文は "chmod 600 /mnt/resource/swap5g" です。
- "mkswap" コマンドを使用して、ファイルをスワップ領域として設定します。構文は "mkswap /mnt/resource/swap5g" です。
- "swapon" コマンドを使用して、スワップ ファイルを使用可能にします。構文は "swapon /mnt/resource/swap5g" です。
- これでスワップが使用可能になり、"cat /proc/swaps" コマンドによりそれが確認できるはずです。エントリを "/etc/fstab" ファイルに追加して、VM を Azure でリサイクルする場合にもスワップの設定が維持されるようにします。構文は echo “/mnt/resource/swap5g none swap sw 0 0” >> /etc/fstab です。
上記のコマンドを私の VM で実行したときの画面コピーを以下に示します。
謝辞: スワップの問題のトラブルシューティングと解決を支援してくれた同僚の Amit Srivastava に感謝します。