Bug #46723 [Fbk->Asn]: FastCGI is incredibly slow due to TCP ack delay
| From: | jost_boekemeier at users dot sf dot net | Date: | Thu, 26 Aug 2010 15:03:04 +0000 |
| Subject: | Bug #46723 [Fbk->Asn]: FastCGI is incredibly slow due to TCP ack delay | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-153814@lists.php.net to get a copy of this message | ||
Edit report at http://bugs.php.net/bug.php?id=46723&edit=1
ID: 46723
User updated by: jost_boekemeier at users dot sf dot net
Reported by: jost_boekemeier at users dot sf dot net
Summary: FastCGI is incredibly slow due to TCP ack delay
-Status: Feedback
+Status: Assigned
Type: Bug
Package: CGI related
Operating System: *
PHP Version: 5CVS, 6CVS (2008-12-08)
Assigned To: dmitry
Block user comment: N
New Comment:
Test machine was FC10 with a fedora-patched kernel 2.6.25.
It is possible to eliminate the ack delay on kernel-level (e.g. make
NDELAY default for local tcp connections). But in fc9, fc10 and fc11 the
problem was, and in FreeBSD the problem is, very visible.
Bridge0 was identical to Bridge except for the NDELAY patch.
An alternative approach would be to add a write cache which grows
dynamically, and which is flushed each time read() is called. But I
think this is too much overhead.
Previous Comments:
------------------------------------------------------------------------
[2010-08-25 14:55:39] dmitry@php.net
I've tested your patch on Linux 2.6.27 and it doesn't make any visible
difference.
May be you used different URLs? (In your last post JavaBridge !=
JavaBridgeO)
Also it would be better to use special programs to benchmark (e.g. ab or
http_load)
------------------------------------------------------------------------
[2010-03-20 18:41:35] jost_boekemeier at users dot sf dot net
Please excuse the delay. I didn't noticed that you were asking for a
patch.
After applying the patch fastcgi renders 900 pages in 1m8.095s, compared
to 1m40.428s before.
[notice for me]
$ time for i in
seq 900; do wget -O/dev/null -o/dev/null
http://localhost:8080/JavaBridge/sessionSharing.php;
done
real 1m40.428s
user 0m1.587s
sys 0m3.108s
$ time for i in seq 900; do wget -O/dev/null -o/dev/null
http://localhost:8080/JavaBridgeO/sessionSharing.php;
done
real 1m8.095s
user 0m1.212s
sys 0m2.485s
------------------------------------------------------------------------
[2009-01-29 01:00:16] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
------------------------------------------------------------------------
[2009-01-21 19:27:40] jani@php.net
Patches are always welcome, you don't need to wait for a request..:)
------------------------------------------------------------------------
[2008-11-30 17:42:32] jost_boekemeier at users dot sf dot net
Description:
------------
The PHP side of a socket-based FastCGI communication is unbuffered since
PHP 5.1.4 (maybe earlier).
write/write/read cycles have a huge performance impact, on the latest
Linux kernel the FastCGI SAPI is actually slower than executing a CGI
for each request!
The actual problem is caused by the two unbuffered write() operations,
which run into a delayed ack and therefore cause a latency of 40000us on
FC10 and 500ms(!) on FreeBSD.
As an immediate fix I suggest to switch on NDELAY for the PHP FastCGI
socket communication. I can provide a patch if you want me to.
Regards,
Jost Bökemeier
Reproduce code:
---------------
-
Expected result:
----------------
-
Actual result:
--------------
-
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=46723&edit=1