Почему эта Perl-программа с подключением DBI к серверу MS SQL через ODBC утечка памяти? - PullRequest
2 голосов
/ 10 марта 2011

У меня есть несколько Perl-программ, которые я поддерживаю на работе и которые годами работали на разных системах (WinXP, Win 2003, Linux). Недавно мы развернули их для нового клиента на 64-битной Windows 2008 Server под управлением SQL Server 2008. Код работал некоторое время, а затем остановился. Посмотрев на это, я увидел, что у меня возникают ошибки нехватки памяти. Пытаясь отследить утечку, я придумал следующую программу-пример, которая за одну-две минуты требует около 40 мг памяти и продолжает расти. Есть идеи?

use strict;
use warnings;
use DBI qw(:sql_types);

my $dbh = DBI->connect("DBI:ODBC:sample_db", "user", "pass");
my $query = $dbh->prepare("SELECT TOP 1 ID FROM TABLE");

while (1)
{
    $query->execute();
    while (my $row = $query->fetchrow_hashref() ){
        print  $row->{ID} . "\n";
    }
    $query->finish();
}

Я использую клубничный Perl 5.12.2, но смог воспроизвести это на этой коробке и в сборке 5.10.

C:>perl -V
Summary of my perl5 (revision 5 version 12 subversion 2) configuration:

  Platform:
    osname=MSWin32, osvers=5.1, archname=MSWin32-x86-multi-thread
    uname='Win32 strawberryperl 5.12.2.0 #1 Fri Nov  5 05:17:27 2010 i386'
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags =' -s -O2 -DWIN32 -DHAVE_DES_FCRYPT  -DUSE_SITECUSTOMIZE -
DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -mms-bitfields -
DPERL_MSVC`enter code here`RT_READFIX',
    optimize='-s -O2',
    cppflags='-DWIN32'
    ccversion='', gccversion='4.4.3', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='long long', lseek
size=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='g++', ldflags ='-s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\li
b"'
    libpth=C:\strawberry\c\lib C:\strawberry\c\i686-w64-mingw32\lib
    libs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32
 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion
 -lodbc32 -lodbccp32 -lcomctl32
    perllibs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladva
pi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lver
sion -lodbc32 -lodbccp32 -lcomctl32
    libc=, so=dll, useshrplib=true, libperl=libperl512.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\st
rawberry\c\lib"'


Characteristics of this binary (from libperl):
  Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
                        PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS
                        PERL_MALLOC_WRAP PL_OP_SLAB_ALLOC USE_ITHREADS
                        USE_LARGE_FILES USE_PERLIO USE_PERL_ATOF
                        USE_SITECUSTOMIZE
  Built under MSWin32
  Compiled at Nov  5 2010 08:39:08
  @INC:
    C:/strawberry/perl/site/lib
    C:/strawberry/perl/vendor/lib
    C:/strawberry/perl/lib
    .

Ответы [ 2 ]

1 голос
/ 11 марта 2011

В 1.24_2 была обнаружена утечка, которая не была исправлена ​​до 1.26_3. Из файла изменений:

= head2 Изменения в DBD :: ODBC 1.26_3 18 ноября 2010 г.

Исправлено: rt 63108. Изменение привязки столбца в 1.24_2 не было завершено и вызывает отскок связанных столбцов при каждом выполнении трата времени и утечка памяти. Найдено, диагностировано и предложено исправить Стив Бентли.

Всегда стоит проверять журнал изменений для модулей, которые вы используете, когда происходит что-то подобное.

1 голос
/ 10 марта 2011

Оказывается, проблемы были с модулем DBD :: ODBC.У меня была немного устаревшая версия (1.26, я думаю, забыл принять это к сведению).Использование cpan для обновления до 1.29 решило проблему.

...