Eu tenho um programa de fortran que eu mesmo compilei e rodei o executável centenas de vezes (sem recompilar nem nada), mas agora, quando eu o executo, ele falha instantaneamente com falha de segmentação. Existem três outras instâncias do programa em execução no momento. top
apresenta o seguinte:
top - 15:37:06 up 5 days, 1:06, 2 users, load average: 3,00, 3,01, 3,06
Tasks: 290 total, 4 running, 285 sleeping, 0 stopped, 1 zombie
%Cpu(s): 24,4 us, 0,0 sy, 0,0 ni, 75,5 id, 0,1 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem : 8058952 total, 2409096 free, 2964692 used, 2685164 buff/cache
KiB Swap: 8263676 total, 8263676 free, 0 used. 4614096 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1230 user 20 0 12,329g 675720 3080 R 100,0 8,4 14:17.45 tetramer
1236 user 20 0 12,329g 675688 3052 R 100,0 8,4 13:58.96 tetramer
1234 user 20 0 12,329g 675800 3168 R 100,0 8,4 14:02.23 tetramer
Ele usa muita memória (pelo menos memória virtual), mas até agora costumava ser possível executar várias instâncias ao mesmo tempo, desde que o uso real da memória fosse baixo o suficiente. O código fortran em questão segue, ele falha antes de chegar ao write
.
IMPLICIT REAL*8(A-H,O-Z)
c
PARAMETER ( np = 220 )
c
PARAMETER ( ndim = 25000)
PARAMETER ( ndim2 = ndim*(ndim+1)/2 )
C
DIMENSION array(np,6,6),array2(np)
c
DIMENSION vector(50), vector2(50)
DIMENSION v1(159,30001),v2(159,30001),v3(159,30001)
C
COMMON /PARM/com1(99000) ,com2(0:8,0:8,99000)
1 ,com3(0:8),com4(0:8,0:8,0:8),nmax,mmax
1 ,com5(0:8,0:8)
C
COMMON /SET/ AX(0:4,-4:4,50),AY(0:4,-4:4,50),AZ(0:4,-4:4,50)
1 ,DD(0:4,-4:4,50), dd2(0:4,-4:4), nmax0(0:4,-4:4)
C
DIMENSION AH( ndim2 ),AF( ndim2 ),AF2(ndim2)
DIMENSION E( ndim ),VEC( ndim,ndim)
DIMENSION AH2(ndim,ndim),TEMP(ndim,ndim)
dimension nbarray(6)
C
CHARACTER*1 PARI
C
write(6,*) ' ###### ##### '
Eu realmente não tenho ideia de porque estou recebendo uma falha de segmentação de repente. Tanto quanto eu posso dizer, eu não estou nem acessando nenhuma memória no programa ainda (apenas alocando), então como posso obter uma falha de segmentação?
Além disso, ao direcionar a saída do programa para um perlskript, recebi um SIGPIPE
por algum motivo, embora tenha sido o programa do fortran que caiu, não o perlskript.
Alguém tem alguma ideia do que pode estar acontecendo aqui e como posso corrigi-lo?
Estou executando o Ubuntu 16.04, se isso for relevante.
Editar: as saídas solicitadas são:
~$ ldd ./tetramer
not a dynamic executable
~$ strace ./tetramer
execve("./tetramer", ["./tetramer"], [/* 32 vars */]) = -1 ENOMEM (Cannot allocate memory)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---
+++ killed by SIGSEGV +++
Segmentation fault (core dumped)
Eu também fiz alguns testes e é sempre a quarta instância do programa que falha com a falha de segmentação. Recentemente, eu fiz uma reinstalação (limpei alguns ubuntu mais antigos e instalei o 16.04), e pode ser que sob 16.04 eu só pudesse rodar três de cada vez e não percebesse. As vezes em que tenho absoluta certeza de que havia mais de três instâncias em que tudo antes da reinstalação.
Eu acho que pode ter a ver com o fato de que o programa tenta alocar 12gb de memória quando o total de memória mais swap é de apenas 16gb, mas com os parâmetros que estou usando agora só precisa de cerca de 1gb (no Coluna RES), então não vejo por que não posso executar mais de três instâncias.