Project

General

Profile

Bug #15179

Segfault caused by only 'loop{ x<<[] }'

Added by aki.k (亜樹 小林) 10 months ago. Updated 10 months ago.

Status:
Feedback
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
[ruby-dev:50644]

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 -ex=[]; 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

log.txt (26.1 KB) log.txt execution result log aki.k (亜樹 小林), 09/30/2018 09:21 AM

History

Updated by yugui (Yuki Sonoda) 10 months ago

  • Status changed from Open to Feedback

Linuxのオーバーコミットが怪しいと思うんですが、vm.overcommit_memory を無効に設定しても同じ現象が発生しますか?

Updated by aki.k (亜樹 小林) 10 months 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 (亜樹 小林) 10 months ago

補足

overcommitを無効とした場合でも,ubuntu 18.04LTSの場合でのみsegfaultが発生する事象はまだ残りました.ただし,ここで示したコードだけで再現できる事象ではなく,適当な検証コードを用意は出来ていません.大量のオブジェクトを割り当てた場合である点は同じですが,異なる原因であるかもしれません.
OS側に原因を求めるべきであるようにも思いますが,記録のため書き残しておきます.

Also available in: Atom PDF