2022年2月10日木曜日

メモリ不足で gcc が kill される場合になんとかビルドする

Process completed with exit code 137.
g++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
上記のようなエラーで gcc が終了した場合、実行環境のメモリ不足が原因の場合があります。
このような場合どうしたらよいのでしょうか?

正解は「メモリを増やす」です!


・・・ですが。
そうはいかない場合もありますよね。特に筆者は CI サービスを無料の範囲で使っているので、実行環境のスペックには制限があり、増やすことが難しいです。

それでも、それでもビルドがしたい。

・・・ので無理やりがんばります。

並列数を減らす
単純な話ですが make などで並列してる場合は並列数を減らしましょう。

ガーベージコレクションの設定を調整する
--param ggc-min-heapsize

上記のコンパイラーオプションを使うことで、コンパイラーの GC (ガベージコレクション)の設定ができます。
それぞれどういう設定かの
ggc-min-expand は % 単位で、ヒープ拡張できる最小の割合。
RAM が 1GB 以上あれば 100% がデフォルト、それ以外の場合は 30% を下限に設定される。
ggc-min-heapsize は GC 開始する最小のヒープサイズ。この値が小さいと GC 頻度が上がる。デフォルトは 4MB〜128MB の間で RAM サイズや RLIMIT の数値で決定されるもよう。

ggc-min-expand/ggc-min-heapsize 両方を 0 にすると常に Full GC することになる。
これらの値を調整することで、少メモリな環境でもビルドできるようになる。
ただし、時間はめちゃくちゃかかる
片方(ggc-min-expand)0 だけでも相当時間かかってタイムアウトしてたので、無料 CI 環境では厳しい。

gcc -fanalyzer をやりたくて ggc の調整してたけど、時間かかりすぎて終わらない・・
https://github.com/srz-zumix/iutest/pull/564
もうちょいスペック高い CI を検討してみる。



2 件のコメント:

  1. 解決にならないコメントは残すな

    返信削除
  2. swap 領域を追加すると修復できると思います。スピードも早くなります。

    返信削除