web-dev-qa-db-ja.com

Ubuntu12.10でgccのメモリが不足しています

VirtualBoxで実行されているUbuntu(32ビット)でCプロジェクトをコンパイルしようとしています。問題のコードをコンパイルするには、かなりのメモリ、少なくとも3ギガが必要です。そこで、VM 2ギガ。2ギガのスワップスペースが利用可能であれば、それで十分です。何らかの理由で、gccは割り当て後にメモリ不足エラーで失敗しますが、 900メガ程度。メモリ量を2.7ギガ(VirtualBoxで許可されている最大値)に増やすことは役に立ちませんでした。プロセスが使用できるメモリ量には制限があるようです。しかし、ulimitを実行すると、「無制限」と表示されます。

更新-作成ログは次のとおりです。

libtool:コンパイル:cc -msse2-I。 -I/home/cleong/qb -DPHP_ATOM_INC -I/home/cleong/qb/include -I/home/cleong/qb/main -I/home/cleong/qb -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -DHAVE_CONFIG_H -g -O2 -c /home/cleong/qb/qb_interpreter_gcc.c -fPIC -DPIC -o .libs/qb_interpreter_gcc.o

cc1:合計924852224バイトの後に408バイトを割り当てるメモリ不足

make:*** [qb_interpreter_gcc.lo]エラー1

/ bin/time -vからの出力:

Command exited with non-zero status 2
    Command being timed: "make"
    User time (seconds): 62.09
    System time (seconds): 11.28
    Percent of CPU this job got: 64%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 1:53.02
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1848592
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 9433
    Minor (reclaiming a frame) page faults: 1391779
    Voluntary context switches: 5642
    Involuntary context switches: 6069
    Swaps: 0
    File system inputs: 630360
    File system outputs: 1376
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 2

Gccのバージョンは4.7.2です。

ソースコードはここにあります:

https://github.com/chung-leong/qb

これはPHP拡張機能です。ビルドプロセスはphpizeを使用します。

更新-32ビットのMageia3でも同じ問題が発生しています。これにはgcc4.7.2も含まれています。代わりに、約2.7ギガで障害が発生します。 64ビット環境では、それは起こりません。

Gcc 4.6.3をインストールし、それを使用してビルドすると、機能します。

3
cleong

-O1以下の最適化レベルで、64ビットUbuntuがプロジェクトをコンパイルできるという事実は、問題がgccの最適化フェーズにあることを意味します。

プロジェクト内の一部のソースファイルは、バージョン4.7.2で導入されたgccオプティマイザーのバグまたは非効率性によって発生すると思います。これにより、不当な量のメモリが使用されます。

だから私が提案するのは:

  1. 32ビットバージョンのgccは、2〜3 GBのメモリにしかアクセスできません(スワップのサイズに関係なく)。
  2. スワップスペースを拡大しますが、それでも問題が解決しない場合は読み続けてください。いずれにせよ、32ビットgccの場合、使用できるメモリの量には制限があります。
  3. ソースファイルを1つずつコンパイルして、問題の原因となっているファイルを見つけます。これがすべてである場合、問題はいくつかのインクルードファイルにあります。
  4. インクルードファイルに問題がない場合は、エラーの発生を停止するか、エラーの原因となっている関数を見つけるまで、問題のあるソースファイルをさらにいくつかの部分に分割します。
  5. 一時的な回避策として、その関数を-O1でコンパイルするようにmakeファイルを変更します。この場合、問題はgcc自体にあり、その関数をバグレポートで送信できます(allインクルードファイルと一緒に)。
  6. もちろん、プロジェクト全体を-O1でコンパイルすることもできます。これは、PHP拡張子で十分なはずです。または、今のところgcc4.6.3のままにすることもできます。
  7. バグレポートとは無関係にバグが修正(または非効率性が削除)される可能性があるため、gccの新しい更新を試し続けてください。
2
harrymc

うわー、それはプロジェクトです!

このプロジェクトをビルドするには、64ビットホストシステムで実行されているクロスコンパイラを使用する必要があるようです。 FirefoxはそのようにIIRCで構築されています。

GCCは、仮想メモリの断片化が原因でアドレススペースをすべて使い果たした可能性があります。また、統計に表示される900メガバイトは、コミットされた物理メモリである可能性があります。これは通常、予約済みの仮想メモリよりも低くなります。

また、物理メモリとスワップファイルのサイズに関係なく、すべての32ビットプロセスは2Gb以下のメモリにアクセスできます。

0
Mikhail Kupchik