Назад | Перейти на главную страницу

centos + php утечка памяти, но где?

У меня есть большая задача php cron, которая запускается каждые 20 минут. После каждого выполнения объем оперативной памяти, используемой виртуальным сервером, увеличивается и не освобождается должным образом после завершения сценария!

Но почему? Память не кешируется

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

Скрипт создает curl / multi_curl и обновляет базу данных Mysql.

Есть ли способ отладить сценарий, видя все переменные и использование памяти с течением времени? или просто те, которые не были выпущены в конце ...

Память должна быть освобождена при выходе из программы (независимо от того, освободила она ее или нет). Например.

[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

Итак, если ваш скрипт запускается при выходе из задания cron, это не будет проблемой. Значит, вам нужно посмотреть, какая программа растет в памяти. Вы можете просто посмотреть это, используя top (Вы можете отсортировать по размеру резидентной памяти, нажав F (заглавная), а затем q для RES вверху) и посмотрим, какая программа растет.

Я предполагаю, что это будет MySQL, потому что что бы ни делал ваш скрипт, он делает что-то в SQL, а SQL в конечном итоге использует больше памяти. Это, вероятно, на самом деле не проблема, если я должен был догадаться, MySQL будет использовать память, которую он может получить, и использовать ее с умом большую часть времени.