From: Ray Fucillo <fucillo@intersystems.com>
To: linux-kernel@vger.kernel.org
Subject: process creation time increases linearly with shmem
Date: Wed, 24 Aug 2005 14:43:29 -0400 [thread overview]
Message-ID: <430CBFD1.7020101@intersystems.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 334 bytes --]
I am seeing process creation time increase linearly with the size of the
shared memory segment that the parent touches. The attached forktest.c
is a very simple user program that illustrates this behavior, which I
have tested on various kernel versions from 2.4 through 2.6. Is this a
known issue, and is it solvable?
TIA,
Ray
[-- Attachment #2: forktest.c --]
[-- Type: text/plain, Size: 3803 bytes --]
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#define MAXJOBS 50
#define MAXMALLOC 1024
#define USESIGCHLDHND
/* USESIGCHLDHND feature code changes how the parent waits
for the children. When this feature code is on we define
a signal handler for SIGCHLD and call waitpid to clean up
the child process. If this feature code is off, we wait
until all children are forked and then loop through the
array of child pids and call waitpid() on each. The
purpose of this feature code was to see if there is any
difference in timing based on cleaning up zombies faster.
Test have shown no appreciable difference. */
/* Return a floating point number of seconds since the start
time in the timeval structure pointed to by starttv */
float elapsedtime(struct timeval *starttv) {
struct timeval currenttime;
gettimeofday(¤ttime,NULL);
return ((currenttime.tv_sec - starttv->tv_sec) +
((float)(currenttime.tv_usec - starttv->tv_usec)/1000000));
}
#ifdef USESIGCHLDHND
int childexitcnt = 0;
void sigchldhnd(int signum) {
if (waitpid(-1,NULL,WNOHANG)) ++childexitcnt;
return;
}
#endif
int main(void) {
pid_t childpid[MAXJOBS];
int x,i;
int childcnt = 0;
float endfork, endwait;
struct shmid_ds myshmid_ds;
unsigned int mb;
int myshmid;
key_t mykey = 0xf00df00d;
char *mymem = 0;
struct timeval starttime;
#ifdef USESIGCHLDHND
struct sigaction sa;
sa.sa_handler = sigchldhnd;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
printf("sigaction() failed, errno %d - exiting\n",errno);
exit(1);
}
#endif
printf("\nNumber of jobs to fork (max %d): ",MAXJOBS);
scanf("%d",&x);
if ((x < 1) || (x > MAXJOBS)) {
printf("\ninvalid input - exiting\n");
exit(1);
}
printf("\nNumber of MB to allocate (0-%d): ",MAXMALLOC);
scanf("%d",&mb);
if (mb > MAXMALLOC) {
printf("\ninvalid input - exiting\n");
exit(1);
}
/* allocate and initialize shared memory if number
of MB is not zero */
if (mb) {
myshmid = shmget(mykey,mb*1024*1024,IPC_CREAT|0777);
if (myshmid == -1) {
printf("\nshmget() failed, errno %d. - exiting\n",errno);
exit(1);
}
mymem = (char *) shmat(myshmid,0,0);
if (mymem == (char *) -1) {
printf("\nshmat() failed, errno %d. - exiting\n",errno);
exit(1);
}
if (shmctl(myshmid,IPC_STAT,&myshmid_ds)) {
printf("\nshmctl() failed, errno %d. - exiting\n",errno);
exit(1);
}
/* write a pattern in the new shmem segment*/
for (i=0; i < (mb*1024*1024); i+=32) mymem[i]='R';
}
printf("\nStarting %d jobs. time:0.0", x);
fflush(stdout);
gettimeofday(&starttime,NULL);
for (i=0; i<x; i++) {
childpid[i] = fork();
if (!childpid[i]) {
/* child process */
printf("\n - Child %d time:%f",i,elapsedtime(&starttime));
exit(1);
} else if (childpid[i] == -1) {
/* failure */
printf("\nfork failed, errno = %d");
} else childcnt++;
}
endfork = elapsedtime(&starttime);
#ifndef USESIGCHLDHND
for (i=0; i<x; i++) waitpid(childpid[i],0,0);
#else
while (childexitcnt < childcnt) {
if (waitpid(-1,NULL,0)) ++childexitcnt;
}
#endif
endwait = elapsedtime(&starttime);
printf("\nTime to fork all processes in seconds: %f", endfork);
printf("\nTime for all processes to complete: %f\n", endwait);
/* kill shmem segment */
if ((mb) && (shmctl(myshmid,IPC_RMID,&myshmid_ds))) {
printf("\nshmctl() failed, errno %d. - exiting\n",errno);
exit(1);
}
}
next reply other threads:[~2005-08-24 18:43 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-24 18:43 Ray Fucillo [this message]
2005-08-25 0:14 ` process creation time increases linearly with shmem Nick Piggin
2005-08-25 13:07 ` Ray Fucillo
2005-08-25 13:13 ` Andi Kleen
2005-08-25 14:28 ` Nick Piggin
2005-08-25 17:31 ` Rik van Riel
2005-08-26 1:26 ` Nick Piggin
2005-08-26 1:50 ` Rik van Riel
2005-08-26 3:56 ` Linus Torvalds
2005-08-26 11:49 ` Hugh Dickins
2005-08-26 14:26 ` Nick Piggin
2005-08-26 17:00 ` Ray Fucillo
2005-08-26 17:53 ` Rik van Riel
2005-08-26 18:20 ` Ross Biro
2005-08-26 18:56 ` Hugh Dickins
[not found] ` <8783be660508260915524e2b1e@mail.gmail.com>
2005-08-26 16:38 ` Hugh Dickins
2005-08-26 16:43 ` Ross Biro
2005-08-26 18:07 ` Linus Torvalds
2005-08-26 18:41 ` Hugh Dickins
2005-08-26 22:55 ` Linus Torvalds
2005-08-26 23:10 ` Rik van Riel
2005-08-26 23:23 ` Linus Torvalds
2005-08-27 15:05 ` Nick Piggin
2005-08-28 4:26 ` Hugh Dickins
2005-08-28 6:49 ` Nick Piggin
2005-08-29 23:33 ` Ray Fucillo
2005-08-30 0:29 ` Nick Piggin
2005-08-30 1:03 ` Linus Torvalds
2005-08-30 0:34 ` Linus Torvalds
2005-08-25 14:05 Parag Warudkar
2005-08-25 14:22 ` Andi Kleen
2005-08-25 14:35 ` Nick Piggin
2005-08-25 14:47 ` Parag Warudkar
2005-08-25 15:56 ` Andi Kleen
2005-12-14 14:07 Brice Oliver
2005-12-14 16:21 ` Hugh Dickins
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=430CBFD1.7020101@intersystems.com \
--to=fucillo@intersystems.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).