0

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

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

根据 Unix“顶级”实用程序,每个实例占用 55M 内存。55M 很多,但是这里有人告诉我,大部分内存是共享的。

内存在泄漏。服务器上有512M。重新启动后 24 小时内可用内存显着减少。

测试:运行 10 个脚本时系统上的可用内存:-重启后:270M -重启后 24 小时内:50M

在 24 小时内,每个脚本占用的内存大致相同 - 55M(根据“top”实用程序)。我不明白内存泄漏在哪里。而且不知道如何找到泄漏点。

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

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

根据“实用 mod_perl”,我可以使用 GTop 实用程序来测量 mod_perl 占用的实际内存。我制作了一个非常简单的脚本,用 GTop 测量内存。它显示一个非常简单的 perl 脚本占用了 54M 的实际内存!54 兆字节的“Hello world”?!!!

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

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

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

---- 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
4

1 回答 1

2

实际上,在您发布的两个报告之间,存在的 apache/mod_perl 进程的数量或它们使用的内存看起来并没有太大变化。我注意到您没有发布第二份报告的标题。看到 24 小时后的“缓存”数字会很有趣。我要冒昧地猜测这就是你的记忆的去向——Linux 正在使用它来缓存文件 I/O。您可以将文件 I/O 缓存视为本质上的空闲内存,因为如果进程需要,Linux 会提供该内存。

您还可以通过执行来检查这是怎么回事

sync; echo 3 > /proc/sys/vm/drop_caches

以 root 身份释放缓存正在使用的内存,并确认这会导致报告的可用内存量恢复为初始值。

于 2009-10-19T23:21:06.870 回答