Apache HTTP Server �汾2.2
Apache2.0��һ������;��web�������������������ԡ�����ֲ�Ժ����������ƽ�⡣��Ȼû��������Ͽ���������ָ�꣬����Apache2.0��Ȼ�������ʵ������ӵ�кܸߵ����ܡ�
�����Apache 1.3 ��2.0�汾���˴������Ż����������������Ϳ������ԣ����Ҵ�����ĸĽ���Ĭ��״̬�¾Ϳ�����Ч�����ǣ��ڱ���ʱ������ʱ����������������������ܵ�ѡ���IJ����ڰ�װApache2.0ʱ������������Ա���Ը������ܵĸ��ַ��������У���������ѡ�����ʹhttpd���õ�����Ӳ���Ͳ���ϵͳ�ļ����ԣ����������Թ��ܻ�ȡ�ٶȡ�
Ӱ��web���������ܵ������������ڴ档һ��web������Ӧ�ôӲ�ʹ�ý������ƣ���Ϊ�����������ͺ�ʹ�û��ܸо�"������"�������û��Ϳ���ȥ��"ֹͣ"��"ˢ��"���Ӷ���������ĸ��ء�����ԣ�ҲӦ�ã�����MaxClients
�����ã��Ա������������̫����ӽ��̶�����������������̺ܼ�ͨ��top
��������ÿ��Apache����ƽ�����ĵ��ڴ棬Ȼ����Ϊ�������������㹻����ڴ档
�������ؾͺ���ͨ�ˣ�װһ���㹻���CPU��һ���㹻��������������㹻���Ӳ�̣�����˵��"�㹻��"��ָ������ʵ��Ӧ�õ�����
����ϵͳ�Ǻ�ֵ�ù�ע����һ�����أ��Ѿ���֤ʵ�ĺ����õľ����У�
ѡ���ܹ��õ����������ȶ��İ汾����ò�������������������ϵͳ���̶��ṩ�˿��������������ܵ�TCPЭ��ջ���߳̿⡣
�����IJ���ϵͳ֧��sendfile()
ϵͳ���ã�����ذ�װ���д˹��ܵİ汾��(��Linux��˵������ʹ��Linux2.4����߰汾����Solaris8�����ڰ汾������Ҫ��װ����)����֧��sendfile
��ϵͳ�У�Apache2���Ը���ط��;�̬���ݶ���ռ�ý��ٵ�CPUʱ�䡣
���ģ�� | ���ָ�� |
---|---|
��Apache1.3��ǰ�İ汾�У�HostnameLookups
Ĭ�ϱ���Ϊ On
����������ӳ٣���Ϊ��ÿһ��������Ҫ��һ��DNS��ѯ����Apache1.3�У�����Ĭ�ϵ�����Ϊ Off
�������Ҫ��־�ļ��ṩ��������Ϣ�����ɷ������棬�����ʹ����־�������logresolve
�������DNS��ѯ�����ͻ�������ȴ���
�Ƽ�������������������ϣ���������web��������ִ�к����������־ͳ�Ʋ���������Ӱ������������ܡ�
�����ʹ�����κ�"
"��"Allow
from domain
"ָ��(Ҳ����Deny
from domaindomain
ʹ�õ���������������IP��ַ)���������Ҫ��������DNS��ѯ(һ�������һ�η�����ȷ��û������)�����ԣ�Ϊ�˵õ���ߵ����ܣ�Ӧ�ñ���ʹ����Щָ��(������������IP��ַҲ�ǿ��Ե�)��
ע�⣬������Щָ�������<Location /server-status>
����ʹ֮�ֲ���������������£�ֻ�ж�������������Żᷢ��DNS��ѯ��������ֹ����.html
��.cgi
���������DNS��ѯ��
HostnameLookups off
<Files ~ "\.(html|cgi)$">
HostnameLookups on
</Files>
�����ijЩCGI��ż����ҪDNS���ƣ�����Ե���gethostbyname
�������
�����վ�ռ���û��ʹ�� Options FollowSymLinks
����ʹ���� Options SymLinksIfOwnerMatch
��Apache�ͱ���ִ�ж����ϵͳ��������֤�������ӡ��ļ�����ÿһ����ɲ��ֶ���Ҫһ������ĵ��á����磬��������ˣ�
DocumentRoot /www/htdocs
<Directory />
Options SymLinksIfOwnerMatch
</Directory>
������"/index.html
"ʱ��Apache����"/www
"��"/www/htdocs
"��"/www/htdocs/index.html
"ִ��lstat()
�������lstat()
��ִ�н���������棬��˶�ÿһ������Ҫִ��һ�Ρ����ȷʵ��Ҫ��֤�������ӵİ�ȫ�ԣ������������
DocumentRoot /www/htdocs
<Directory />
Options FollowSymLinks
</Directory>
<Directory /www/htdocs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>
���������ٿ��Ա����DocumentRoot
·���Ķ������֤��ע�⣬���Alias
��RewriteRule
���DocumentRoot
�����·������ôͬ����Ҫ���������ĶΡ�Ϊ�˵õ�������ܣ�Ӧ�������Է������ӵı����������еط�������FollowSymLinks
��������ʹ��SymLinksIfOwnerMatch
��
�����վ�ռ�������(ͨ������.htaccess
�ļ�)����Apache����ͼ���ļ�����ÿһ����ɲ��ֶ���.htaccess
�����磺
DocumentRoot /www/htdocs
<Directory />
AllowOverride all
</Directory>
�������"/index.html
"����Apache����ͼ��"/.htaccess
"��"/www/.htaccess
"��"/www/htdocs/.htaccess
"������������ǰ�������� Options FollowSymLinks
���ơ�Ϊ�˵õ�������ܣ�Ӧ�����ļ�ϵͳ�����еĵط���ʹ�� AllowOverride None
��
ʵ���У�����Э�̵ĺô��������ܵ���ʧ��������������һ����������ʧ������Խ�ֹʹ������Э�̡�������Ȼ�и�����������߷��������ٶȣ����Dz�Ҫʹ��ͨ������磺
DirectoryIndex index
��ʹ���������б��磺
DirectoryIndex index.cgi index.pl index.shtml index.html
������õ�Ӧ�÷���ǰ�档
���У�����һ����ȷ��type-map
�ļ�������������ʹ��"Options MultiViews
"����Ϊ������Ҫ����Ϣ����һ���������ļ��У�����������Ŀ¼����ο�����Э���ĵ��Ի�ø���ϸ��Э�̷����ʹ���type-map
�ļ���ָ����
��Apache2.0��Ҫ�����������ļ�������ʱ�����紦��������˰���ʱ���������ϵͳ֧��ij����ʽ��mmap()
�����Դ��ļ�ִ���ڴ�ӳ�䡣
��ijЩƽ̨�ϣ��ڴ�ӳ�����������ܣ�������ijЩ����£��ڴ�ӳ��ή����������Ӱ�쵽httpd���ȶ��ԣ�
��ijЩ����ϵͳ�У����������CPU��mmap
������read()
Ѹ�١����磬�ڶദ������Solaris�������ϣ��ر���mmap
��Apache2.0���ͷ���˽����ļ���ʱ�����졣
��������ΪNFSװ�ص��ļ�ϵͳ�е�һ���ļ��������ڴ�ӳ�䣬����һ��NFS�ͻ��˵Ľ���ɾ�����߽ض�������ļ�����ô��Ľ�������һ�η����Ѿ���ӳ����ļ�����ʱ�������һ�����ߴ���
��������������������Ӧ��ʹ�� EnableMMAP off
�رնԷ����ļ����ڴ�ӳ�䡣ע�⣺��ָ����Ա����Ŀ¼�����ø��ǡ�
��Apache2.0�ܹ����Խ�Ҫ�����͵��ļ������ݵ�ʱ��(���緢�;�̬����)���������ϵͳ֧��sendfile()
����Apache��ʹ���ں��ṩ��sendfile()
�������ļ���
�ڴ����ƽ̨�ϣ�ʹ��sendfile����ͨ���������Ķ���д�������������ܡ�Ȼ����ijЩ����£�ʹ��sendfile��Σ����httpd���ȶ���
һЩƽ̨���ܻ���Apache����ϵͳ��ⲻ������ȱ�ݵ�sendfile֧�֣��ر��ǽ�������ƽ̨��ʹ�ý������õ��Ķ������ļ������ڵ�ǰ��sendfile֧����ȱ�ݵ�ƽ̨ʱ��
����һ��������NFS�ļ�ϵͳ���ںˣ����������ɿ���ͨ���Լ���cache�����������ļ���
������������������Ӧ��ʹ��"EnableSendfile off
"������sendfile ��ע�⣬���ָ����Ա����Ŀ¼�����ø��ǡ�
��Apache1.3��ǰ��MinSpareServers
, MaxSpareServers
, StartServers
�����ö����ܶ��кܴ��Ӱ�졣������Ϊ��Ӧ�Ը��ض������㹻���ӽ���ʱ��Apache��Ҫ��һ��"����"�Ĺ��̡����������StartServers
�������ӽ��̺�Ϊ������MinSpareServers
���õ���Ҫ��ÿһ����ֻ�ܽ���һ���ӽ��̡����ԣ���һ����Ҫͬʱ����100���ͻ��˵ķ����������StartServers
ʹ��Ĭ�ϵ�����5
����Ϊ��Ӧ�Ը��ض������㹻����ӽ�����Ҫ95�롣��ʵ��Ӧ���У������Ƶ���������������������������ԣ������������Ϊ���ṩ10���ӵķ��������ͺ�����ˡ�
"һ����һ��"�Ĺ涨��Ϊ�˱����ڴ����ӽ��̹����з��������������Ӧͣ�٣��������Է��������ܵ�Ӱ��̫���ˣ��������Ըı䡣��Apache1.3�У����"һ����һ��"�Ĺ涨��ÿ����ˣ�����һ�����̣��ȴ�һ���ӣ����������ڶ������ٵȴ�һ���ӣ��̶������ĸ�����˰�ָ�������Ӵ����Ľ����������ﵽÿ��32����ֱ������MinSpareServers
���õ�ֵΪֹ��
�Ӷ�����ӳ�������ƺ�û�б�Ҫ����MinSpareServers
, MaxSpareServers
, StartServers
�����ÿ���Ӵ����Ľ���������4���������ErrorLog
�в���һ����Ϣ�����������������Ϣ������Կ�������Щ���á�����ʹ��mod_status
����������
����̴�����ص�����MaxRequestsPerChild
�����Ľ��̵����١���Ĭ��ֵ��"0
"����ζ��ÿ��������������������Dz������Ƶġ������ֵ���õú�С������30���������Ҫ������ӡ���SunOS����Solaris�����ڰ汾�ϣ������ֵΪ10000
�����ڴ�й©��
��������˳־����ӣ��ӽ��̽�����æµ״̬�Եȴ����������ϵ�������Ϊ����С���为��Ӱ�죬KeepAliveTimeout
��Ĭ��ֵ������Ϊ5
�룬��ı���������ͷ�������Դ֮���ƽ�⡣���κ�����´�ֵ����Ӧ������60
�룬�μ�most of the benefits are lost��
Apache 2.x ֧�ֲ���ʽ���д���ģ�飬��Ϊ��·����ģ��(MPM)���ڱ���Apacheʱ�����ѡ��Ҳֻ��ѡ��һ��MPM�������м�����Է�UNIXϵͳ��MPM��beos
, mpm_netware
, mpmt_os2
, mpm_winnt
������UNIXϵͳ���м�����ͬ��MPM�ɹ�ѡ�����Ƕ���Ӱ�쵽httpd���ٶȺͿ������ԣ�
worker
MPMʹ�ö���ӽ��̣�ÿ���ӽ��������ж���̡߳�ÿ���̴߳���һ������MPMͨ���Ը������ķ�������һ�������ѡ����Ϊ����prefork
MPM��Ҫ���ٵ��ڴ��Ҹ����������ԡ�prefork
MPMʹ�ö���ӽ��̣���ÿ���ӽ��̲����������̡߳�ÿ������ֻ����һ�����ӡ������ϵͳ�������ٶȺ�worker
MPMһ���죬������Ҫ������ڴ档�������̵߳������ijЩ���������worker
MPM��������Ӧ���ڲ��߱��̰߳�ȫ�ĵ�����ģ��(����php3/4/5)�����ڲ�֧���̵߳��Ե�ƽ̨�����ڵ��ԣ����һ����б�worker
MPM���ߵ��ȶ��ԡ�����MPM�ĸ������ݣ���ο����ĵ���
��Ȼ�ڴ�������Ӱ�����ܵ���Ҫ���أ����Ӧ������ȥ���㲻��Ҫ��ģ�顣����㽫ģ������DSO ��ȡ������Ҫ��ģ�����һ���dz������飺ע�͵�LoadModule
ָ���в���Ҫ��ģ�顣
������Ѿ���ģ�龲̬���ӽ�Apache�����ƺ��ģ���ͱ������±���Apache��ȥ���㲻��Ҫ��ģ�顣
����ģ��ǣ�浽��һ�������ǣ�������Ҫ��Щģ�顢����Ҫ��Щģ�飿��ȡ���ڷ������ľ��������һ��˵��������Ҫ��������ģ�飺mod_mime
, mod_dir
, mod_log_config
����Ҳ���Բ�Ҫmod_log_config
������һ�㲻�Ƽ���������
һЩģ�飬����mod_cache
��worker
ʹ��APR(Apache����ֲ����ʱ)��ԭ��API����ЩAPI�ṩ���ܹ������������߳�ͬ����ԭ�Ӳ�����
Ĭ������£�APR��ÿ��Ŀ��OS/CPU��ʹ��������Ч������ִ����Щ��������������ִ�CPU��ָ�����һ��ԭ�ӵıȽϽ���(compare-and-swap, CAS)����ָ���һЩ��ʽƽ̨�ϣ�APRĬ��ʹ��һ�ֻ����ġ����ڻ���ִ�е�ԭ��API�Ա��ֶ�û��CASָ�����ʽCPU�ļ��ݡ������ֻ��������ʽ��CPU������Apache��������ڱ���ʱʹ�� --enable-nonportable-atomics
ѡ�
./buildconf
./configure --with-mpm=worker --enable-nonportable-atomics=yes
--enable-nonportable-atomics
ѡ��ֻ������ƽ̨��أ�
--enable-nonportable-atomics
ѡ�APR��ʹ��SPARC v8plus���������ӿ����Ӳ����CAS������ע�⣬�����UltraSPARC CPU��Ч��
--enable-nonportable-atomics
ѡ�APR��ʹ��486���������ӿ����Ӳ����CAS������ע�⣬�����486���ϵ�CPU��Ч��
���Apache�ڱ���ʱ������mod_status
������������ʱ������"ExtendedStatus On
"����ôApache���ÿ�������������gettimeofday()
(���߸��ݲ���ϵͳ�IJ�ͬ������times()
)�Լ�(1.3��֮ǰ)���������time()
���ã�ʹ״̬��¼����ʱ���־��Ϊ�˵õ�������ܣ���������"ExtendedStatus off
"(��Ҳ��Ĭ��ֵ)��
�ⲿ��������δ��ȫ����Apache2.0�еı仯���и��� ��һЩ��Ϣ��Ȼ��Ч��ʹ������ע�⡣
����Ҫ˵���� Unix socket API ��һ��ȱ�㡣����web������ʹ���˶��Listen
����������˿ڻ��߶����ַ��Apache��ʹ��select()
�Լ��ÿ��socket�Ƿ������select()
�����һ��socket����������һ���������Ⱥ�������Apache��ģ���Ƕ��ӽ��̵ģ����п��н��̻�ͬʱ����µ����ӡ�һ���������ʵ�ַ�����������(��Щ���Ӳ�����Դ���룬ֻ��Ϊ��˵���������)��
for (;;) {
for (;;) {
fd_set accept_fds;
FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
}
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
}
}
if (new_connection != -1) break;
}
process the new_connection;
}
���������ʵ�ַ�����һ�����ص�"����"���⡣�������ӽ���ͬʱִ�����ѭ�������ڶ������֮�䣬���̻ᱻ������select
���漴����ѭ������ͼaccept
�����ӣ�����ֻ��һ�����̿��Գɹ�ִ��(���軹��һ�����Ӿ���)�����������ᱻ������accept
��������ֻ����һ��socket���Դ�����������������ס�ˣ�ֱ�����㹻����������ǻ��ѡ���"����"������PR#467����ר�ŵĽ�����Ŀǰ���������ֽ��������
һ�ַ�����ʹ�÷�������socket ���������ӽ��̲�����������������ִ�С������������˷�CPUʱ�䡣����һ�£�select
��10���ӽ��̣���һ�������ʱ������9�������ѣ�����ͼaccept
�����ӣ��̶�����select
ѭ�����������£��������û��һ���ӽ����ܹ���Ӧ����������socket�ϵ�����ֱ���˳�select
ѭ������֮���������Ч�ʲ�����ô�ߣ��������кܶ��CPU�����ҿ��˺ܶ��ӽ��̡�
��һ��Ҳ��Apache��ʹ�õķ����ǣ�ʹ�ڲ�ѭ������ڴ��л�������(��֮ͬ���Ը�����ʾ)��
for (;;) {
accept_mutex_on ();
for (;;) {
fd_set accept_fds;
FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
}
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
}
}
if (new_connection != -1) break;
}
accept_mutex_off ();
process the new_connection;
}
����accept_mutex_on
��accept_mutex_off
ʵ����һ�������źŵƣ����κ�ʱ��ֻ��Ϊһ���ӽ�����ӵ�С�ʵ�ֻ���ķ����ж��֣��䶨��λ��src/conf.h
(1.3��ǰ�İ汾)��src/include/ap_config.h
(1.3���Ժ�İ汾)�С���һЩ����û���������Ƶ���ϵ�У�ʹ�ö��Listen
ָ����Dz���ȫ�ġ�
AcceptMutex
ָ������ı�������ʱʹ�õĻ��ⷽ����
AcceptMutex flock
���ַ�������ϵͳ����flock()
������һ�������ļ�(��λ��ȡ����LockFile
ָ��)��
AcceptMutex fcntl
���ַ�������ϵͳ����fcntl()
������һ�������ļ�(��λ��ȡ����LockFile
ָ��)��
AcceptMutex sysvsem
(1.3�����°汾)���ַ���ʹ��SysV�����źŵ���ʵ�ֻ��⡣���ҵ��ǣ�SysV�����źŵ���һЩ�����ã���һ�ǣ�Apache�п��ܲ����ڽ�����ǰ�ͷ������źŵ�(��ipcs()
��man page)�����⣬�����źŵ�API�����������������ͬuid��CGI�ṩ�˾ܾ������Ļ���(����CGI��������������suexec
��cgiwrapper
)�����ڴˣ��ڶ�����ϵ�ж��������ַ���������IRIX(��Ϊǰ���ַ�����IRIX�д���̫��)��
AcceptMutex pthread
(1.3�����°汾)���ַ���ʹ����POSIX���⣬����Ӧ�ÿ���������������ʵ����POSIX�̹߳淶����ϵ�У������ƺ�ֻ������Solaris2.5�����°汾�У�����ֻ����ij�������²�����������������������������Ӧ������������Ĺ����ʧȥ��Ӧ��ֻ�ṩ��̬���ݵķ��������ܲ���Ӱ�졣
AcceptMutex posixsem
(2.0�����°汾)���ַ���ʹ����POSIX�źŵơ����һ�������е��߳�ռ���˻���segfault �����źŵƵ������߽����ᱻ�ָ����Ӷ����·������Ĺ����ʧȥ��Ӧ��
������ϵͳ�ṩ��������������Ĵ��л��ƣ��ǾͿ�����ҪΪAPR���Ӵ���(�����ύһ��������Apache)��
����һ���������ǹ�����δ����ʵʩ�ķ�����ʹѭ�����ֵش��л�����ֻ����һ�������Ľ��̽���ѭ�������ַ������ڶ�����̿���ͬʱ���еĶദ������ϵͳ�в����м�ֵ�ģ����������Ĵ��з�����û��ռ������������Ҳ���ǽ����о���һ�����������ڸ߶Ȳ��е�����������������Ϲ淶�������䱻���ȿ��ǵij̶Ȼ�Ƚϵ͡�
��Ȼ��Ϊ�˵õ�������ܣ���������ʹ�ö��Listen
��䡣�����������ݻ���ֵ�ö�һ����
�����Զ�socket�ķ�����������һ���Ľ�������ô�Ե�socket�ķ������������أ��������ƺ�Ӧ��û��ʲô���⣬��Ϊ���н��������ӵ�����ʱ�������accept()
�������������������"����"�����⣬������ʵ��Ӧ���У����ڸ�������������������������ͬ�����⡣�������TCPջ��ʵ�ַ������ڵ������ӵ���ʱ���ں�ʵ���ϻ���������������accept
�Ľ��̣���ֻ��һ���ܵõ������Ӳ����ص��û��ռ䣬����������ڵò������Ӷ����ں��д�������״̬����������״̬Ϊ�������ڸǣ�����ȷ���ڣ����������socket�в��÷�����������ͬ�ĸ��ؼ����˷ѡ�
ͬʱ�����Ƿ����������ϵ�ṹ�У���ʹ�ڵ�socket������£�ʵʩ���л���Ч��Ҳ��������ڼ������е�����£���ʵ�ϾͶ����������ˡ���Linux(2.0.30��˫Pentium pro 166/128M RAM)�µIJ�����ʾ���Ե�socket�����л��Ȳ����л�ÿ���ӿ��Դ�����������˲���3%�����ǣ������л���ÿһ��������˶����100ms���ӳ٣����ӳٿ�������Ϊ�������������·���£����ҽ�������LAN�С������Ҫ�ı�Ե�socket�Ĵ��л������Զ���SINGLE_LISTEN_UNSERIALIZED_ACCEPT
��ʹ��socket�ķ��������������л���
����draft-ietf-http-connection-00.txt section 8������HTTP������Ϊ���ɿ���ʵ�ִ�Э�飬��Ҫ��������ÿ�������Ϲر�ͨѶ(����һ�£�һ��TCP������˫��ģ���������֮���Ƕ�����)������һ���ϣ����������������������£�����1.2�汾��ʼ��Apache��ȷʵ���ˡ�
���������˴˹����Ժ�����һЩUnix�汾�Ķ̼�����֮Ҳ������������⡣TCP�淶��û�й涨FIN_WAIT_2
������һ����ʱ����Ҳû����ȷ��ֹ����û�г�ʱ��ϵͳ�У�Apache1.2����������FIN_WAIT_2
״̬�С���������£������������ù�Ӧ���ṩ��TCP/IP�������Խ�����������Ӧ�̲��ṩ����(ָSunOS4 -- �����û��dz��������Լ�����������֤)����ôֻ�ܹرմ˹��ܡ�
ʵ�ֵķ��������֣���һ��socketѡ��SO_LINGER
�������ƺ�����ע���������TCP/IPջ����δ������ȷʵ�֡���ʹ����ȷʵ�ֵ�ջ��(ָLinux2.0.31)���˷���Ҳ��֤������۱���һ�ַ����߰���
Apache�Դ˵�ʵ�ִ�����λ�ں���lingering_close
(�http_main.c
)�С��˺����������磺
void lingering_close (int s)
{
char junk_buffer[2048];
/* shutdown the sending side */
shutdown (s, 1);
signal (SIGALRM, lingering_death);
alarm (30);
for (;;) {
select (s for reading, 2 second timeout);
if (error) break;
if (s is ready for reading) {
if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
break;
}
/* just toss away whatever is here */
}
}
close (s);
}
�˴��������ӽ���ʱ����һЩ�����������ǿɿ�ʵ��������ġ�����HTTP/1.1Խ��Խ���У������������Ӷ����ȶ��ģ��˿������ɸ��������ͬ�ֵ��������Ҫ���ȥ�ر�������ܣ����Զ���NO_LINGCLOSE
���������Ƽ��������������ǣ�����HTTP/1.1�йܵ����ȶ����ӵ����ã�lingering_close
�Ѿ���Ϊ���Ա��롣���ң��ܵ��������ٶȸ�����Ӧ�ÿ�������֧�֡�
Apache�����̺��ӽ���ͨ��scoreboard����ͨѶ��ͨ�������ڴ���ʵ�ֵ�Ȼ��������ġ�����������ʵ���������ṩ��������ֲ�IJ���ϵͳ�У���ʹ�ù����ڴ棬�������ʹ�ô����ļ��������ļ������ٶ��������Ҳ��ɿ�(����Ҳ��)����ϸ�Ķ������ϵ����Ӧ��src/main/conf.h
�ļ���������USE_MMAP_SCOREBOARD
��USE_SHMGET_SCOREBOARD
����������֮һ(���߷ֱ�����HAVE_MMAP��HAVE_SHMGET)������ʹ�������ݵ���ش�����Ч��������ϵͳ�ṩ�������͵Ĺ������ݣ�����Ҫ��src/main/http_main.c
�ļ������ѱ���Ĺҹ���ӵ��������С�(Ҳ�뷢��һ������������)
����㲻��ʹ�ö�̬����ģ��(��������Ϊ��������λ���������Ϊ�˻�����һ��������ϵ����)�������ڱ��������ʱ���� -DDYNAMIC_MODULE_LIMIT=0
���������Խ�ʡΪ֧�ֶ�̬����ģ���������ڴ档
��Solaris8��MPM�У�Apache2.0.38ʹ��һ��ϵͳ�������ռ��ټ���
truss -l -p httpd_child_pid.
-l
����ʹtruss��¼ÿ��ִ��ϵͳ���õ�LWP(lightweight process--Solaris���ļ��߳�)��ID��
����ϵͳ����ʹ�ò�ͬ��ϵͳ�����ٹ��ߣ�����strace
, ktrace
, par
��������������Ƶġ�
�����У�һ���ͻ�����httpd������һ��10KB�ľ�̬�ļ����ԷǾ�̬������Э������ļ�¼���кܴ�ͬ(��ʱҲ���ѿ�����)��
/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...) /67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9
�����У������߳��� LWP #67 ��
accept()
���л�֧�ֵ��ѷ������������ƽ̨��Ӧ��MPM��Ĭ�������ʹ�÷Ǵ��е�accept �������ڼ�������˿ڵ�ʱ��/65: lwp_park(0x00000000, 0) = 0 /67: lwp_unpark(65, 1) = 0
������һ�����Ӻ����̻߳���һ�������߳��Դ�������������У�����������Ǹ������߳��� LWP #65 ��
/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0
Ϊ��ʵ������������Apache��Ҫ֪���������ӵı���socket��ַ�����������£��п�������ִ�д˵���(����û����������������Listen
ָ����û��ʹ��ͨ���ַ)������Ŀǰ��û�жԴ����Ż�����
/65: brk(0x002170E8) = 0 /65: brk(0x002190E8) = 0
��brk()
�����ǴӶ��з����ڴ�ģ�����ϵͳ���ü�¼�в����������Ϊhttpd�ڶ�����������ʹ�����Լ����ڴ������(apr_pool
��apr_bucket_alloc
)�������У�httpd�ո��������������������malloc()
�Է���ԭʼ�ڴ�������Լ����ڴ��������
/65: fcntl(9, F_GETFL, 0x00000000) = 2 /65: fstat64(9, 0xFAF7B818) = 0 /65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0 /65: fstat64(9, 0xFAF7B818) = 0 /65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0 /65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0 /65: fcntl(9, F_SETFL, 0x00000082) = 0
���ţ������߳�ʹ�ͻ������Ӵ��ڷ�����ģʽ��setsockopt()
��getsockopt()
������Solaris��libc��socketִ��fcntl()
������ġ�
/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97
�����̴߳ӿͻ��˶�ȡ����
/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0 /65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
���httpd������Ϊ"Options FollowSymLinks
"��"AllowOverride None
"�����ԣ������ÿ���������ļ�·���е�Ŀ¼ִ��lstat()
��Ҳ����Ҫ���.htaccess
�ļ������ص���stat()
�Լ����ļ��Ƿ���ڣ��Լ���һ����ͨ���ļ�����һ��Ŀ¼��
/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269
�����У�httpd����ͨ������ϵͳ����sendfilev()
����HTTP��Ӧͷ�ͱ�������ļ���Sendfile�����ϵͳ��������ͬ����Щϵͳ�У��ڵ���sendfile()
��ǰ����Ҫ����write()
��writev()
�Է�����Ӧͷ��
/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78
��write()
�����ڷ�����־�ж��������˼�¼��ע�⣬����û�ж�time()
�ĵ��õļ�¼����Apache1.3��ͬ��Apache2.0ʹ��gettimeofday()
�Բ�ѯʱ�䡣����Щ����ϵͳ�У�����Linux��Solaris��gettimeofday
��һ���Ż��İ汾���俪����һ����ͨ��ϵͳ����ҪСһ�㡣
/65: shutdown(9, 1, 1) = 0 /65: poll(0xFAF7B980, 1, 2000) = 1 /65: read(9, 0xFAF7BC20, 512) = 0 /65: close(9) = 0
�����̶߳��������ӳٵĹرա�
/65: close(10) = 0 /65: lwp_park(0x00000000, 0) (sleeping...)
������̹߳رշ�������ļ��Ϳ飬ֱ���������̰���ָ�ɸ���һ�����ӡ�
/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)
��䣬�������̿����ڰ�һ������ָ�ɸ�һ���������̺�����������һ������(����������й������̶�����æµ״̬�������MPM�е�һЩ�������������Լ)����Ȼ�ڴ����в������ԣ��ڹ����̸߳ս�����һ������֮����һ��accept()
��(�ڸ߸��ɵ�����¸���)�������в�����