Verifique se há memória e armazenamento suficientes para compilar um arquivo?

0

Estou testando uma biblioteca C ++ no Solaris 11 com o Sun Studio 12.5. A biblioteca está livre de problemas sob o Sun Studio 12.2 até 12.4, mas está com problemas abaixo de 12.5.

Em 12.5, o ponto problemático aparece ao compilar uma construção não otimizada e debug do arquivo bench.cpp . As ferramentas reclamam que ficaram sem espaço. A saída da compilação com falha está abaixo.

Eu já vi esse sintoma antes, mas normalmente é um dispositivo ARM com pouca memória e sem arquivo de permuta .

A máquina possui dois Xeon, 8 GB de RAM e dois drives de disco de 136 GB em uma configuração RAID 1. O espaço em disco usado parece ser de cerca de 20 GB. Temo que eu possa ter configurado mal ao instalar o sistema, mas não consigo identificar o que é. As informações de configuração estão abaixo.

Minhas perguntas são muito básicas: tenho memória e armazenamento suficientes para compilar um arquivo que sobrecarrega as ferramentas? Alguma coisa está mal configurada?

$ prtconf | grep -i memory
Memory size: 8190 Megabytes

$ zpool list
NAME   SIZE  ALLOC  FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  136G  19.6G  116G  14%  1.00x  ONLINE  -

$ df -h
Filesystem             Size   Used  Available Capacity  Mounted on
rpool/ROOT/solaris     134G    11G       113G    10%    /
/devices                 0K     0K         0K     0%    /devices
/dev                     0K     0K         0K     0%    /dev
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                   6.7G   1.6M       6.7G     1%    /system/volatile
objfs                    0K     0K         0K     0%    /system/object
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                       124G    11G       113G    10%    /lib/libc.so.1
fd                       0K     0K         0K     0%    /dev/fd
rpool/ROOT/solaris/var
                       134G   346M       113G     1%    /var
swap                   6.8G   114M       6.7G     2%    /tmp
rpool/VARSHARE         134G   164K       113G     1%    /var/share
rpool/export           134G    32K       113G     1%    /export
rpool/export/home      134G    36K       113G     1%    /export/home
rpool/export/home/apolyakov
                       134G    38K       113G     1%    /export/home/apolyakov
rpool/export/home/jwalton
                       134G   2.6G       113G     3%    /export/home/jwalton
rpool/export/home/mcaswell
                       134G    38K       113G     1%    /export/home/mcaswell
rpool/export/home/pgutmann
                       134G    38K       113G     1%    /export/home/pgutmann
rpool                  134G   4.9M       113G     1%    /rpool
rpool/VARSHARE/zones   134G    31K       113G     1%    /system/zones
rpool/VARSHARE/pkg     134G    32K       113G     1%    /var/share/pkg
rpool/VARSHARE/pkg/repositories
                       134G    31K       113G     1%    /var/share/pkg/repositories

E:

# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <HP-LOGICAL VOLUME-5.26-136.70GB>
          /pci@0,0/pci8086,25e3@3/pci103c,3235@0/sd@0,0
Specify disk (enter its number): 0
selecting c1t0d0
[disk formatted]
/dev/dsk/c1t0d0s1 is part of active ZFS pool rpool. Please see zpool(1M).

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        ...

format> partition

PARTITION MENU:
        0      - change '0' partition
        1      - change '1' partition
        2      - change '2' partition
        3      - change '3' partition
        4      - change '4' partition
        5      - change '5' partition
        6      - change '6' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        ...
partition> print
Current partition table (original):
Total disk sectors available: 286660669 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector         Size         Last Sector
  0  BIOS_boot    wm               256      256.00MB          524543    
  1        usr    wm            524544      136.44GB          286660702    
  2 unassigned    wm                 0           0               0    
  3 unassigned    wm                 0           0               0    
  4 unassigned    wm                 0           0               0    
  5 unassigned    wm                 0           0               0    
  6 unassigned    wm                 0           0               0    
  8   reserved    wm         286660703        8.00MB          286677086   
