Edit report at https://bugs.php.net/bug.php?id=78825&edit=1
ID: 78825
Comment by: vibbow at hotmail dot com
Reported by: vibbow at hotmail dot com
Summary: stream_socket_client works slower than except
Status: Verified
Type: Bug
Package: Performance problem
Operating System: Windows Server 2019
PHP Version: 7.3.11
Block user comment: N
Private report: N
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[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>
------------------------------------------------------------------------
[2019-12-23 12:24:06] vibbow at hotmail dot com
My server environment is Windows server 2019 (same build number as windows 10 1809) and still can
get this reproduced.
So this issue is not strict to windows 10 1909
------------------------------------------------------------------------
[2019-12-23 12:21:44] cmb@php.net
Thanks for the update! So far I suspect Windows 10 1909 causing
the issue. Will have to check with that version.
------------------------------------------------------------------------
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