centos+php 泄漏内存,但是在哪里?

centos+php 泄漏内存,但是在哪里?

我有一个大型 php cronjob,每 20 分钟运行一次。每次执行后,虚拟服务器使用的 RAM 内存都会增加,并且脚本终止后无法正确释放!

但为什么呢?内存没有缓存

             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 DB。

有没有办法调试脚本并查看所有变量和内存使用情况随时间的变化?或者简单地查看最后未释放的变量和内存使用情况...

答案1

当程序退出时,应该释放内存(无论程序是否释放它)。例如。

[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 作业退出时运行,则不会出现此问题。因此,您需要查看哪个程序的内存占用正在增加。您可以使用以下方法查看此情况(您可以按(大写)然后按顶部的 REStop按常驻内存大小排序),然后查看哪个程序占用正在增加的内存。Fq

我猜是 MySQL,因为无论你的脚本做什么,它都会在 SQL 中执行操作,而 SQL 最终会使用更多内存。如果我不得不猜测,这实际上可能不是问题,MySQL 会占用它能获得的内存,并且大多数时候会明智地使用它。

相关内容