centos + php vazam memória, mas onde?

3

Eu tenho um grande trabalho de php que é executado a cada 20 minutos. Após cada execução, a memória RAM usada pelo servidor virtual aumenta e não é liberada quando o script é finalizado!

Mas por quê? A memória não está armazenada em cache

             total       used       free     shared    buffers     cached
Mem:          2048       1948         99          0          0         88
-/+ buffers/cache:       1859        188
Swap:            0          0          0

O script faz um pouco de curl / multi_curl e atualiza o banco de dados do Mysql.

Existe uma maneira de depurar o script vendo todas as variáveis e o uso da memória ao longo do tempo? ou simples os que não foram liberados no final ...

    
por Andrea Sica 19.06.2014 / 13:17

1 resposta

1

A memória deve ser liberada quando um programa é encerrado (independentemente de o programa ter sido liberado ou não). Por exemplo.

[kbrandt@ny-kbrandt01: ~] cat eat_mem.c
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
    #1 GByte
    const int m = 1024*1024*1024;
    #Allocate a gig
    void *p = (int*)malloc(m);
    #Write a Gigs worth of zeros to that gig
    memset(p,0,m);
    sleep(10);
    #In theory I should free(p) here (heh... heh... I said "free p", get it?)
    return 0;
}

[kbrandt@ny-kbrandt01: ~] gcc eat_mem.c; ./a.out &; sleep 1; free -m;sleep 10; free -m
[1] 10666
             total       used       free     shared    buffers     cached
Mem:          7872       1848       6023          0        143        431
-/+ buffers/cache:       1273       6599
Swap:        30467          0      30467
[1]  + done       ./a.out
             total       used       free     shared    buffers     cached
Mem:          7872        823       7049          0        143        431
-/+ buffers/cache:        247       7624
Swap:        30467          0      30467

Portanto, supondo que seu script seja executado pelas saídas de tarefa agendadas, esse não seria o problema. Então você precisa ver qual programa está crescendo na memória. Você pode apenas observar isso usando top (Você pode classificar por tamanho de memória residente pressionando F (capital) e, em seguida, q para RES no topo) e ver qual programa cresce.

Meu palpite é que ele será MySQL, porque o que seu script faz, ele faz coisas em SQL e SQL acaba usando mais memória. Isso provavelmente não é um problema se eu tivesse que adivinhar, o MySQL vai pegar a memória que pode obter e usá-la sabiamente na maior parte do tempo.

    
por 19.06.2014 / 14:09