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