Edit report at https://bugs.php.net/bug.php?id=62668&edit=1
ID: 62668
Comment by: robwaa at zonnet dot nl
Reported by: robwaa at zonnet dot nnl
Summary: Setting "listen.backlog = -1" is not equal to
"unlimited".
Status: Open
Type: Bug
Package: FPM related
Operating System: Ubuntu Server 12.04 LTS (OpenVZ)
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
Thanks for absolutely nothing. Zilch, zero, nada, zip.
I resolved the problem by first dumping PHP-FPM. Then dumping PHP.
Previous Comments:
------------------------------------------------------------------------
[2012-07-26 18:19:11] robwaa at zonnet dot nnl
In Description, that should have been :
"I was getting 500-580 of this error **at the start** of each swamp test of the
webserver,"
The number following 5xx= (see screenshot) was consistent with the number of
socket errors each and evey time.
Screenshot of the short load test result : http://i50.tinypic.com/i2nlaf.png
------------------------------------------------------------------------
[2012-07-26 17:22:11] robwaa at zonnet dot nnl
Description:
------------
Versions
root@vpg:~# php5-fpm -v
PHP 5.3.10-1ubuntu3.2 (fpm-fcgi) (built: Jun 13 2012 17:23:57)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
root@vpg:~# nginx -v
nginx version: nginx/1.2.2
(with apt-get from the bottom of this page http://nginx.org/en/download.html)
I was getting 150-200 of this error **at the start** of each swamp test of the
webserver. The time was the same up to and including the second for each batch
of error messages. From the Nginx error.log :
2012/07/25 05:46:06 [error] 388#0: *4293 connect() to
unix:/run/php-fpm/vpg-fpm.socket failed (11: Resource temporarily unavailable)
while connecting to upstream, client: xxx.xxx.xxx.xxx, server: domainname.com,
request: "GET /info.php HTTP/1.1", upstream:
"fastcgi://unix:/run/php-fpm/vpg-fpm.socket:", host: "domainname.com"
In this case the first successful connect would be at 05:46:07 (nginx
access.log).
According to /etc/php5/fpm/pool.d/www.conf :
"; Set listen(2) backlog. A value of '-1' means unlimited."
"; Default Value: 128 (-1 on FreeBSD and OpenBSD)"
So I set "listen.backlog = -1". The error persists.
Checked with all sorts of combinations, and from ondemand, to dynamic, to
static, back to ondemand. But, the error persists.
Then I checked the /var/log/php5-fpm.log :
"WARNING: [pool vpg] listen.backlog(-1) was too low for the ondemand process
manager. I updated it for you to 128."
"NOTICE: configuration file /etc/php5/fpm/php-fpm.conf test is successful"
"WARNING: [pool vpg] listen.backlog(-1) was too low for the ondemand process
manager. I updated it for you to 128."
1) Value "-1" is not interpreted as "unlimited", but raises a warning.
2) "listen.backlog" is then initialized to the low default of 128. Not what I
expected.
Test script:
---------------
No script provided.
- Set "listen.backlog = -1" in /etc/php5/fpm/pool.d/www.conf.
- Use Unix Sockets between Nginx + php-fpm. With or whithout APC, doesn't
matter.
- Load test Nginx + php-fpm.
- Check php-fpm's error log for the warning about "listen.backlog".
- Check Nginx's error.log for the Unix Socket connect() errors and note their
time. Should all be the same.
- Check Nginx's access log and find the first response with status 200, to
determine if the connect errors happened just before it.
I used autobench, httperf, and ab.
This very very short load test, should last about 20 - 25 seconds from VPS to
VPS. But was enough to trigger the result. :
httperf --timeout=30 --client=0/1 --server=vectorplayground.com --port=80
--uri=/info.php --rate=2000 --send-buffer=4096 --recv-buffer=16384
--num-conns=2000 --num-calls=1
Expected result:
----------------
For "listen.backlog = -1" to be "unlimited", I would have expected php-fpm, on
Nix, to always look at the values of "net.core.somaxconn" and
"net.core.netdev_max_backlog". And then to initialize itself to somewhere near,
or equal to "net.core.somaxconn".
My VPS's "net.core.somaxconn" is set at 4096, and I set "listen.backlog = 3072".
Gone were the Unix Socket connect errors.
When Unix Sockets are used, you might want to initialize to a much higher
default than 128, if net.core.somaxconn permits. Or at least make a remark to
do so, in the comments. This is about a backlog. I can imagine the problem
being even bigger with the ondemand mode on slower hardware.
Actual result:
--------------
First from php-fpm during its start up :
"WARNING: [pool vpg] listen.backlog(-1) was too low for the ondemand process
manager. I updated it for you to 128."
"NOTICE: configuration file /etc/php5/fpm/php-fpm.conf test is successful"
"WARNING: [pool vpg] listen.backlog(-1) was too low for the ondemand process
manager. I updated it for you to 128."
>From Nginx at the start of the load test :
2012/07/25 05:46:06 [error] 388#0: *4293 connect() to
unix:/run/php-fpm/vpg-fpm.socket failed (11: Resource temporarily unavailable)
while connecting to upstream, client: xxx.xxx.xxx.xxx, server: domainname.com,
request: "GET /info.php HTTP/1.1", upstream:
"fastcgi://unix:/run/php-fpm/vpg-fpm.socket:", host: "domainname.com"
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62668&edit=1