Minnesläcka i mitt perl-skript?
Postat: 17 feb 2012, 16:01
Min Buffalo Linkstation med 52 MB minne måste med jämna mellanrum bootas om. Svarstiderna för mina php-sidor och snurrtiden för mitt evighetsloopade perl-script blir efterhand allt längre. Har noterat att Perl efterhand tar åt sig alltmer minne. Efter 14 timmar, som i exemplet med pid 1352 nedan, så swappar det mellan 25-40%. Detta medan en nystartad perl-process ligger runt 10 %.
Google påstår att minnesläckor i perl sällan är en relevant fråga. Det stämmer säkert för cron-script som snabbt termineras. Men vad gäller för evighetsloopar? Jag har noterat att det finns programvara som identifierar överallokerat minne och trådar, men de verkar besvärliga.
Mina misstankar riktas just nu mot:
Kod: Markera allt
top - 14:17:44 up 14:59, 1 user, load average: 2.38, 2.25, 2.12
top - 14:23:29 up 15:04, 1 user, load average: 2.15, 2.26, 2.16
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.8%us, 9.1%sy, 0.0%ni, 0.0%id, 83.8%wa, 0.0%hi, 1.3%si, 0.0%st
Mem: 52008k total, 50660k used, 1348k free, 216k buffers
Swap: 1000440k total, 80168k used, 920272k free, 6580k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1352 root 20 0 71624 18m 1396 D 3.3 37.2 65:47.18 perl
15693 root 20 0 19188 5988 2500 S 1.6 11.5 0:04.30 perl
Mina misstankar riktas just nu mot:
- Alla sql-anrop jag gör. Anslutningen upprättas före evighetsloopen, men måste frågorna till databasen dödas på något vis?
- De metoder i moduler som anropas, dör sådant av sig självt?
- Eventuella nästlade satser som jag inte upptäckt och som kanske växer för varje varv (kan dock inte tro att jag har något sådant)?
- hur kan jag vara säker på att jag har en minnesläcka
- finns det något slags allmänt felsökningsschema för minnesläckage, eller
- finns det olika kategorier av minnesläckage som är beskrivna och kan användas som utgångspunkt?