Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Oct 2011 17:02:00 +0400
From:      Alexandr Matveev <timon@timon.net.nz>
To:        hackers@freebsd.org
Subject:   sigprocmask and fork
Message-ID:  <4EA804C8.2030900@timon.net.nz>

next in thread | raw e-mail | index | archive | help
Hi,

We are using FreeBSD 8.2 on our servers for high load projects.
When I was preparing system for production I saw strange (as I think) 
behavior,
that leads to increased load on servers.

If I made truss on httpd (apache22) process, I saw too much sigprocmask 
syscalls:

24822: sigprocmask(SIG_BLOCK,0x0,0x0)            = 0 (0x0)
24822: sigprocmask(SIG_BLOCK,0x0,0x0)            = 0 (0x0)
24822: sigprocmask(SIG_BLOCK,0x0,0x0)            = 0 (0x0)
24822: sigprocmask(SIG_BLOCK,0x0,0x0)            = 0 (0x0)
24822: sigprocmask(SIG_BLOCK,0x0,0x0)            = 0 (0x0)
... too many lines ...

and

24822:
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|S 

IGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
24822: sigprocmask(SIG_SETMASK,0x0,0x0)          = 0 (0x0)
24822:
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|S 

IGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
24822: sigprocmask(SIG_SETMASK,0x0,0x0)          = 0 (0x0)
24822:
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|S 

IGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
24822: sigprocmask(SIG_SETMASK,0x0,0x0)          = 0 (0x0)
... too many lines ...


but apache, and modules loaded from it do not call this directly.
I was trying to use DTRACE for getting information about syscalls, and I
got same result.

I wrote a tiny sample

code:
$ cat sigproc_test.c
#include<unistd.h>

main()
{
         fork();
}
I ran it on FreeBSD with different compilers:
$ cc sigproc_test.c -o sigproc_test
$ truss ./sigproc_test 2>&1 | grep sigprocmask | wc -l
        8
$ g++ sigproc_test.c -o sigproc_test
$ truss ./sigproc_test 2>&1 | grep sigprocmask | wc -l
       20

Is it normal to make so many sigprocmask syscalls for such simple program?
For example, there is no sigprocmask syscalls when I run it on Debian 
Linux.

Another sample. Here we have sigprocmask syscalls on Linux too, but 
FreeBSD makes this syscall significantly more often:
$ cat test.c
#include<unistd.h>

main()
{
     int i;
     sleep(2);
     for (i = 0; i<3; i++) {
         int pid = fork();
         if (!pid) {
             sleep(0.5);
             return 0;
         }
         sleep(2);
     }
}

FreeBSD 8.2:
# truss -f ./test
... SKIPPED ...
48666: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48666: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48666: __sysctl(0xbfbfe6a4,0x2,0x28192700,0xbfbfe6ac,0x0,0x0) = 0 (0x0)
48666: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48666: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48666: nanosleep({2.000000000 }) = 0 (0x0)
48666: fork() = 48667 (0xbe1b)
48667: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48667: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48667: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48667: process exit, rval = 0
48666: nanosleep({2.000000000 }) = 0 (0x0)
48666: fork() = 48669 (0xbe1d)
48669: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48669: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48669: process exit, rval = 0
48666: nanosleep({2.000000000 }) = 0 (0x0)
48666: fork() = 48674 (0xbe22)
48674: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48674: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48674: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48674: process exit, rval = 0
48666: nanosleep({2.000000000 }) = 0 (0x0)
48666: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48666: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48666: 
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) 
= 0 (0x0)
48666: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
48666: process exit, rval = 0

Linux:
# strace ./test
... SKIPPED ...
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, 0x7fff0e6b7050) = 0
clone(child_stack=0, 
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, 
child_tidptr=0x7fb553b0d9d0) = 24310
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
nanosleep({2, 0}, 0x7fff0e6b7050) = 0
clone(child_stack=0, 
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, 
child_tidptr=0x7fb553b0d9d0) = 24311
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
nanosleep({2, 0}, 0x7fff0e6b7050) = 0
clone(child_stack=0, 
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, 
child_tidptr=0x7fb553b0d9d0) = 24312
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
nanosleep({2, 0}, 0x7fff0e6b7050) = 0
exit_group(0) = ?

-- 
Alexander Matveev
.masterhost





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4EA804C8.2030900>