フリーランスのエンジニア道

フリーランスエンジニアの不安を解消するブログ

capistranoでwebpacker:compileした時にOutOfMemoryが出た時のSwap領域での対処法

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して何も表示されなければ無効化できています