症状

rxjsを試そうと思ってインストールしようとしたら、下記のエラーが出た。

$ npm install rx
...
FATAL ERROR: Zone Allocation failed - process out of memory
...
Aborted

状況確認

free

メモリの使用状況を調べてみた。下記のページを参考にさせていただいた。

http://sisidovski.hatenablog.com/entry/2015/07/07/072150

$ free -tm
             total       used       free     shared    buffers     cached
Mem:           993        930         63          0          2         38
-/+ buffers/cache:        890        103
Swap:            0          0          0
Total:         993        930         63

あと63MBしか空いてない…。

しばしばこのブログに接続できなくなるのも、メモリ不足が原因かも。

このブログが動いているインスタンスと同じインスタンスでいろいろ試してるのがダメダメなんだけども…。

top

topの使い方は下記を参考にさせていただいた。

http://qiita.com/k0kubun/items/7368c323d90f24a00c2f

$ top -a

top - 10:27:33 up  4:09,  1 user,  load average: 0.00, 0.01, 0.00
Tasks:  90 total,   1 running,  89 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1017372k total,   944332k used,    73040k free,      808k buffers
Swap:        0k total,        0k used,        0k free,    19364k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2827 mysql     20   0 1297m 444m    0 S  0.0 44.8   0:05.63 mysqld
11720 apache    20   0  524m  44m  400 S  0.0  4.5   0:02.98 httpd
 6224 apache    20   0  524m  44m   68 S  0.0  4.5   0:03.07 httpd
 6223 apache    20   0  523m  43m   68 S  0.0  4.3   0:05.33 httpd
 8756 apache    20   0  522m  42m 1392 S  0.0  4.3   0:02.76 httpd
 6222 apache    20   0  714m  42m   68 S  0.0  4.3   0:02.84 httpd
 6220 apache    20   0  522m  41m   68 S  0.0  4.2   0:03.22 httpd
11719 apache    20   0  520m  40m  392 S  0.0  4.1   0:03.54 httpd
11714 apache    20   0  520m  40m  868 S  0.0  4.1   0:03.29 httpd
 6221 apache    20   0  516m  38m 2152 S  0.0  3.9   0:05.05 httpd
11833 apache    20   0  516m  36m  832 S  0.0  3.7   0:00.87 httpd
 8525 root      20   0  423m  16m    0 S  0.0  1.7   0:27.59 dockerd
 2899 root      20   0  396m 8384   88 S  0.0  0.8   0:00.35 httpd
11398 ec2-user  20   0  114m 4876 2244 S  0.0  0.5   0:00.04 bash
10568 root      20   0  322m 4152    0 S  0.0  0.4   0:00.16 sam
 8531 root      20   0  279m 3064    0 S  0.0  0.3   0:03.43 docker-containe
11872 ec2-user  20   0 15316 2048 1760 R  0.0  0.2   0:00.03 top

ps

$ ps aux | grep mysql
root      2613  0.0  0.0  11728   324 ?        S    06:18   0:00 /bin/sh /usr/libexec/mysql56/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     2827  0.0 44.7 1328548 455464 ?      Sl   06:18   0:06 /usr/libexec/mysql56/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql56/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
ec2-user 11944  0.0  0.2 110468  2112 pts/1    S+   10:57   0:00 grep --color=auto mysql

mysqlがけっこうメモリを食っている。

このインスタンスはt2.microなので、メモリは1GB。

44%くらい食っているので、400MBちょっとくらい。

対処方法

ググると、下記のようなページが。

http://memo-off.blogspot.jp/2013/06/mysql56.html

https://www.riscascape.net/archives/7348

http://washiiku.hatenablog.com/entry/2013/12/18/224442

table_definition_cacheの大きさを変えれば良いみたい。

$ mysql -u root -p

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.36    |
+-----------+

mysql> show variables like 'table_definition_cache';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| table_definition_cache | 1400  |
+------------------------+-------+

mysql> quit;
Bye

$ sudo vim /etc/my.cnf
[mysqld]
...
table_definition_cache=400  

$ sudo service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

$ mysql -u root -p

mysql> show variables like 'table_definition_cache';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| table_definition_cache | 400   |
+------------------------+-------+

効果

$ top -a
...
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3690 mysql     20   0  945m 104m  14m S  0.0 10.5   0:00.28 mysqld
...

だいぶマシになった気がするけど、table_definition_cacheを変えたおかげなのか、restartしたおかげなのかはよくわからないところ。。。

その他の対処方法

AMI作って、AMIからインスタンスタイプを変更したインスタンスを作り直す

t2.mediumにしたら、インスタンスの費用は4倍くらいになる。0.064 * 24 * 30 = $46.08 = 5,081円。

安いけども、勉強用として使うには避けたい出費。

https://aws.amazon.com/jp/ec2/pricing/on-demand/

DBはRDSで動かす

db.t2.microなら、0.026 * 24 * 30 = $18.72 = 2,064円

https://aws.amazon.com/jp/rds/mysql/pricing/

DBはRDSに任せるのが本当は一番いいと思うけど、DBの設定とかも自分で触ってちょいちょい勉強したいので、EC2で動かすことにする。