2009-10-15 21 views
0

問題:我的mod_perl泄漏,我無法控制它。我可以測量mod_perl佔用的內存嗎?

我在Ubuntu(生產代碼)下運行mod_perl腳本。 通常同時運行8-10個腳本實例。

根據Unix「top」實用程序,每個實例需要55M的內存。 55M是很多,但我在這裏告訴大部分這memory is shared

內存泄漏。 服務器上有512M。 重新啓動後24小時內可用內存明顯減少。

測試: -after重啓:重啓以來270M -in 24小時服務:目前10個腳本運行的系統可用內存50M

在每個腳本採取24小時內存是大致相同 - 55M(根據「頂級」實用程序)。 我不明白內存泄漏的位置。 不知道如何找到泄漏。

我共享內存,我預先加載了startup.pl中腳本所需的所有模塊。

再一次測試。 一個非常簡單的mod_perl腳本(「世界,你好!」)採用52M(據「頂」)

據「實用的mod_perl」我可以use GTop utility來衡量的mod_perl採取的實際內存。 我已經做了一個非常簡單的腳本,用GTop來測量內存。它顯示了一個非常簡單的perl腳本有54M真實內存! 「Hello world」54兆字節?

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 
+0

夥計們,我有什麼機會得到答案? – Pavel 2009-10-16 14:15:13

回答

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,並確認這將導致報告回覆到初始值的可用內存量。

+0

drop_caches命令令人驚歎! 非常感謝! 現在我對我的系統有了更好的控制。 我已經更新了「24小時後」的最佳診斷。 114620k(緩存)+ 66796k(免費)= 181416k 相比原來的269300k是一個90M的差異。 – Pavel 2009-10-22 09:47:12