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