Hi.
I was trying to understand a cause for this problem, and made an ugly hack:
diff -u ./rtld_lock.c.orig ./rtld_lock.c
--- ./rtld_lock.c.orig 2011-11-15 07:56:14.000000000 +0000
+++ ./rtld_lock.c 2011-11-15 07:54:42.000000000 +0000
@@ -118,7 +118,7 @@
sigset_t tmp_oldsigmask;

for ( ; ; ) {
- sigprocmask(SIG_BLOCK, &fullsigmask, &tmp_oldsigmask);
+// sigprocmask(SIG_BLOCK, &fullsigmask, &tmp_oldsigmask);
if (atomic_cmpset_acq_int(&l->lock, 0, WAFLAG))
break;
sigprocmask(SIG_SETMASK, &tmp_oldsigmask, NULL);
@@ -135,7 +135,7 @@
atomic_add_rel_int(&l->lock, -RC_INCR);
else {
atomic_add_rel_int(&l->lock, -WAFLAG);
- sigprocmask(SIG_SETMASK, &oldsigmask, NULL);
+// sigprocmask(SIG_SETMASK, &oldsigmask, NULL);
}
}

this reduced number of syscalls, but I am not sure about stability and correctness of this hack. And performance problems of apache remained (this hack only gave 5-10% increase of performance). Also I found problem in longjmp syscalls. In FreeBSD we are doing this syscalls from gen/setjmp.S without condition check,
for example in Linux we are doing it only if stack has been saved.
Linux code:
if (env[0].__mask_was_saved)
/* Restore the saved signal mask. */
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
(sigset_t *) NULL);

After all that I was trying to compare perfomance of return from fork() in Linux and FreeBSD (see http://lists.freebsd.org/pipermail/freebsd-hackers/2011-October/036705.html) and fork() in FreeBSD was slower.

I am not trying to start a holy war, but I really need to increase performance of our hosting in FreeBSD.

On 15.11.2011 01:59, Doug Barton wrote:
On 11/14/2011 12:56, John Baldwin wrote:
On Monday, November 14, 2011 3:31:43 pm Doug Barton wrote:
Trying to track down a load problem we're seeing on 8.2-RELEASE-p4 i386
in a busy web hosting environment I came across the following post:

http://lists.freebsd.org/pipermail/freebsd-questions/2011-
October/234520.html
That basically describes what we're seeing as well, including the
"doesn't happen on Linux" part.

Does anyone have any ideas about this?

With incredibly similar stuff running on 7.x we didn't see this problem,
so it seems to be something new in 8.
I suspect it has to do with some of the changes to rtld such that it now
always blocks signals while resolving symbols (or something along those
lines IIRC).  It makes throwing exceptions slow as well.
The calls to sigprocmask() in rtld seem to be doing what you suggest
here, but they involve setting and restoring the mask. In my followup
post I pasted what we're seeing, which is different, and much more
voluminous. For example, 13,500 calls in 30 seconds from a single apache
worker process.

Although this does seem to explain why our test cases have more calls
when compiled with C++ than they do when compiled with C. :)

Thanks for the response in any case.


Doug



--

С уважением,
Daniil Cherednik
.masterhost

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"

Reply via email to