TD;TL
swap領域を1G作って応急処置する。恒常的にに必要だったらインスタンスタイプを大きいやつに変更しましょう。
# rootユーザで実行
dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# fstabにマウント設定
# /etc/fstab
# 最終行の/swapfileを追加
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
swap /swapfile swap defaults 0 0
webpackでbuildするとよく起きるOutOfMemory
こんなエラーメッセージ
FATAL ERROR: NewSpace::Rebalance Allocation failed - process out of memory
1: node::Abort() [node]
2: 0x8c20ec [node]
3: v8::Utils::ReportOOMFailure(char const*, bool) [node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
5: 0xa2f43b [node]
6: v8::internal::MarkCompactCollector::Evacuate() [node]
7: v8::internal::MarkCompactCollector::CollectGarbage() [node]
8: v8::internal::Heap::MarkCompact() [node]
9: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
11: v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]
12: v8::internal::Runtime_AllocateInTargetSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]
13: 0x3ddef2e042fd
<--- Last few GCs --->
[3983:0x2927bb0] 41693 ms: Scavenge 304.4 (341.2) -> 298.1 (344.2) MB, 19.8 / 0.1 ms allocation failure
[3983:0x2927bb0] 41793 ms: Scavenge 307.0 (344.2) -> 300.2 (351.2) MB, 31.6 / 3.5 ms allocation failure
[3983:0x2927bb0] 47249 ms: Scavenge 314.8 (351.7) -> 308.3 (355.2) MB, 446.6 / 135.2 ms allocation failure
[3983:0x2927bb0] 49411 ms: Scavenge 317.2 (355.2) -> 310.2 (361.7) MB, 1854.6 / 691.0 ms allocation failure
AWSのt2.smallだと上限2GでSwap領域0なので、コードが増えてくるとcapistrano deploy時に急に出てきて対応に困っちゃいますよね。
AmazonLinuxでのSwap領域の作り方
# rootユーザで実行
dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
EBSだとI/O課金なので頻繁にSwapする場合はddで生成するのはオススメされないそうですが、今回は応急手当なので手早く作っちゃいます。
freeでswap領域ができてるか確認
-bash-4.2$ free
total used free shared buffers cached
Mem: 2052332 1638064 414268 0 112144 541484
-/+ buffers/cache: 984436 1067896
Swap: 1048572 0 1047708
Swap領域を無効化する
使わなくなったらswapoffでかんたんに無効化できます
swapoff /swapfile
# swapon -sして何も表示されなければ無効化できています