10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

メモリが足りないのでSwapファイルを作ってライブラリをインストールする

Last updated at Posted at 2019-11-02

メモリが足りない...

検証用にAWSでLinuxインスタンス(t2.micro, memory=1GB)上で、PHPのライブラリをインストールしようとしたら...

composer require predis/predis

えっ、メモリが足りない...。いわゆるOOM(Out of memory)エラーです。

出力.
 Using version ^1.1 for predis/predis
 ./composer.json has been updated
 Loading composer repositories with package information
 Updating dependencies (including require-dev)
 
 mmap() failed: [12] Cannot allocate memory
 
 mmap() failed: [12] Cannot allocate memory
 
 mmap() failed: [12] Cannot allocate memory
 PHP Fatal error:  Out of memory (allocated 680185856) (tried to allocate 14952775 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 451
 
 Fatal error: Out of memory (allocated 680185856) (tried to allocate 14952775 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 451

インスタンスのサイズを大きくすれば解決するのだろうが、面倒やコストもかかる場合もある。

追記 (2021/03/01)

以下を試す前に、例えば composer であれば、設定ファイルを見直して、物理的にメモリが足りていないのではなく、設定として memory_limit などのパラメータで制限されていないか確認してください。

Swapファイル、ddコマンドとは

Swap ファイルとは

スワップファイル (swap file)とは、使っていないメモリの内容を一時的にしまっておくためのファイルです。(参考3)

メモリの現状確認

-mはメガバイト単位で出力します。以下では、メモリは1G弱で、Swap領域は0であることがわかります。

$ free -m

              total        used        free      shared  buff/cache   available
Mem:            985         233          70           0         682         593
Swap:             0           0           0

ddコマンドとは

ddコマンドは、Unix系OSで使える。主な目的はファイルをコピーしたり変換したりすること。例えば、「インストールメディア(CD-ROMなど)を、ISOイメージファイルとして保存する」ために使ったりするらしい(昔の情報)。

例えば以下であれば、全てNULL文字で埋まった100バイトの「file1」というファイルを作成する。

$ dd bs=100 count=1 if=/dev/zero of=file1

オプション

bs=BYTES: ブロックサイズ。ファイル内において、一度に読み書きできるバイト数
count=N: コピーする入力ブロックの数
if=FILE: 入力ファイル、/dev/zeroはNULL文字が入っている
of=FILE: 出力ファイル

詳細は, manページを確認ください。

実際に空のSwapファイルを作ってみる

1M x 1024 = 1024MiB のファイルを作る

$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 14.2801 秒、 75.2 MB/秒

Swapファイルとして初期化する

$ sudo /sbin/mkswap /var/swap.1

mkswap: /var/swap.1: パーミッション 0644 は安全な値ではありません。 0600 をお勧めします。
スワップ空間バージョン 1 を設定します。サイズ = 1024 MiB (1073737728 バイト)
ラベルはありません, UUID=6b6561f4-6a4d-4384-900c-8d5747ca144a

ひとまず警告は無視。

Swapファイルを有効化する

$ sudo /sbin/swapon /var/swap.1

swapon: /var/swap.1: パーミッション 0644 は安全な値ではありません。 0600 をお勧めします。

メモリの確認

$ free -m
               total        used        free      shared  buff/cache   available
 Mem:            985         192         700           0          92         667
 Swap:          1023          43         980

おっ、Swap領域が増えてる。この後、composer require が成功して無事にライブラリをインストールでき、少し感動しました。

翌日、再度メモリを確認してみるとSwapの部分は0バイトになっていたので、これは一時的なSwap領域だと思います。永続的にSwapファイルを作成する方法もあるかと思うので、気になる方は調べてみてください。

参考

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?