我有一个大型 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
按常驻内存大小排序),然后查看哪个程序占用正在增加的内存。F
q
我猜是 MySQL,因为无论你的脚本做什么,它都会在 SQL 中执行操作,而 SQL 最终会使用更多内存。如果我不得不猜测,这实际上可能不是问题,MySQL 会占用它能获得的内存,并且大多数时候会明智地使用它。