Toon posts:

[Perl] pipe consumeert het hele geheugen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Om een AIX machine te kunnen backuppen naar een Freecom FSG-3 bakkie heb ik een heel simpel perl scriptje geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl
$|++;   #autoflush on

use IO::Socket;
$socket = IO::Socket::INET->new(PeerAddr => '192.168.1.1', PeerPort => 21, Proto
   => "tcp",  Type  => SOCK_STREAM) or die "Couldn't connect: $@\n";
$answer = <$socket>; #read the welcome

print $socket "USER backupuser\n";
$answer = <$socket>; #read reply, assume OK

print $socket "PASS backuppass\n";
$answer = <$socket>; #read reply, assume OK

print $socket "PASV\n";
$answer = <$socket>;
$answer1=$answer;
$answer2=$answer;
$answer1 =~ s/.*,([0-9]*),([0-9]*)\)/\1/;
$answer2 =~ s/.*,([0-9]*),([0-9]*)\)/\2/;
$dataport=$answer1*256+$answer2;

print $socket "STOR backup.tar\n";

$socket2 = IO::Socket::INET->new(PeerAddr => '192.168.1.1', PeerPort => $dataport,
   Proto    => "tcp", Type     => SOCK_STREAM) or die "Couldn't connect: $@\n";

open(PS_F, "/usr/bin/tar -cvf - / |");
while (<PS_F>) {
        print $socket2 $_;
}
close(PS_F);

$answer = <$socket>;
print $answer;

print $socket "QUIT\n";
close($socket);


Om een of andere reden werkt dit scriptje prima op een SuSE 9.3 bak met Perl 5.8.6, maar op een AIX systeem met perl 5.0.6 verschijnt er na ongeveer 1.1GB iedere keer Out of memory! en wordt het perl script afgebroken.

Wat ik onder andere al heb geprobeerd:
• In bovenstaand script wordt het tar commando door perl uitgevoerd. Ook tar -cvf - | ./backup.pl en dan lezen van de STDIN levert hetzelfde resultaat op.
• met ps aux kijken of er inderdaad een proces veel geheugen verbruikt. Dit lijkt niet het geval, of het wordt niet getoond. (Het kan best zijn dat pipe geheugen onder "shared" valt, en daarom niet in ps getoond wordt)
• de tar output pipen naar rsh. Dat werkt, maar dan komt alles uit op een linux server, en niet op de FSG-3.
• de tar output pipen naar /bin/ftp. Dat werkt, maar in ascii mode. Het is niet mogelijk ftp in binary mode te krijgen wanneer er gepiped wordt.
• er is geen compiler (cc/gcc/xlc/iets wat ./configure kent) beschikbaar waardoor ik hetzelfde in C zou kunnen doen.

Is er een methode om dit met perl op te lossen? Of een andere creatieve oplossing?

Perl -V op AIX:
code:
1
2
3
4
5
6
7
8
9
10
Summary of my perl5 (revision 5.0 version 6 subversion 0) configuration:
  Platform:
    osname=aix, osvers=5.0.0.0, archname=aix
    uname='aix shaq 1 5 006044854c00 '
    config_args='-de'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=undef d_sfio=undef uselargefiles=define
    use64bitint=undef use64bitall=undef uselongdouble=undef usesocks=undef
...


Perl -V op SuSE 9.3:
code:
1
2
3
4
5
6
7
8
9
10
11
Summary of my perl5 (revision 5 version 8 subversion 6) configuration:
  Platform:
    osname=linux, osvers=2.6.9, archname=i586-linux-thread-multi
    uname='linux g226 2.6.9 #1 smp tue jun 28 14:58:56 utc 2005 i686 i686 i386 gnulinux '
    config_args='-ds -e -Dprefix=/usr -Dvendorprefix=/usr -Dinstallusrbinperl -Dusethreads -Di_db -Di_dbm -Di_ndbm -Di_gdbm -Duseshrplib=true -Doptimize=-O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -g -Wall -pipe'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12-02 11:14
Ik vind dit wel dubieus voor binary data:
Perl:
29
30
31
while (<PS_F>) {
        print $socket2 $_;
}

Misschien kun je dit vervangen door iets als:
Perl:
1
print $socket2 $_ while(read PS_F, $_, 1024);

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Verwijderd schreef op woensdag 01 november 2006 @ 10:39:
Om een AIX machine te kunnen backuppen naar een Freecom FSG-3 bakkie heb ik een heel simpel perl scriptje geschreven:
code:
1
2
3
4
5
open(PS_F, "/usr/bin/tar -cvf - / |");
while (<PS_F>) {
        print $socket2 $_;
}
close(PS_F);
Je leest een binary bestaand in een keer in, en gooit het vervolgens in een keer door de pipe ? Ik kan me voorstellen dat je OS dat niet leuk vind. Ik zou de read onderverdelen in blokken van 16 kb oid, meer heeft toch geen zin.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12-02 11:14
Hij leest regel-voor-regel. In principe zou je zeggen dat regeleindes in random data soms wel eens voor moeten komen, maar in een ongunstig geval kan je geheugen natuurlijk opraken. (Als 'ie zou comprimeren zou de kans op regelmatige regeleindes een stuk groter worden.)

Verwijderd

Topicstarter
igmar schreef op donderdag 02 november 2006 @ 10:04:
[...]
Je leest een binary bestaand in een keer in, en gooit het vervolgens in een keer door de pipe ? Ik kan me voorstellen dat je OS dat niet leuk vind. Ik zou de read onderverdelen in blokken van 16 kb oid, meer heeft toch geen zin.
Nouja... op linux is het geen probleem en kan ik er prima complete DVD's mee overgooien. Dus ik had gedacht dat dat op AIX ook wel zou lukken. En als het goed is, gaat het dus juist niet in 1 keer maar regel voor regel, of (wanneer de buffer vol is of geflusht wordt) per block.
Soultaker schreef op woensdag 01 november 2006 @ 16:12:
Ik vind dit wel dubieus voor binary data:
[code=perl,29]while (<PS_F>) {
print $socket2 $_;
}
Dubieus is het inderdaad. Maar op Linux werkt het, en zijn de binaries intact (md5 checked).
Misschien kun je dit vervangen door iets als:
Perl:
1
print $socket2 $_ while(read PS_F, $_, 1024);

[/quote]
En dit is dé oplossing voor op AIX. Op dit moment staat m'n scriptje het systeem te backuppen, en zijn we al op de 3.2GB, terwijl ik eerst echt niet verder kwam dan 1.1GB.

Heel erg bedankt voor de suggestie.

[ Voor 5% gewijzigd door Verwijderd op 03-11-2006 09:39 ]