http://qs1969.pair.com?node_id=670431

BlairHippo has asked for the wisdom of the Perl Monks concerning the following question:

I'm writing what should be a simple web-load-testing script using ithreads, but I'm getting glibc seg faults of the "double free or corruption (fasttop)" variety (complete error output behind tag below). Though experimentation, I've determined that the troublesome bit is the line calling LWP::UserAgent -> request(). The test code isolating the problem is:

#!/usr/bin/perl -w use HTTP::Request; use LWP::UserAgent; use threads; my $TEST_URL = "http://www.blairhippo.com/"; for (my $i = 0; $i < 500; $i++) { my $thread = threads -> create ('execute_request', $TEST_URL); $thread -> detach(); } print "If you can read this line, I have run to completion and failed +to fail. Which makes my success a failure. I'm so emo.\n"; sub execute_request { my $url = shift; my $request = HTTP::Request -> new ('GET', $url); my $agent = LWP::UserAgent -> new(); my $response = $agent -> request($request); }

(Note: The actual code doesn't detach the threads, but I get this error whether I'm detaching or joining them back in, so I'm detaching them for the sake of simplicity.)

I have very limited control over my environment; I'm using Perl 5.8.8 and that's unlikely to change, though I ought to be able to update individual modules. A workaround that doesn't stress my processor too badly (eg, nothing fork-based) would be more than welcome. The important functionality here is my ability to generate concurrent HTTP requests (and time how long they take).

My thanks in advance for any help or insight anybody is able to offer.

Edit: I just realized I didn't include a relevant detail. It doesn't seg fault right out of the gate; it runs a while (teasing me with the possibility that maybe this time I fixed it) before crashing. Dunno if that changes anybody's evaluation, but it's worth mentioning.

*** glibc detected *** /usr/bin/perl: double free or corruption (fastt +op): 0x00002aaacc1b8db0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x2b38c83bb21d] /lib64/libc.so.6(cfree+0x76)[0x2b38c83bcf76] /usr/bin/perl(Perl_newCONSTSUB+0x144)[0x44e574] /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so(boot_IO+0 +x34e)[0x2aaaaaaaccee] /usr/bin/perl(Perl_pp_entersub+0x363)[0x486bb3] /usr/bin/perl(Perl_runops_debug+0x11e)[0x468f8e] /usr/bin/perl(Perl_call_sv+0x77d)[0x42492d] /usr/bin/perl(Perl_call_list+0x30c)[0x424e7c] /usr/bin/perl(Perl_newATTRSUB+0xe82)[0x458042] /usr/bin/perl(Perl_utilize+0x24a)[0x45658a] /usr/bin/perl(Perl_yyparse+0x247e)[0x449bde] /usr/bin/perl[0x4b4de0] /usr/bin/perl(Perl_pp_require+0xd49)[0x4b6fb9] /usr/bin/perl(Perl_runops_debug+0x11e)[0x468f8e] /usr/bin/perl(Perl_call_sv+0x77d)[0x42492d] /usr/bin/perl(Perl_call_list+0x30c)[0x424e7c] /usr/bin/perl(Perl_newATTRSUB+0xe82)[0x458042] /usr/bin/perl(Perl_utilize+0x24a)[0x45658a] /usr/bin/perl(Perl_yyparse+0x247e)[0x449bde] /usr/bin/perl[0x4b4de0] /usr/bin/perl(Perl_pp_require+0xd49)[0x4b6fb9] /usr/bin/perl(Perl_runops_debug+0x11e)[0x468f8e] /usr/bin/perl(Perl_call_sv+0x77d)[0x42492d] /usr/bin/perl(Perl_call_list+0x30c)[0x424e7c] /usr/bin/perl(Perl_newATTRSUB+0xe82)[0x458042] /usr/bin/perl(Perl_utilize+0x24a)[0x45658a] /usr/bin/perl(Perl_yyparse+0x247e)[0x449bde] /usr/bin/perl[0x4b4de0] /usr/bin/perl(Perl_pp_require+0xd49)[0x4b6fb9] /usr/bin/perl(Perl_runops_debug+0x11e)[0x468f8e] /usr/bin/perl(Perl_call_sv+0x77d)[0x42492d] /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/threads/threads.so +[0x2b38c869c07e] /lib64/libpthread.so.0[0x2b38c8138020] /lib64/libc.so.6(clone+0x6d)[0x2b38c8411f8d] ======= Memory map: ======== 00400000-00537000 r-xp 00000000 08:01 2424843 + /usr/bin/perl 00736000-0073d000 rw-p 00136000 08:01 2424843 + /usr/bin/perl 0073d000-023d4000 rw-p 0073d000 00:00 0 + [heap] 40000000-40001000 ---p 40000000 00:00 0 40001000-40801000 rw-p 40001000 00:00 0 40801000-40802000 ---p 40801000 00:00 0 40802000-41002000 rw-p 40802000 00:00 0 41002000-41003000 ---p 41002000 00:00 0 41003000-41803000 rw-p 41003000 00:00 0 41803000-41804000 ---p 41803000 00:00 0 41804000-42004000 rw-p 41804000 00:00 0 42004000-42005000 ---p 42004000 00:00 0 42005000-42805000 rw-p 42005000 00:00 0 42805000-42806000 ---p 42805000 00:00 0 42806000-43006000 rw-p 42806000 00:00 0 43006000-43007000 ---p 43006000 00:00 0 43007000-43807000 rw-p 43007000 00:00 0 43807000-43808000 ---p 43807000 00:00 0 43808000-44008000 rw-p 43808000 00:00 0 44008000-44009000 ---p 44008000 00:00 0 44009000-44809000 rw-p 44009000 00:00 0 44809000-4480a000 ---p 44809000 00:00 0 4480a000-4500a000 rw-p 4480a000 00:00 0 4500a000-4500b000 ---p 4500a000 00:00 0 4500b000-4580b000 rw-p 4500b000 00:00 0 4580b000-4580c000 ---p 4580b000 00:00 0 4580c000-4600c000 rw-p 4580c000 00:00 0 4600c000-4600d000 ---p 4600c000 00:00 0 4600d000-4680d000 rw-p 4600d000 00:00 0 4680d000-4680e000 ---p 4680d000 00:00 0 4680e000-4700e000 rw-p 4680e000 00:00 0 4700e000-4700f000 ---p 4700e000 00:00 0 4700f000-4780f000 rw-p 4700f000 00:00 0 4780f000-47810000 ---p 4780f000 00:00 0 47810000-48010000 rw-p 47810000 00:00 0 48010000-48011000 ---p 48010000 00:00 0 48011000-48811000 rw-p 48011000 00:00 0 48811000-48812000 ---p 48811000 00:00 0 48812000-49012000 rw-p 48812000 00:00 0 49012000-49013000 ---p 49012000 00:00 0 49013000-49813000 rw-p 49013000 00:00 0 49813000-49814000 ---p 49813000 00:00 0 49814000-4a014000 rw-p 49814000 00:00 0 4a014000-4a015000 ---p 4a014000 00:00 0 4a015000-4a815000 rw-p 4a015000 00:00 0 4a815000-4a816000 ---p 4a815000 00:00 0 4a816000-4b016000 rw-p 4a816000 00:00 0 4b016000-4b017000 ---p 4b016000 00:00 0 4b017000-4b817000 rw-p 4b017000 00:00 0 4b817000-4b818000 ---p 4b817000 00:00 0 4b818000-4c018000 rw-p 4b818000 00:00 0 4e81d000-4e81e000 ---p 4e81d000 00:00 0 4e81e000-4f01e000 rw-p 4e81e000 00:00 0 51823000-51824000 ---p 51823000 00:00 0 51824000-52024000 rw-p 51824000 00:00 0 52825000-52826000 ---p 52825000 00:00 0 52826000-53026000 rw-p 52826000 00:00 0 2aaaaaaab000-2aaaaaaaf000 r-xp 00000000 08:01 2883850 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so 2aaaaaaaf000-2aaaaacae000 ---p 00004000 08:01 2883850 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so 2aaaaacae000-2aaaaacb0000 rw-p 00003000 08:01 2883850 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so 2aaaaacc5000-2aaaaaccf000 r-xp 00000000 08:01 376857 + /lib64/libnss_files-2.6.1.so 2aaaaaccf000-2aaaaaece000 ---p 0000a000 08:01 376857 + /lib64/libnss_files-2.6.1.so 2aaaaaece000-2aaaaaed0000 rw-p 00009000 08:01 376857 + /lib64/libnss_files-2.6.1.so 2aaaaaed0000-2aaaaaf05000 r--s 00000000 08:01 427755 + /var/run/nscd/dbJBSLjV (deleted) 2aaaaaf06000-2aaaaaf10000 r-xp 00000000 08:01 2885090 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/List/Util/Util +.so 2aaaaaf10000-2aaaab10f000 ---p 0000a000 08:01 2885090 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/List/Util/Util +.so 2aaaab10f000-2aaaab110000 r--p 00009000 08:01 2885090 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/List/Util/Util +.so 2aaaab110000-2aaaab111000 rw-p 0000a000 08:01 2885090 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/List/Util/Util +.so 2aaaab111000-2aaaab116000 r-xp 00000000 08:01 2883847 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/File/Glob/Glob +.so 2aaaab116000-2aaaab315000 ---p 00005000 08:01 2883847 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/File/Glob/Glob +.so 2aaaab315000-2aaaab317000 rw-p 00004000 08:01 2883847 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/File/Glob/Glob +.so 2aaaab317000-2aaaab31a000 r-xp 00000000 08:01 2883843 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Fcntl/Fcntl.so 2aaaab31a000-2aaaab519000 ---p 00003000 08:01 2883843 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Fcntl/Fcntl.so 2aaaab519000-2aaaab51b000 rw-p 00002000 08:01 2883843 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Fcntl/Fcntl.so 2aaaab51b000-2aaaab528000 r-xp 00000000 08:01 376917 + /lib64/libgcc_s.so.1 2aaaab528000-2aaaab727000 ---p 0000d000 08:01 376917 + /lib64/libgcc_s.so.1 2aaaab727000-2aaaab729000 rw-p 0000c000 08:01 376917 + /lib64/libgcc_s.so.1 2aaaac000000-2aaaad36a000 rw-p 2aaaac000000 00:00 0 2aaaad36a000-2aaab0000000 ---p 2aaaad36a000 00:00 0 2aaab0000000-2aaab1407000 rw-p 2aaab0000000 00:00 0 2aaab1407000-2aaab4000000 ---p 2aaab1407000 00:00 0 2aaab4000000-2aaab5248000 rw-p 2aaab4000000 00:00 0 2aaab5248000-2aaab8000000 ---p 2aaab5248000 00:00 0 2aaab8000000-2aaab91dd000 rw-p 2aaab8000000 00:00 0 2aaab91dd000-2aaabc000000 ---p 2aaab91dd000 00:00 0 2aaabc000000-2aaabc005000 r-xp 00000000 08:01 2883862 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Socket/Socket. +so 2aaabc005000-2aaabc204000 ---p 00005000 08:01 2883862 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Socket/Socket. +so 2aaabc204000-2aaabc206000 rw-p 00004000 08:01 2883862 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/Socket/Socket. +so 2aaac0000000-2aaac13a8000 rw-p 2aaac0000000 00:00 0 2aaac13a8000-2aaac4000000 ---p 2aaac13a8000 00:00 0 2aaac4000000-2aaac5112000 rw-p 2aaac4000000 00:00 0 2aaac5112000-2aaac8000000 ---p 2aaac5112000 00:00 0 2aaac8000000-2aaac90fb000 rw-p 2aaac8000000 00:00 0 2aaac90fb000-2aaacc000000 ---p 2aaac90fb000 00:00 0 2aaacc000000-2aaacd2da000 rw-p 2aaacc000000 00:00 0 2aaacd2da000-2aaad0000000 ---p 2aaacd2da000 00:00 0 2aaad0000000-2aaad10c8000 rw-p 2aaad0000000 00:00 0 2aaad10c8000-2aaad4000000 ---p 2aaad10c8000 00:00 0 2aaad4000000-2aaad4027000 r-xp 00000000 08:01 378333 + /usr/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Comp +ress/Raw/Zlib/Zlib.so 2aaad4027000-2aaad4227000 ---p 00027000 08:01 378333 + /usr/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Comp +ress/Raw/Zlib/Zlib.so 2aaad4227000-2aaad4228000 r--p 00027000 08:01 378333 + /usr/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Comp +ress/Raw/Zlib/Zlib.so 2aaad4228000-2aaad4229000 rw-p 00028000 08:01 378333 + /usr/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Comp +ress/Raw/Zlib/Zlib.so 2aaad8000000-2aaad8f31000 rw-p 2aaad8000000 00:00 0 2aaad8f31000-2aaadc000000 ---p 2aaad8f31000 00:00 0 2aaadc000000-2aaadcfa7000 rw-p 2aaadc000000 00:00 0 2aaadcfa7000-2aaae0000000 ---p 2aaadcfa7000 00:00 0 2aaae0000000-2aaae000b000 r-xp 00000000 08:01 280473 + /usr/lib/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/HT +ML/Parser/Parser.so 2aaae000b000-2aaae020b000 ---p 0000b000 08:01 280473 + /usr/lib/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/HT +ML/Parser/Parser.so 2aaae020b000-2aaae020d000 rw-p 0000b000 08:01 280473 + /usr/lib/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/HT +ML/Parser/Parser.so 2aaae4000000-2aaae4ee0000 rw-p 2aaae4000000 00:00 0 2aaae4ee0000-2aaae8000000 ---p 2aaae4ee0000 00:00 0 2b38c7884000-2b38c78a0000 r-xp 00000000 08:01 378304 + /lib64/ld-2.6.1.so 2b38c78a0000-2b38c78a1000 rw-p 2b38c78a0000 00:00 0 2b38c78a1000-2b38c78a2000 r--p 00000000 08:01 2851489 + /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION 2b38c78a2000-2b38c78a9000 r--s 00000000 08:01 2854279 + /usr/lib64/gconv/gconv-modules.cache 2b38c78a9000-2b38c78aa000 r--p 00000000 08:01 2853700 + /usr/lib/locale/en_US.utf8/LC_MEASUREMENT 2b38c78aa000-2b38c78ab000 r--p 00000000 08:01 2853699 + /usr/lib/locale/en_US.utf8/LC_TELEPHONE 2b38c78ab000-2b38c78ac000 r--p 00000000 08:01 2851488 + /usr/lib/locale/en_US.utf8/LC_ADDRESS 2b38c78ac000-2b38c78ad000 r--p 00000000 08:01 2853814 + /usr/lib/locale/en_US.utf8/LC_NAME 2b38c78ad000-2b38c78ae000 r--p 00000000 08:01 2853739 + /usr/lib/locale/en_US.utf8/LC_PAPER 2b38c78ae000-2b38c78af000 r--p 00000000 08:01 2853921 + /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES 2b38c78af000-2b38c78b0000 r--p 00000000 08:01 2851491 + /usr/lib/locale/en_US.utf8/LC_MONETARY 2b38c78b6000-2b38c78b7000 rw-p 2b38c78b6000 00:00 0 2b38c78b7000-2b38c7997000 r--p 00000000 08:01 2853947 + /usr/lib/locale/en_US.utf8/LC_COLLATE 2b38c7997000-2b38c7998000 r--p 00000000 08:01 2851492 + /usr/lib/locale/en_US.utf8/LC_TIME 2b38c7998000-2b38c7999000 r--p 00000000 08:01 2853928 + /usr/lib/locale/en_US.utf8/LC_NUMERIC 2b38c7999000-2b38c79d8000 r--p 00000000 08:01 2853946 + /usr/lib/locale/en_US.utf8/LC_CTYPE 2b38c79d8000-2b38c79f9000 rw-p 2b38c79d8000 00:00 0 2b38c7a9f000-2b38c7aa1000 rw-p 0001b000 08:01 378304 + /lib64/ld-2.6.1.so 2b38c7aa1000-2b38c7af3000 r-xp 00000000 08:01 376848 + /lib64/libm-2.6.1.so 2b38c7af3000-2b38c7cf2000 ---p 00052000 08:01 376848 + /lib64/libm-2.6.1.so 2b38c7cf2000-2b38c7cf4000 rw-p 00051000 08:01 376848 + /lib64/libm-2.6.1.so 2b38c7cf4000-2b38c7cf6000 r-xp 00000000 08:01 376846 + /lib64/libdl-2.6.1.so 2b38c7cf6000-2b38c7ef6000 ---p 00002000 08:01 376846 + /lib64/libdl-2.6.1.so 2b38c7ef6000-2b38c7ef8000 rw-p 00002000 08:01 376846 + /lib64/libdl-2.6.1.so 2b38c7ef8000-2b38c7f00000 r-xp 00000000 08:01 376844 + /lib64/libcrypt-2.6.1.so 2b38c7f00000-2b38c8100000 ---p 00008000 08:01 376844 + /lib64/libcrypt-2.6.1.so 2b38c8100000-2b38c8103000 rw-p 00008000 08:01 376844 + /lib64/libcrypt-2.6.1.so 2b38c8103000-2b38c8132000 rw-p 2b38c8103000 00:00 0 2b38c8132000-2b38c8147000 r-xp 00000000 08:01 376866 + /lib64/libpthread-2.6.1.so 2b38c8147000-2b38c8347000 ---p 00015000 08:01 376866 + /lib64/libpthread-2.6.1.so 2b38c8347000-2b38c8349000 rw-p 00015000 08:01 376866 + /lib64/libpthread-2.6.1.so 2b38c8349000-2b38c834d000 rw-p 2b38c8349000 00:00 0 2b38c834d000-2b38c8489000 r-xp 00000000 08:01 376840 + /lib64/libc-2.6.1.so 2b38c8489000-2b38c8688000 ---p 0013c000 08:01 376840 + /lib64/libc-2.6.1.so 2b38c8688000-2b38c868b000 r--p 0013b000 08:01 376840 + /lib64/libc-2.6.1.so 2b38c868b000-2b38c868d000 rw-p 0013e000 08:01 376840 + /lib64/libc-2.6.1.so 2b38c868d000-2b38c8694000 rw-p 2b38c868d000 00:00 0 2b38c8694000-2b38c869e000 r-xp 00000000 08:01 196730 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/threads/thread +s.so 2b38c869e000-2b38c889d000 ---p 0000a000 08:01 196730 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/threads/thread +s.so 2b38c889d000-2b38c889e000 r--p 00009000 08:01 196730 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/threads/thread +s.so 2b38c889e000-2b38c889f000 rw-p 0000a000 08:01 196730 + /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi/auto/threads/thread +s.so 7fffe3211000-7fffe3226000 rw-p 7fffe3211000 00:00 0 + [stack] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 + [vdso] Aborted