2009-10-15 13 views
0

Problème: mon mod_perl fuit et je ne peux pas le contrôler. Je lance le script mod_perl sous Ubuntu (code de production). Généralement, 8 à 10 instances de script s'exécutent simultanément. Selon l'utilitaire "top" d'Unix, chaque instance prend 55M de mémoire. 55M c'est beaucoup, mais on m'a dit que la plupart de ceci memory is shared.Puis-je mesurer la mémoire prise par mod_perl?

La mémoire fuit. Il y a 512M sur le serveur. Il y a une diminution significative de la mémoire libre dans les 24 heures suivant le redémarrage.

Test: mémoire libre sur le système au moment 10 scripts sont en cours d'exécution: reboot -après: 270M -Dans 24 heures depuis la reboot: 50M

En 24 heures la mémoire prise par chaque script est à peu près la même - 55M (selon l'utilitaire "top"). Je ne comprends pas où la mémoire fuit. Et je ne sais pas comment puis-je trouver les fuites. Je partage la mémoire, je précharge tous les modules nécessaires au script dans startup.pl.

Encore un test. Un script mod_perl très simple (« Bonjour tout le monde! ») Prend 52M (selon « top »)

Selon « mod_perl pratique » Je peux use GTop utility pour mesurer la mémoire réelle prise par mod_perl. J'ai fait un script très simple qui mesure la mémoire avec GTop. Il montre qu'il y a 54M de mémoire réelle prise par un script Perl très simple! 54 Mégaoctets par "Bonjour tout le monde"? !!!

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

Il doit y avoir quelque chose qui ne va pas dans la façon dont je mesure la mémoire mod_perl. Aidez s'il vous plaît! Ce problème me rend fou pendant plusieurs jours.

Ce sont les instantanés de la sortie "top" après le redémarrage et dans les 24 heures après le redémarrage. Les processus sont triés par mémoire.

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

Les gars, une chance pour moi d'avoir une réponse? – Pavel

Répondre

2

Il ne semble pas vraiment comme le nombre de apache/processus mod_perl existants ou la mémoire qu'ils utilisent a beaucoup changé entre les deux rapports que vous publiez. Je remarque que vous n'avez pas affiché l'en-tête pour le deuxième rapport. Il serait intéressant de voir le chiffre "mis en cache" après 24 heures. Je vais aller sur un membre et deviner que c'est là que votre mémoire va - Linux l'utilise pour la mise en cache des E/S de fichiers. Vous pouvez considérer le cache d'E/S comme une mémoire essentiellement libre, puisque Linux rendra cette mémoire disponible si les processus en ont besoin.

Vous pouvez également vérifier que c'est ce qui se passe en effectuant

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

en tant que root cause the memory in use by the caches to be released et confirmant que cela provoque la quantité de mémoire libre rapporté de revenir aux valeurs initiales.

+0

commande drop_caches est amaizing! Merci beaucoup! Maintenant, j'ai un meilleur contrôle sur mon système. J'ai mis à jour les diagnostics supérieurs "après 24h". 114620k (mis en cache) + 66796k (gratuit) = 181416k Par rapport à l'original 269300k est une différence de 90M. – Pavel