OpenSSL performance issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I think my last email was somehow lost in transition between the mail
servers so I am starting afresh if somebody can help. If you have
already taken pains to read through this mail, kindly skip to the bottom
of the mail. Thanks for your patience.

?
First let me state upfront that I am relatively very new to OpenSSL.
Also please forgive me if this is not the correct mailing list? for this issue.
?
We have a product which uses OpenSSL to connect and transfer 
application level data. There are two ways to connect, and get the application
level data from *Agent* to *Client*
?
1. Client (C/C++) -> Agent (C/C++)
2. Client (C/C++) -> Proxy Server (Java) -> Agent (C/C++)
?
*Client* and *Agent* are implemented in C, while *Proxy Server* uses Java code 
(This shouldn't really matter). But might be helpful for you to know.
The issue is, connecting *Client* to *Agent* is very fast (that is relatively). 
While connecting *Client* to *Proxy Server* is very slow - that is orders of 
magnitudes slow.
?
I was trying to determine the root cause. From my analysis is appears that, 
maximum time on the *Client* side is taken by SSL_Connect during connection 
establishment, while the actual application level data transfer takes very 
small time. Similarly, on the *Proxy Server* side (Java Code), maximum time 
is taken in the first read/write whichever happens first. Further, I don't 
think this is a network latency issue, as the problem is very pronounced 
and all the three boxes are on the same network. Also, the *Client* code 
seems to be similar, whether we connect to *Agent* (method 1 above) or 
*Proxy Server* (method 2 above). So, the issue is with *Proxy Server*, IMHO.
?
?
To further locate the issue, I did some tests using ssldump command,
?
***************************************
This is for *Client -> Agent*
***************************************
?
1 1? 0.0023 (0.0002)? C>S? Handshake
????? ClientHello
??????? Version 3.1
??????? cipher suites
??????? TLS_DHE_RSA_WITH_AES_256_CBC_SHA
??????? TLS_DHE_DSS_WITH_AES_256_CBC_SHA
??????? TLS_RSA_WITH_AES_256_CBC_SHA
??????? TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
??????? TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
??????? TLS_RSA_WITH_3DES_EDE_CBC_SHA
??????? TLS_DHE_RSA_WITH_AES_128_CBC_SHA
??????? TLS_DHE_DSS_WITH_AES_128_CBC_SHA
??????? TLS_RSA_WITH_AES_128_CBC_SHA
??????? TLS_RSA_WITH_IDEA_CBC_SHA
??????? TLS_RSA_WITH_RC4_128_SHA
??????? Unknown value 0xff
??????? compression methods
????????????????? NULL
1 2? 0.0091 (0.0068)? S>C? Handshake
????? ServerHello
??????? Version 3.1
??????? session_id[0]=
?
??????? cipherSuite???????? TLS_RSA_WITH_AES_256_CBC_SHA
??????? compressionMethod?????????????????? NULL
1 3? 0.0091 (0.0000)? S>C? Handshake
????? Certificate
1 4? 0.0091 (0.0000)? S>C? Handshake
????? CertificateRequest
??????? certificate_types?????????????????? rsa_sign
??????? certificate_types?????????????????? dss_sign
????? ServerHelloDone
1 5? 0.0104 (0.0013)? C>S? Handshake
????? Certificate
1 6? 0.0104 (0.0000)? C>S? Handshake
????? ClientKeyExchange
1 7? 0.0104 (0.0000)? C>S? ChangeCipherSpec
1 8? 0.0104 (0.0000)? C>S? Handshake
1 9? 0.0159 (0.0054)? S>C? Handshake
????? TLS_RSA_WITH_RC4_128_MD51 10 0.0159 (0.0000)? S>C? ChangeCipherSpec
1 11 0.0159 (0.0000)? S>C? Handshake
1 12 0.0163 (0.0004)? C>S? application_data
1 13 0.0174 (0.0011)? S>C? application_data
1 14 0.0176 (0.0001)? C>S? application_data
1 15 0.0186 (0.0010)? S>C? application_data
1 16 0.0189 (0.0002)? C>S? application_data
1 17 0.0200 (0.0010)? S>C? application_data
1 18 0.0203 (0.0002)? C>S? application_data
1??? 0.0205 (0.0002)? C>S? TCP FIN
1 19 0.0207 (0.0001)? S>C? Alert
1??? 0.0209 (0.0001)? S>C? TCP FIN
?
?
***************************************
This is for *Client -> Proxy Server*
***************************************
?
1 1? 0.0025 (0.0025)? C>S? Handshake
????? ClientHello
??????? Version 3.1
??????? cipher suites
??????? TLS_DHE_RSA_WITH_AES_256_CBC_SHA
??????? TLS_DHE_DSS_WITH_AES_256_CBC_SHA
??????? TLS_RSA_WITH_AES_256_CBC_SHA
??????? TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
??????? TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
??????? TLS_RSA_WITH_3DES_EDE_CBC_SHA
??????? TLS_DHE_RSA_WITH_AES_128_CBC_SHA
??????? TLS_DHE_DSS_WITH_AES_128_CBC_SHA
??????? TLS_RSA_WITH_AES_128_CBC_SHA
??????? TLS_RSA_WITH_IDEA_CBC_SHA
??????? TLS_RSA_WITH_RC4_128_SHA
??????? Unknown value 0xff
??????? compression methods
????????????????? NULL
1 2? 3.2949 (3.2923)? S>C? Handshake
????? ServerHello
??????? Version 3.1
??????? session_id[32]=
????????? 54 76 ca 2c bd 84 37 f9 98 7a b1 57 1f 61 9a 3d
????????? 40 89 58 89 e6 14 5f 39 8b 96 62 87 8f a9 30 8f
??????? cipherSuite???????? TLS_DHE_RSA_WITH_AES_256_CBC_SHA
??????? compressionMethod?????????????????? NULL
????? Certificate
????? ServerKeyExchange
????? ServerHelloDone
1 3? 3.3135 (0.0186)? C>S? Handshake
????? ClientKeyExchange
??????? DiffieHellmanClientPublicValue[96]=
????????? 9c 38 d3 b5 10 3f 4d a6 54 a9 84 02 b3 f2 25 79
????????? e1 f0 6e 6f 56 35 44 73 13 40 4e c0 6b 2a e7 64
????????? ff 4a a0 7a 34 82 1e d9 35 70 d1 43 f8 c5 18 c4
????????? 56 54 a6 32 33 bc 1a 35 62 fe 36 cc 33 f4 a0 15
????????? 6d 7a ea 5e a6 f5 d6 d7 21 45 16 30 08 2b bc e9
????????? 4c 25 32 64 b3 a3 b9 21 db 26 b1 6c 4c 92 34 aa
1 4? 3.3135 (0.0000)? C>S? ChangeCipherSpec
1 5? 3.3135 (0.0000)? C>S? Handshake
1 6? 3.3241 (0.0106)? S>C? ChangeCipherSpec
1 7? 3.3638 (0.0396)? S>C? Handshake
1 8? 3.3638 (0.0000)? S>C? application_data
1 9? 3.3646 (0.0007)? C>S? application_data
1 10 3.3646 (0.0000)? C>S? application_data
1 11 3.4196 (0.0549)? S>C? application_data
1 12 3.4196 (0.0000)? S>C? application_data
1 13 3.4270 (0.0073)? C>S? application_data
1 14 3.4271 (0.0000)? C>S? application_data
1 15 3.4271 (0.0000)? C>S? application_data
1 16 3.4646 (0.0375)? S>C? application_data
1 17 3.4646 (0.0000)? S>C? application_data
1 18 3.4649 (0.0002)? C>S? application_data
1 19 3.4649 (0.0000)? C>S? application_data
1??? 3.4652 (0.0003)? C>S? TCP FIN
1 20 3.4657 (0.0005)? S>C? Alert
1??? 3.4658 (0.0000)? S>C? TCP FIN
?
************************************************************
?
As you can see the big time difference between the two executions - which 
actually involve the same application level data. The largest chunk of 
time is spent waiting for handshake from *Proxy Server*. The response time 
of *Proxy Server* in replying back with ServerHello, varies greatly 
between 1.5 to 11 seconds across different runs. In the present case it is 
nearly 3.3 seconds - which IMO is not acceptable.


*****************************************************
Above this was previous content.


> From: owner-openssl-users at openssl.org On Behalf Of Dave Thompson

> does Proxy code do between accepting on the [SSL]ServerSocket 
> (which is Java's way of representing the listen-ing socket) and the 
> first read or write -- apparently write? One particular thing, is it 
> using BufferedReader/Writer on the socket streams? Java code 
> often does buffered because it is more efficient than going to OS 
> each time (at least for real I/O rather than ByteArray Streams).
> In that case for output you need .flush() to actually send. 
> Or you could try doing .startHandshake() explicitly as soon as 
> convenient after the .accept() and see what difference that 
> makes (although it may only move the problem elsewhere).

Thanks Dave for your pointer. The code is actually using 
BufferedReader/Writer. Further, I actually tried adding 
startHandshake() explicitly after socket accept(). However, what I 
observed is that now startHandshake() gets blocked and takes up 
the same amount of time as the first read/write used to take. After
this change, the actual read/write calls become very fast including 
the first call. So the problem it appears is in the SSL handshake 
response code from the java side. 

I am pretty sure the issue is not related to OpenSSL but in the 
java side. Further, since it is startHandshake() that is blocking for this
much time, it is not a problem with *our* Java Code. But just to be 
sure could it have anything to do with ciphers/encryption/keys etc. 
Any other pointers/help is highly appreciated.


Thanks, for reading through such a lengthy email. If anybody can kindly 
provide his inputs, or even point me in the right direction, I shall be 
highly grateful. Any other comments or suggestions are also highly 
welcome. Thanks for your patience,
?
Prabhat.

 		 	   		  


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux