spawning (exec*/wait) shows non-constant time if memory grows
Dirk Bächle
tshortik@gmx.de
Fri Jan 24 21:47:00 GMT 2014
Hi Siddhesh,
thank you very much for your quick reply.Your infos have been very helpful.
On 24.01.2014 12:34, Siddhesh Poyarekar wrote:
> On 23 January 2014 23:50, Dirk Bächle <tshortik@gmx.de> wrote:
>> Hi there,
>>
>> I've already posted my actual question to the kernel-dev mailing list at:
>>
>> https://lkml.org/lkml/2014/1/14/632
> The link seems to be broken. It just shows a blank LKML template page.
>
>> , but got no reaction so far. So I'd really appreciate if someone
>> knowledgeable could have a look at my findings and confirm to me that the
>> problem I see is a kernel issue...and not related to the glibc itself.
>> What it's basically about is: I spawn a large number of simple child
>> processes sequentially (they don't run in parallel!) while letting the
>> memory of the parent process go up with malloc(). Over the number of spawned
>> processes the runtime for each execve/wait seems to grow, which is not what
>> I would expect.
> If the memory footprint of the parent process increases, the time
> taken to clone it will increase as well since it has to clone the
> parent address space. We don't have a light-weight exec* syscall
> similar to the Windows CreateProcess() functionality yet, where one
> would not bother cloning the parent address space only to throw it
> away in an exec. I believe there were discussions about it in the
> past on the libc-alpha mailing list.
I patched my test program and created some new numbers for
Allocating all memory in advance, in single blocks of length SIGLEN:
--------------------------------------------------------------------
time | cycles
----------------
1.94 2000
5.15 4000
15.27 8000
51.11 16000
144.59 32000
Allocating all memory in advance, at once (cycles*SIGLEN):
----------------------------------------------------------
time | cycles
----------------
1.27 2000
2.66 4000
5.27 8000
10.70 16000
21.40 32000
So, the memory fragmentation seems to be the key when copying the parent
address space. Can you give me a pointer to where this happens in the
source code? I'd like to have a look at this.
I also tried to find some older discussions in the glibc-alpha list, but
my search so far didn't show any good results. Can someone give an exact
link or a few keywords to search for? That'd be awesome...
Regards,
Dirk
More information about the Libc-help
mailing list