Re: Apache Children Stuck on futex

Max Barry <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
On 15/11/11 01:26, Torsten Förtsch wrote:
> On Monday, 14 November 2011 04:42:16 Max Barry wrote:
>> Here is the result:
>>
>> http://pastebin.com/YDbmq84w
>>
>> This shows me:
>> * running the Apache benchmarking utility to generate lots of requests
>> * identifying a process hung in 'futex_wait' (11447)
>> * killing it with SEGV
>> * obtaining a stack trace
> 
> Thanks Max. It really seems to be a modperl problem. I think there is 
> either something fishy with modperl_tipool_putback_base() or someone 
> writes to a location that it doesn't own.
> 
> Many of your threads block in modperl_tipool_pop() waiting for an 
> interpreter to become available:
> 
>         /* block until an item becomes available */
>         modperl_tipool_wait(tipool);
> 
> In src/modules/perl/modperl_tipool.c in function 
> modperl_tipool_putback_base() you find these lines:
> 
>     if (!listp) {
>         /* XXX: Attempt to putback something that was never there */
>         modperl_tipool_unlock(tipool);
>         return;
>     }
> 
> I think the code should not return here but call abort() and dump core 
> because if it enters the if-block it tries to push back an interpreter 
> that was not taken from the pool. But why would someone call 
> modperl_tipool_putback_base if not to release an interpreter. Hence the 
> interpreter is lost. The other part of the function seems quite 
> reasonable. So, I think modperl_tipool_putback_base() is sometimes called 
> with a wrong data pointer and thus leaks interpreters.
> 
> Can you install the symbol tables for your modperl and perhaps check the 
> values of *tipool in the core? I think it is
> 
>   tipool->size == tipool->in_use == tipool->cfg->max
> 
> That would explain the behavior.
> 
> BTW, there are IMHO many points about the tipool implementation that can 
> be improved. Why do we use these lists? Wouldn't it be better to 
> allocated an array of tipool->cfg->max pointers? Or perhaps an apr_hash_t 
> in pconf?
> 
> Torsten Förtsch

Hi Torsten,

I'm afraid that installing debugging symbols is beyond me, but I have
confirmed that the problem is reproducible in a clean Ubuntu Server install.

Here is me going from a brand new Ubuntu Server install to futex_wait
hang in a few easy steps:

http://pastebin.com/ahDtAeAS

To reproduce:

1. Download an ISO of Ubuntu Server 11.10 64-bit. (I got it from a local
mirror:
http://mirror.aarnet.edu.au/pub/ubuntu/releases/11.10/ubuntu-11.10-server-amd64.iso).

2. Install as a virtual machine. (I installed inside VirtualBox
4.1.4-r74291, accepting all defaults and installing no additional packages.)

3. Install mod_perl2, configure the 'default' site to use it, and lower
MaxRequestsPerChild.

4. Smash the server with requests.

I hope this is sufficient to let you find the problem. Please let me
know if I can help further.

Max.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.