у Ubuntu 12.10 втрачено пам’яті


3

Я намагаюся скомпілювати свій проект C в Ubuntu (32-бітний), що працює в VirtualBox. Для складання коду, про який йде мова, потрібно зовсім небагато пам'яті, принаймні 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 / включати -I / home / cleong / qb / main -I / home / cleong / qb -I / usr / включати / php5 -I / usr / включати / php5 / main -I / usr / включати / php5 / TSRM -I / usr / включати / php5 / Zend -I / usr / включати / php5 / ext -I / usr / включати / 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: з пам'яті виділяється 408 байт після загальної кількості 924852224 байт

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-розрядному Mageia 3, який також включає gcc 4.7.2. Відмова трапляється на рівні приблизно 2,7 гіга. У 64-бітному середовищі цього не відбувається.

Якщо я встановлю gcc 4.6.3 і будую за допомогою цього, він працює.


1
Ви впевнені, що в коді немає жодної проблеми? Я не фахівець, але 3гг пам'яті для складання програми C здається надмірним.
тердон

1
Додайте версію gcc та відповідні частини журналу збірки (зробіть вихідний чи подібний).
Ярослав Рахматуллін

Що станеться, якщо ви компілюєте без оптимізації ("-O0")? Чи використовували ви 64-бітну версію gcc?
harrymc

Він працює, коли він становить -O1 або нижче. У 64-бітній версії Ubuntu мені вдалося змусити її компілювати.
cleong

@cleong, спробуйте додати більше місця для заміни відповідно до цього питання в Stack Overflow. Зрозуміло, що 2 Гб оперативної пам’яті + 2 Гб своп не збирається її скорочувати, спробуйте розділити 8GB свопом.
Прорив

Відповіді:


2

Той факт, що при рівні оптимізації -O1або меншому, 64-розрядному Ubuntu вдається зібрати проект, означає, що проблема полягає в фазі оптимізації gcc.

Я б припустив, що якийсь вихідний файл у вашому проекті виникає через помилку чи неефективність оптимізатора gcc, представленого у версії 4.7.2. що спричиняє використання необґрунтованої кількості пам’яті.

Тому я б запропонував:

  1. 32-розрядна версія gcc може отримати доступ лише до 2-3 ГБ пам'яті (незалежно від розміру, який є свопом).
  2. Збільште простір для заміни, але продовжуйте читати, якщо це не допоможе. У будь-якому випадку для 32-бітного gcc буде обмежено об'єм пам'яті, який він може використовувати.
  3. Складаючи вихідні файли по одному, знайдіть той, який відповідає за проблему. Якщо це всі вони, то проблема полягає в тому, що деякі файли включають.
  4. Якщо проблема полягає не в файлі включення, далі розбийте проблемний вихідний файл на кілька частин, поки ви або не припините отримувати помилку, або не знайдете ту саму функцію, яка її викликає.
  5. Як тимчасове вирішення, змініть файл make так, щоб компілювати цю функцію -O1. Проблема в цьому випадку з самим gcc, і ви можете надіслати цю функцію у звіті про помилку (разом із усіма файлами, що включають).
  6. Звичайно, ви також можете скомпілювати весь проект, -O1 який повинен бути достатнім для розширення PHP, або залишитися з gcc 4.6.3 на даний момент.
  7. Продовжуйте випробовувати нові оновлення для gcc, оскільки помилка може бути виправлена ​​(або усунена неефективність) не пов’язаною із вашим звітом про помилку.

0

Нічого собі, це проект!

Схоже, для створення цього проекту вам доведеться використовувати крос-компілятор, який працює на 64-бітній хост-системі. Firefox побудований таким чином IIRC.

GCC, ймовірно, вичерпав увесь свій адресний простір через фрагментацію віртуальної пам’яті, а також 900 мег, які ви бачите в статистиці, ймовірно, це зафіксована фізична пам'ять, яка, як правило, нижче, ніж зарезервована віртуальна пам'ять.

Крім того, кожен 32-розрядний процес може отримати доступ не більше ніж 2 Гб пам'яті, незалежно від розміру фізичної пам’яті та файлу підкачки.


Мені вдалося скласти проект на Mageia, CentOS та трьох версіях Debian, як в 32-бітній, так і в 64-бітній. Вона складена чудово на Ubuntu Server 12.04. Я думаю, що це щось специфічне для Ubuntu 12.10.
cleong

@cleong для цих інших систем чи потрібна була компіляція стільки пам’яті?
тердон

Це робить. Просто природа коду.
cleong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.