gem updateの途中でメモリ不足によりアップデートを継続出来ないことがあったので、Ubuntuにメモリスワップを追加することにしました。Azure上のUbuntuは標準設定では仮想メモリを使用しないので、仮想マシンのサイズをA0とか小さいサイズにしていると、容易にメモリ不足に陥ります。
Microsoft Azure上のLinux仮想マシンにスワップファイルを追加するには/etc/waagent.confの次の3ヶ所をを変更します。
# Format if unformatted. If 'n', resource disk will not be mounted. ResourceDisk.Format=y # Create and use swapfile on resource disk. ResourceDisk.EnableSwap=y # Size of the swapfile. ResourceDisk.SwapSizeMB=2048
この後、仮想マシンを再起動すると自動的にスワップ領域が確保されて、仮想メモリが有効になります。sudo swapon -sとかfreeコマンドを叩いて確認してください。
ちなみにResourceDisk.SwapSizeMBは無暗に大きくしないでください。私は最初に4096MBを指定して再起動したのですが、エラーになってしまいスワップ領域が作られませんでした。
waagentは/var/log/waagent.logにログを出力しているので見てみます。
$ more /var/log/waagent.log 2015/06/06 07:39:11 Finished processing ExtensionsConfig.xml 2015/06/06 07:55:02 ERROR:CalledProcessError. Error Code is 1 2015/06/06 07:55:02 ERROR:CalledProcessError. Command string was mkswap /mnt/swapfile 2015/06/06 07:55:02 ERROR:CalledProcessError. Command result was mkswap: error: /mnt/swapfile is mounted; will not make swapspace 2015/06/06 07:55:03 ERROR:CalledProcessError. Error Code is 255 2015/06/06 07:55:03 ERROR:CalledProcessError. Command string was swapon /mnt/swapfile 2015/06/06 07:55:03 ERROR:CalledProcessError. Command result was swapon: /mnt/swapfile: swapon failed: Device or resource busy 2015/06/06 07:55:03 ERROR:ActivateResourceDisk: Failed to activate swap at /mnt/swapfile
mkswapコマンドで失敗したために、以降の処理が全部エラーになってしまったようです。仕方ないので手動でマウント操作を実施します。
sudo chmod 600 /mnt/swapfile sudo mkswap /mnt/swapfile sudo swapon /mnt/swapfile
以上の操作で仮想メモリが有効になります。試しに次のコマンドを実行してみます。
$swapon -s Filename Type Size Used Priority /mnt/swapfile file 3000208 2068 -1 $ free total used free shared buffers cached Mem: 684468 552240 132228 3412 24496 243612 -/+ buffers/cache: 284132 400336 Swap: 3000208 2004 2998204
・・・が、swapsizeが約3GBほどになっています。もしかして・・・というわけで、ResourceDisk.SwapSizeMBを2048に変更して再起動すると、今度は正常にスワップファイルが作られました。