症状
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で動かすことにする。