Solaris 10: виртуальная память исчерпана

tmp может быть сокращением от временный (, как и переходный ), поскольку эти файлы, как и файлы журналов, периодически сменяются/усекаются. Файлы utmpи wtmpтакже изначально находились в /tmp, когда они были представлены в Версии 3 AT&T Unix .

Однако в настоящее время tmpможет быть прочитано как сокращение от timestamp . tmтакже является общепринятой аббревиатурой времени(см., например, руководство для ctime()функции C и заголовок time.h), и эти файлы содержат метки времени для системных событий. относительно входа пользователей в систему.

  • uв utmp, вероятно, исходит от пользователя .
  • Ошибка bвbtmp(в системах, в которых она есть ), скорее всего, возникает из-за неверных(неверных входов в систему ).
  • wвwtmpможет исходить от who(как в "кто был в системе?" ), но не из whoилиw(утилит ), поскольку они используют utmp, а не wtmp.

4
08.05.2019, 20:38
2 ответа

Это оказалось ошибкой gmake 3.81. Когда я запускал команду компиляции напрямую без make, она могла использовать гораздо больше памяти. Кажется, в 3.80 была известная ошибка:Что-то вроде этого . Этот баг должен был быть исправлен в 3.81. но я получил очень похожую ошибку.

Итак, я попробовал gmake 3.82. Компиляция продолжилась, и я больше не видел ошибки виртуальной машины.

Мне так и не удалось заставить его сделать дамп ядра, поэтому я на самом деле не знаю, на что не хватило виртуальной памяти, на gmake, g++ или as. Это просто не сбрасывало бы ядро ​​​​при этой ошибке. Я также не знаю, в чем на самом деле была ошибка, но, похоже, теперь она работает.

0
27.01.2020, 21:02

У меня есть кое-что, что вы можете попробовать:

  1. Я думаю, @AndrewHenle прав, что вам нужно больше места подкачки .
  2. Вы можете попробовать поиграться с ограничениями глубины рекурсии шаблонов и constexpr GCC(-ftemplate-depthи-fconstexpr-depth). В лучшем случае, однако, я ожидаю, что это только поможет вам увидеть, какие выражения (s )вызывают нехватку памяти.
  3. Некоторые приемы отладки (подробнее об этом ниже)

В этой статье подробно описывается, как увеличить пространство подкачки в Solaris , однако придет день, когда эта ссылка будет разорвана, так что вот краткий обзор этой статьи:

# Identify the current swap volume.
$ swap -l
swapfile                 dev  swaplo   blocks   free
/dev/zvol/dsk/rpool/swap 256,1      16 1058800 1058800
# Do one of the following:
# a) Modify the existing swap volume (REQUIRES REBOOT)
    $ zfs get volsize rpool/swap
    NAME        PROPERTY  VALUE    SOURCE
    rpool/swap  volsize   517M     -

    $ zfs set volsize=2g rpool/swap

    $ zfs get volsize rpool/swap
    NAME        PROPERTY  VALUE    SOURCE
    rpool/swap  volsize   2G       -

    $ init 6
# b) Add an additional swap volume
    # Create it
    $ zfs create -V 2G rpool/swap2

    # Activate it
    $ swap -a /dev/zvol/dsk/rpool/swap2

    $ swap -l
    swapfile                  dev  swaplo   blocks   free
    /dev/zvol/dsk/rpool/swap  256,1      16 1058800 1058800
    /dev/zvol/dsk/rpool/swap2 256,3      16 4194288 4194288

    # Add an entry for the new volume in /etc/vfstab
    $ /opt/csw/gnu/grep -P '\sswap' /etc/vfstab
    /dev/zvol/dsk/rpool/swap  - - swap - no -
    /dev/zvol/dsk/rpool/swap2 - - swap - no -

Если вы хотите попробовать диагностировать проблему, попробуйте сделать следующее:

# This tells Solaris to add all available sections into coredumps &
# place coredumps in your home directory with the given pattern
$ coreadm -p ~/%t.%n.%u.%f.%p.core -P all

$ gcc ${flags} source.cc -fsyntax-only
$ gcc ${flags} source.cc -c -o source.o

Что искать/попробовать:

  • Сбой при -fsyntax-only?
  • Если оба аварийно завершают работу, дампы ядра будут примерно одинакового размера?
  • Размер дампа памяти должен указывать на то, сколько памяти процесс получил перед сбоем. Сравните это с ограничениями системы :
    • В topмашина Solaris, на которую я смотрю, показывает 511 ГБ физической памяти, 153 ГБ свободной, 20 ГБ общей подкачки, 20 ГБ свободной подкачки.
    • Запустите swap -lи сравните
  • Изменяется ли поведение каким-либо заметным образом после изменения размера подкачки?
    • Сбой происходит раньше / требуется больше времени для сбоя
    • Размер ядра отличается
  • Попробуйте намеренно использовать небольшой размер подкачки (или вообще избавиться от раздела подкачки ), чтобы увидеть, не произойдет ли более ранний сбой, создание меньшего дампа ядра или какое-либо другое изменение поведения.
  • Вставьте большой жесткий диск и используйте весь диск для подкачки.

Кроме того, взгляните на некоторые флаги GCC,например:

  • -QПечатать имена функций по мере их компиляции и статистику о каждом проходе
  • -ftime-reportИнформация о времени для каждого прохода
  • Различные -fdump-rtl*флаги
  • Попробуйте получить вывод на разных этапах (препроцессора, сборки и т. д. ), чтобы увидеть, получится ли у вас другое поведение
0
27.01.2020, 21:02

Теги

Похожие вопросы