没有用Apache的worker MPM和mod_php关闭的连接

时间:2012-06-05 18:53:57

标签: php apache worker

首先,我知道这是一个值得怀疑的设置,但fastcgi或fcgid的性能迫使我试一试。问题是由于连接没有关闭,我的负载测试永远不会完成。当我推动只有40个并发连接时,事情就会向南移动 - 连接处于建立状态几分钟:

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
      1 CLOSE_WAIT
     72 ESTABLISHED
      8 LISTEN

然后几分钟后,他们分成了CLOSE_WAIT和ESTABLISHED:

的混合体
netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
     41 CLOSE_WAIT
     32 ESTABLISHED
      8 LISTEN

又过了10分钟,这没有改变。这些是客户端到Web服务器的组合,以及Web服务器到mysql服务器的组合。如果我测试一个没有建立mysql连接的php页面,一切正常。

我自定义编译PHP(在下面配置),并通过apt-get(Ubuntu 10.04)安装了apache-mpm-worker。我已经尝试使用msyql_config和mysqlnd为mysql,mysqli和pdo模块编译PHP。这可能只是一个非线程安全的库,让它变得丑陋吗?

./configure --prefix=/usr/local --with-apxs2=/usr/bin/apxs2 --disable-cgi --with-layout=GNU --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --disable-ipv6 --without-kerberos --with-pcre-regex=/usr --with-zlib --with-zlib-dir=/usr --enable-bcmath --with-bz2 --enable-calendar --enable-ctype --with-curl=shared,/usr --without-qdbm --without-gdbm --with-db4 --with-libxml-dir=/usr --enable-exif --disable-ftp --with-gd=shared,/usr --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-gettext --with-mhash=shared,/usr --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mcrypt=shared,/usr --enable-mbstring --without-msql --without-mssql --with-pspell=shared,/usr --without-mm --disable-shmop --enable-soap --enable-sockets --with-regex=php --disable-sysvshm --disable-wddx --with-xmlrpc=shared --with-iconv --with-xsl=shared,/usr --enable-zip --with-pear=/usr/share/php --with-tsrm-pthreads --enable-maintainer-zts --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=myslqnd --with-libdir=lib64

1 个答案:

答案 0 :(得分:0)

对我有用的一个解决方案是在apache设置中添加以下标志(我不使用repo):

export CFLAGS=-DNO_LINGCLOSE
./configure ...

当从对等方收到FIN数据包时,强制apache关闭套接字。

默认情况下,Apache会在对等体发送FIN后将套接字置于close_wait。此时,套接字被认为是半关闭的,等待来自本地对等方的FIN,通常通过结束应用程序来完成。默认情况下,Apache允许超时,通常为2-5分钟,具体取决于设置。