我可以测量mod_perl占用的内存吗?

时间:2009-10-15 06:52:56

标签: memory-leaks mod-perl

问题:我的mod_perl泄漏,我无法控制它。

我在Ubuntu(生产代码)下运行mod_perl脚本。 通常有8-10个脚本实例同时运行。

根据Unix“top”utilty,每个实例需要55M的内存。 55M很多,但我在这里被告知大部分memory is shared

记忆力正在泄漏。 服务器上有512M。 重启后24小时内可用内存大幅减少。

测试:当前运行10个脚本时,系统上有空闲内存: - 重启后:270M - 重启后24小时:50M

在24小时内,每个脚本占用的内存大致相同 - 55M(根据“顶部”实用程序)。 我不明白记忆泄漏的地方。 而且不知道我怎么能找到泄漏。

我共享内存,我在startup.pl中预加载脚本所需的所有模块。

还有一个测试。 一个非常简单的mod_perl脚本(“Hello world!”)需要52M(根据“top”)

根据“Practical mod_perl”,我可以use GTop utility来测量mod_perl占用的实际内存。 我制作了一个非常简单的脚本,用GTop测量内存。 它显示了一个非常简单的perl脚本占用的54M实内存! “你好世界”的54兆字节?!!!

proc-mem-size: 59,707392
proc-mem-share: 52,59264
diff: 54,448128

我测量mod_perl内存的方式一定有问题。 请帮忙! 这个问题让我疯了好几天。

这些是重启后和重启后24小时内“顶部”输出的快照。 这些过程按内存排序。

---- RIGHT AFTER REBOOT ----

top - 10:25:24 up 55 min,  2 users,  load average: 0.10, 0.07, 0.07
Tasks:  59 total,   3 running,  56 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 97.3%id,  0.7%wa,  0.0%hi,  0.0%si,  2.0%st
Mem:    524456k total,   269300k used,   255156k free,    12024k buffers
Swap:        0k total,        0k used,        0k free,    71276k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2307 www-data  15   0 58500  27m 5144 S  0.0  5.3   0:02.02 apache2
 2301 www-data  15   0 58492  27m 4992 S  0.0  5.3   0:02.09 apache2
 2302 www-data  15   0 57936  26m 4960 R  0.0  5.2   0:01.74 apache2
 2895 www-data  15   0 57812  26m 5048 S  0.0  5.2   0:00.98 apache2
 2903 www-data  15   0 56944  26m 4792 S  0.0  5.1   0:01.12 apache2
 2886 www-data  15   0 56860  26m 4784 S  0.0  5.1   0:01.20 apache2
 2896 www-data  15   0 56520  26m 4804 S  0.0  5.1   0:00.85 apache2
 2911 www-data  15   0 56404  25m 4768 S  0.0  5.1   0:00.87 apache2
 2901 www-data  15   0 56520  25m 4744 S  0.0  5.1   0:00.84 apache2
 2893 www-data  15   0 56608  25m 4740 S  0.0  5.1   0:00.73 apache2
 2277 root      15   0 51504  22m 6332 S  0.0  4.5   0:01.02 apache2
 2056 mysql     18   0 98628  21m 5164 S  0.0  4.2   0:00.64 mysqld
 3162 root      15   0  6356 3660 1276 S  0.0  0.7   0:00.00 vi
 2622 root      15   0  8584 2980 2392 R  0.0  0.6   0:00.07 sshd
 3083 root      15   0  8448 2968 2392 S  0.0  0.6   0:00.06 sshd
 3164 par       15   0  5964 2828 1868 S  0.0  0.5   0:00.05 proftpd
    1 root      18   0  3060 1900  576 S  0.0  0.4   0:00.00 init
 2690 root      17   0  4272 1844 1416 S  0.0  0.4   0:00.00 bash
 3151 root      15   0  4272 1844 1416 S  0.0  0.4   0:00.00 bash
 2177 root      15   0  8772 1640  520 S  0.0  0.3   0:00.00 sendmail-mta
 2220 proftpd   15   0  5276 1448  628 S  0.0  0.3   0:00.00 proftpd
 2701 root      15   0  2420 1120  876 R  0.0  0.2   0:00.09 top
 1966 root      18   0  5396 1084  692 S  0.0  0.2   0:00.00 sshd


---- ROUGHLY IN 24 HOURS AFTER REBOOT

top - 17:45:38 up 23:39,  1 user,  load average: 0.02, 0.09, 0.11
Tasks:  55 total,   2 running,  53 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    524456k total,   457660k used,    66796k free,   127780k buffers
Swap:        0k total,        0k used,        0k free,   114620k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16248 www-data  15   0 63712  35m 6668 S  0.0  6.8   0:23.79 apache2
19417 www-data  15   0 60396  31m 6472 S  0.0  6.2   0:10.95 apache2
19419 www-data  15   0 60276  31m 6376 S  0.0  6.1   0:11.71 apache2
19321 www-data  15   0 60480  29m 4888 S  0.0  5.8   0:11.51 apache2
21241 www-data  15   0 58632  29m 6260 S  0.0  5.8   0:05.18 apache2
22063 www-data  15   0 57400  28m 6396 S  0.0  5.6   0:02.05 apache2
21240 www-data  15   0 58520  27m 4856 S  0.0  5.5   0:04.60 apache2
21236 www-data  15   0 58244  27m 4868 S  0.0  5.4   0:05.24 apache2
22499 www-data  15   0 56736  26m 4776 S  0.0  5.1   0:00.70 apache2
 2055 mysql     15   0  100m  25m 5656 S  0.0  5.0   0:20.95 mysqld
 2277 root      18   0 51500  22m 6332 S  0.0  4.5   0:01.07 apache2
22686 www-data  15   0 53004  21m 4092 S  0.0  4.3   0:00.21 apache2
22689 root      15   0  8584 2980 2392 R  0.0  0.6   0:00.06 sshd
 2176 root      15   0  8768 1928  736 S  0.0  0.4   0:00.00 sendmail-
+mta
    1 root      18   0  3064 1900  576 S  0.0  0.4   0:00.02 init
22757 root      15   0  4268 1844 1416 S  0.0  0.4   0:00.00 bash
 2220 proftpd   18   0  5276 1448  628 S  0.0  0.3   0:00.00 proftpd
22768 root      15   0  2424 1100  876 R  0.0  0.2   0:00.00 top
 1965 root      15   0  5400 1088  692 S  0.0  0.2   0:00.00 sshd
 2258 root      18   0  3416 1036  820 S  0.0  0.2   0:00.01 cron
 1928 klog      25   0  2248 1008  420 S  0.0  0.2   0:00.04 klogd
 1946 messageb  19   0  2648  804  596 S  0.0  0.2   0:01.63 dbus-daem
+on
 1908 syslog    18   0  2016  716  556 S  0.0  0.1   0:00.17 syslogd

1 个答案:

答案 0 :(得分:2)

它实际上看起来不像现有的apache / mod_perl进程数,或者它们使用的内存在您发布的两个报告之间发生了很大变化。我注意到你没有发布第二份报告的标题。 24小时后看到“缓存”的数字会很有趣。我将走出困境,并猜测这是你的记忆发展的地方 - Linux正在使用它来缓存文件I / O.您可以将文件I / O缓存视为基本上可用的内存,因为如果进程需要,Linux将使该内存可用。

您还可以通过执行

来检查这是正在发生的事情
sync; echo 3 > /proc/sys/vm/drop_caches

cause the memory in use by the caches to be released为根,并确认这会导致报告的可用内存量恢复为初始值。