This is due entirely to a glibc bug in versions of glibc before 2.3. It had horrible performance when dealing with lots of small memory deallocations, and it will kill perl's performance in some cases. The easy solution is to upgrade your glibc if you can, which doesn't require any action for perl as it's a dynamically linked library, or build perl with perl's malloc if you can't.
Comment on Re: Re: Garbage Collection on Hash delete