$ cat bench-compile.txt
...
/opt/developerstudio12.5/bin/CC -DDEBUG -g3 -xO0 -native -m64 -KPIC -template=no%extdef -c bench2.cpp

DBG_GEN FATAL ERROR: dbg_tables.c:171 - fwrite() failed to write required bytes [DBG_GEN 5.6.3]

CC: Fatal error in /opt/developerstudio12.5/lib/compilers/bin/previse
CC: Status 134
gmake: *** [test.o] Error 134
gmake: *** Waiting for unfinished jobs....
Assembler: bench2.cpp
    "<null>", line 821548 : Trouble writing; probably out of temporary file space
/opt/developerstudio12.5/lib/compilers/sys/amd64/libsunir.so'ir_proc_write+0x5d [0xffff80ffbb0eeffd]
/opt/developerstudio12.5/lib/compilers/sys/amd64/libsunir.so'ir_mod_write_and_close+0x2f [0xffff80ffbb10633f]
/opt/developerstudio12.5/lib/compilers/bin/iropt'0x3fee3f [0x7fee3f]
/opt/developerstudio12.5/lib/compilers/bin/iropt'main+0x567 [0x8058f7]
/opt/developerstudio12.5/lib/compilers/bin/iropt'0x12d324 [0x52d324]
compiler(iropt) error:  libsunir File IO (read / write IR) error using /tmp/iropt.1468062981.23519.05.ir (No space left on device).
CC: cannot copy temporaries: /tmp/previse.1468062981.23519.07.err
CC: Fatal error in /opt/developerstudio12.5/lib/compilers/bin/previse
CC: Status 134
gmake: *** [bench2.o] Error 134
ERROR: failed to make cryptest.exe

$ 
    
por jww 09.07.2016 / 13:52

2 respostas

2

De acordo com a mensagem de erro, seu sistema está com falta de memória virtual. Isso pode acontecer mesmo com espaço em disco suficiente e RAM suficiente.

Eu começaria criando um segundo zvol, digamos um de 8 GB, e o adicionaria como um dispositivo de swap. por exemplo:

zfs create -V 8gb rpool/swap1
swap -a /dev/zvol/dsk/rpool/swap1
echo "/dev/zvol/dsk/rpool/swap1 - - swap - no -" >> /etc/vfstab

O monitoramento do uso de memória virtual pode ser feito com o comando swap -s .

    
por 10.07.2016 / 01:00
1

Existem dois problemas semelhantes que podem acontecer ao criar programas no Solaris com compiladores do Studio.

1) / o espaço do tmp se esgota

O sintoma acima mostra que isso estava acontecendo para você. Desde a o diretório / tmp é alocado para fora da memória virtual sistema de arquivos) a resposta é adicionar espaço de troca, como mostrado acima.

2) malloc retorna um código de falha

Se o sistema não conseguir encontrar espaço de heap (malloc) um processo em execução, um dos modos de erro comuns será uma mensagem sobre "fork failed", que acontece quando o sistema operacional não pode alocar memória virtual suficiente para fazer um novo imagem do processo. Esta mensagem virá do sistema operacional, não o compilador.

O kernel do Solaris, às vezes, retorna uma falha malloc () para um programa do usuário, mesmo que haja bastante espaço de troca atribuído ao sistema. Isso acontece quando o pedido de memória o tempo acabou. Se o kernel não conseguir encontrar espaço disponível (trocando a memória para o disco, por exemplo) dentro de um tempo, ele retornará uma falha.

Isso será confuso porque parece que não há mais swap, mas é apenas um problema de tempo.

Em resumo:

A falta de VM através do diretório / tmp tem sintomas diferentes e comportamento diferente do que ficar sem VM através da chamada malloc (). Então tenha isso em mente.

    
por 11.07.2016 / 23:14