Bug #15179
closedSegfault caused by only 'loop{ x<<[] }'
Description
Segmentation fault is caused after many objects allocation instead of '強制終了'.
About 30sec and 16-26GB memory used.
環境¶
OS: Ubuntu 18.04LTS ja (日本語Remix) on VMware ESXi 6.7
RAM: 32GB
apt install ruby-dev
user@ruby:~$ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu] user@ruby:~$ uname -a Linux ruby 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux user@ruby: free -g total used free shared buff/cache available Mem: 31 1 28 0 1 29 Swap: 1 0 1
コード¶
x=[] loop { x << [] }
or
ruby -e
x=[]; loop { x << [] }'`
その他¶
Ubuntu18.04LTSのみで観測しています.
rubyのプロセスが16GB~26GB程度に達したときに発生しました.
(環境毎に一定かもしれませんが,十分確認できていません.)
ディスクに書きにいってしまうと非常に遅くなるので確認していません.
32GBメモリ搭載環境での結果です.
(メモリ量の異なる:Ubuntu16.04LTS, Windows10 では「強制終了」と出力されて終了します.)
下記貼り付けは,ほぼ,OSのみインストール直後にrubyのみをインストールさせた状態で試しています.
(ruby -e; free -g; ruby -e と,2回 core dumpを発生させています)
OS側の問題であるかもしれないのですが,切り分けは出来ていません.
多数オブジェクトを割り当てると,型によらず発生する様子です.
一度errorを発生させた後は,rebootするまでの間,より少ないメモリ割当(オブジェクト数)で同様のSegmentation faultを発生させる場合があります.(しない場合もあります)
他のコマンドの実行ができなくなる場合がありました.
例:initコマンドが即座にSegmentation faultしてしまう.(->ハードウェアリセットで再起動させて回復)
Files
Updated by yugui (Yuki Sonoda) about 6 years ago
- Status changed from Open to Feedback
Linuxのオーバーコミットが怪しいと思うんですが、vm.overcommit_memory
を無効に設定しても同じ現象が発生しますか?
Updated by aki.k (亜樹 小林) about 6 years ago
ありがとうございます.
$ cat /proc/sys/vm/overcommit_memory
0
$ sudo sh -c "echo 2 > /proc/sys/vm/overcommit_memory"
$ cat /proc/sys/vm/overcommit_memory
2
$ ruby -e 'x=[]; loop { x<<[] }'
[FATAL] failed to allocate memory
ご指摘の通りのようでした.
overcommit_ratio が50なので,15GB前後で上記の様にメモリ確保に失敗する様子です.
(overcommit_ratioを増やしても17GB程度までしか使えず,当初のとおり,おそらくOOM killerが発動されました.)
勉強不足でメモリのovercommitやOOM killerについて知りませんでした.
よい勉強になりました.
ここからはruby外にも思えますが,
- rubyで物理メモリいっぱいまで使うための設定/書き方.
は,わからないこととして残りました.
overcommit_memory=2, overcommit_ratio=90 などでは,うまくいかないようです.
その他:
- 他環境(Ubuntu16.04LTSなど)でのovercommit_memoryの設定値調査.
については,ここまでで追加の情報はありません.
Updated by aki.k (亜樹 小林) about 6 years ago
補足¶
overcommitを無効とした場合でも,ubuntu 18.04LTSの場合でのみsegfaultが発生する事象はまだ残りました.ただし,ここで示したコードだけで再現できる事象ではなく,適当な検証コードを用意は出来ていません.大量のオブジェクトを割り当てた場合である点は同じですが,異なる原因であるかもしれません.
OS側に原因を求めるべきであるようにも思いますが,記録のため書き残しておきます.
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Status changed from Feedback to Closed