rse 99/08/12 00:31:02
Added: pthreads README.rse
Log:
Ralf's latest writeup: ``Get the Apache/pthread beast running''. Those who
had great problems to get Apache/pthread running in the past (especially on
non-Linux and non-AIX platforms ;) can now give it another try by following
the ``FooBar/OS + Pth'' instructions in this document. With this variant
Apache/pthread can be used to get a multithreaded Apache running on mostly all
current Unix flavors, I think.
Revision Changes Path
1.1 apache-apr/pthreads/README.rse
Index: README.rse
===================================================================
Get the Apache/pthread beast running
Ralf S. Engelschall, 12-Aug-1999
------------------------------------
These are my instructions for getting Apache/pthread running under various
platforms (mainly FreeBSD for now). One usually has to fight against two
major problems:
1. Apache/pthread (as Apache 1.3) uses an inter-process lockfile
for optionally serializing accepts. This means that usually either
flock(2) or fcntl(2) is used. The problem is that in a multi-threaded
environment this works only by coincidence (usually when threads are
implemented in kernel-space). For mostly all user-space implementations
this will cause Apache/pthread to hang on connections (actually in the
middle of processing the request in case the request processing thread
had to be suspended once because of a blocking situation).
There are two solutions: If the user-space threading library supports
inter-process mutexes (_POSIX_THREAD_PROCESS_SHARED is defined) one can
use pthread_mutex_t inside a shared memory segment. But AFAIK there is
still no freely available user-space pthread library which supports this
(the forthcoming GNU Pth versions will support this, but the stuff is
still not released). So the only possibility is to use no accept
serialization at all. The effect can be that the server is slower because
of contention on the accept socket.
2. Apache/pthread uses poll(2) which is not available on all platforms.
There is just one solution: Emulate poll(2) with select(2) For this one
can use my poll emulation library which I've comitted to the
apache-apr/poll/ repository area.
3. Portable user-space threading environments like GNU Pth cannot
easily provide system call wrappers, because there is no 100% portable
way to provide this "magically". For instance Pth instead provides two
variants: soft syscall wrapping via ``#define <syscall>
_pthread_<syscall>'' in pthread.h and hard syscall wrapping with
syscall(2). The soft syscall wrapping is 100% portable, but requires an
#include <pthread.h> in _EVERY_ source file of the application which uses
a to be wrapped system call, of course. The hard system call wrapping
works "magically" just at the linker phase, but has some portability
problems. The best solution is to use soft system call wrapping by just
including pthread.h in every Apache source file.
And here are the success stories for pariticular OS+Pthread variants:
o FreeBSD 3.1 + John Birrell' uthread
- uthread is a user-space pthread library in FreeBSD's libc_r
which contains both thread-safe libc functions and the thread
functions. This library replaces libc for threaded applications. For
older FreeBSD versions (2.2.x) one has to build libc_r manually as part
of a 'make world'.
- uthread is a plain user-space implementation and this way the
inter-process accept lock file cannot be used (it suspends the whole
process and not just the current thread). One has to make sure that no
USE_XXX_SERIALIZED_ACCEPT is defined for FreeBSD in
src/include/ap_config.h. For this a -DNO_SERIALIZED_ACCEPT can be used.
- FreeBSD <= 3.2-STABLE lacks poll(2) in libc_r, altough poll(2) exists
in libc since FreeBSD 3.0. One has to use the poll emulation library.
Follow these steps:
$ cd <ROOT>/apache-apr/poll
$ ./configure
$ make
$ cd <ROOT>/apache-apr/pthread
$ CC='cc' \
OPTIM='-O2' \
CFLAGS='-pthread -I\$(SRCDIR)/../../poll -DNO_SERIALIZED_ACCEPT' \
LDFLAGS='-pthread -L\$(SRCDIR)/../../poll' \
LIBS='-lpoll' \
./configure \
--with-layout=GNU \
--target=apache \
--prefix=/tmp/apache-pthread \
$ make
$ make install
o FooBar/OS + Ralf S. Engelschall's GNU Pth
- Pth is also a user-space pthread library and this way the inter-process
accept lock file cannot be used (it suspends the whole process and not
just the current thread). One has to make sure that no
USE_XXX_SERIALIZED_ACCEPT is defined for FreeBSD in
src/include/ap_config.h. For this a -DNO_SERIALIZED_ACCEPT can be
used.
- FooBar/OS often lacks poll(2), but this is no problem, because GNU Pth
on every platforms provides its own poll(2) emulation (based on
select(2) which the Pth event manager uses internally). So you don't
have to worry about this.
Follow these steps:
$ cd <ROOT>/apache-apr
$ lynx ftp://alpha.gnu.org/gnu/pth/pth-1.1b3.tar.gz
[You can use also any later Pth version, of course. ]
[Especially release versions >= 1.1.0 from ftp://ftp.gnu.org/gnu/pth/]
$ gunzip <pth-1.1b3.tar.gz | tar xvf -
$ cd pth-1.1b3
$ ./configure \
--disable-shared \
--enable-pthread \
--enable-syscall-soft
$ make
$ make test
$ cd <ROOT>/apache-apr/pthread
$ CC='cc' \
OPTIM='-O2' \
CFLAGS='-I\$(SRCDIR)/../pth-1.1b3 -DPTHREAD_EVERYWHERE
-DNO_SERIALIZED_ACCEPT' \
LDFLAGS='-L\$(SRCDIR)/../pth-1.1b3/.libs' \
LIBS="-lpthread" \
./configure \
--with-layout=GNU \
--target=apache \
--prefix=/tmp/apache-pthread
$ make
$ make install