Bug #78825 [Ver]: stream_socket_client works slower than expect

From: Date: Sat, 18 Jan 2020 17:50:36 +0000
Subject: Bug #78825 [Ver]: stream_socket_client works slower than expect
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-224974@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78825&edit=1

 ID:                 78825
 User updated by:    vibbow at hotmail dot com
 Reported by:        vibbow at hotmail dot com
-Summary:            stream_socket_client works slower than except
+Summary:            stream_socket_client works slower than expect
 Status:             Verified
 Type:               Bug
 Package:            Performance problem
 Operating System:   Windows Server 2019
-PHP Version:        7.3.11
+PHP Version:        7.4.1
 Block user comment: N
 Private report:     N

 New Comment:

Can still be reproduced in PHP 7.4.1


Previous Comments:
------------------------------------------------------------------------
[2020-01-09 14:43:22] vibbow at hotmail dot com

Above registry modify only take effect on some of my PC, not all of them.

There must be something else affect this.

------------------------------------------------------------------------
[2020-01-09 13:58:19] vibbow at hotmail dot com

I think I found a workaround for this issue:

https://www.fixwindowserrors.biz/blog/disable-nagle-algorithm-in-windows-10

Add TcpAckFrequency and TCPNoDelay to registry (to disable TCP_NODELAY) did solve the problem.


So this issue is related to TCP_NODELAY feature.

------------------------------------------------------------------------
[2020-01-02 16:32:03] cmb@php.net

If this performance issue affects PECL/redis, I suggest that you
file that as issue there; at least the maintainers would become
aware of that, and maybe one of them would have a look at the
issue in the PHP stream layer.

------------------------------------------------------------------------
[2020-01-02 12:39:31] vibbow at hotmail dot com

This bug also effect some pecl extension whom use stream_socket_client to create connection.

The one I know is redis extension.

------------------------------------------------------------------------
[2020-01-02 12:34:00] cmb@php.net

In the meantime (for whatever reason) I have been able to
reproduce a noticeable performance difference.

The relevant difference between socket_connect() and the
respective part of stream_socket_client() appears to be that the
latter switches the socket to non-blocking mode before
connect()[1], and then poll()s to wait for the connection to be
established.  Since there is no poll() on Windows, an emulation[2]
is used, which might explain the performance difference.  However,
if I enforce using the poll emulation on Linux, that's only
marginally slower.  If I skip setting the socket non-blocking,
performance is very close to socket_connect(), but doing so would
ignore configured timeouts, and as such is not an option.

Another noteworthy difference is that Windows explicitly calls
shutdown() and poll() before closesocket() is called[3].

This issue certainly deserves further investigation, but doesn't
appear of high priority, so I'm unassigning myself for now.  Maybe
someone else has some time to look into this?

[1] <https://github.com/php/php-src/blob/php-7.3.13/main/network.c#L306>
[2] <https://github.com/php/php-src/blob/php-7.3.13/main/network.c#L1197>
[3] <https://github.com/php/php-src/blob/php-7.3.13/main/streams/xp_socket.c#L201-L212>

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=78825


--
Edit this bug report at https://bugs.php.net/bug.php?id=78825&edit=1


Thread (24 messages)

« previous php.bugs (#224974) next »