[issue20924] openssl init 100% CPU utilization
Roman O. Vlasov
report at bugs.python.org
Tue Apr 8 17:10:44 CEST 2014
Roman O. Vlasov added the comment:
Antoine, Martin, thank you for your replies. You was right: NT socket was not in blocking mode (in 1st case). I didn't knew how to determine socket mode in NT, so I explicitly set socket mode to blocking in _ssl.c before calling SSL_do_handshake() for test:
_ssl.c::PySSL_SSLdo_handshake():
// ------------ Explicitly set blocking mode
unsigned long iMode = 0UL; // If iMode = 0, blocking is enabled;
int iResult = ioctlsocket( self->Socket->sock_fd, FIONBIO, &iMode );
if (iResult != NO_ERROR)
printf("\nioctlsocket failed with error: %ld\n", iResult);
// ------------
PySSL_BEGIN_ALLOW_THREADS
ret = SSL_do_handshake(self->ssl);
...
Test result: SSL_do_handshake() did not return (and no CPU load).
But in general, I think that check_socket_and_wait_for_timeout() logic is erroneous:
if (s->sock_timeout < 0.0)
return SOCKET_IS_BLOCKING;
By default (see case #1 in my message above), timeout in Python wrapping object is -1 (self->Socket->sock_timeout==-1). But underlying NT socket is really non-blocking. This leads to 100% CPU load: PySSL_SSLdo_handshake() loop is calling check_socket_and_wait_for_timeout() which immediately returns.
NB. I use Python 2.7.6 and openssl-0.9.8y for my build and never tried Python 3.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue20924>
_______________________________________
More information about the Python-bugs-list
mailing list