Minnesläcka i mitt perl-skript?

Generella mjukvarufrågor som inte är beroende av vilket operativsystem som körs skall ställas i denna kategori

Moderator: elf98

Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Användarvisningsbild
MartinF
Tar hemautomation på allvar
Inlägg: 140
Blev medlem: 04 jan 2010, 12:24
Ort: Sunne

Minnesläcka i mitt perl-skript?

Inlägg av MartinF » 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 %.

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
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:
  • 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)?
Jag har tre frågor till den samlade kompetensen på detta forum:
  • 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?
Den egentliga frågan är nog: vad ska jag leta efter och hur?
Albin polar 35,Laddomat, 3x750l, Danfoss ECL 100 & Sfinxs solfångare. Loggar och styr vedpanna, elpatron, solfångare, motorvärme och mycket annat med 1-wire, zwave, och webswitch via Domoticz.

daromer
Hemautomation - det är mer än en hobby
Inlägg: 961
Blev medlem: 23 sep 2009, 09:31
Ort: Växjö

Re: Minnesläcka i mitt perl-skript?

Inlägg av daromer » 17 feb 2012, 21:31

Det är inte så att du öppnar upp massa filer eller liknande som du aldrig stänger igen? T ex öppnar upp något för läsning och sedan inte stänger länken igen?

Användarvisningsbild
MartinF
Tar hemautomation på allvar
Inlägg: 140
Blev medlem: 04 jan 2010, 12:24
Ort: Sunne

Minnesläcka i mitt perl-skript?

Inlägg av MartinF » 17 feb 2012, 21:41

LCDn öppnar jag. Och stänger - det har jag kollat. Likaså logfilen.
Albin polar 35,Laddomat, 3x750l, Danfoss ECL 100 & Sfinxs solfångare. Loggar och styr vedpanna, elpatron, solfångare, motorvärme och mycket annat med 1-wire, zwave, och webswitch via Domoticz.

Användarvisningsbild
MartinF
Tar hemautomation på allvar
Inlägg: 140
Blev medlem: 04 jan 2010, 12:24
Ort: Sunne

Minnesläcka i mitt perl-skript?

Inlägg av MartinF » 19 feb 2012, 10:54

Med lite vanlig felsökningmetodik kan man komma långt. Efter att ha släckt ned olika delar av skriptet så fann jag en funktion i vilken jag använde en global variabel med samma namn som funktionen. Är inte insatt men förmodar att funktionen alltså anropar sig själv, igen och igen. Case closed.
Att studera minnesanvändningen var f.ö. intressant. Varje cronjob verkar starta sin egen instans av Perl så ibland kan det fortfarande bli ganska trångt i minnet. Kanske kan perl konfigureras för att slippa detta? Om inte så får jag nog bygga en egen cron, integrerad i evighetsloopen, och ha ett enda skript för allt.
Albin polar 35,Laddomat, 3x750l, Danfoss ECL 100 & Sfinxs solfångare. Loggar och styr vedpanna, elpatron, solfångare, motorvärme och mycket annat med 1-wire, zwave, och webswitch via Domoticz.

Skriv svar