[gnutls-dev] future optimizations

Nikos Mavroyanopoulos nmav@gnutls.org
Mon Mar 25 20:17:01 2002


 Although it's too soon for this, I've been doing some profiling tests with the 
current version of gnutls (server). As I was expecting it, the RSA 
(DHE_RSA is much slower[0]) calculation has a great percentence of the total 
server time (65%).

 Other than that I discovered that the _gnutls_supported_ciphersuites()[1]
function took about 8% of the time. This is because the priority in
gnutls is set per state, and it involves algorithms instead of TLS
cipher suites. Unfortunately this cannot be optimized unless I change
the way gnutls_*_priority work, thus I think it'd be better to postpone
it for a future release (0.5.0 probably, but I haven't made my mind yet). 

 Other possible optimizations might be using alloca() instead of 
malloc() in some functions, but I do not know how portable is it.

 In any case we seem to have about the 1/10 of the openssl speed[2]
in the (server side) handshake procedure, thus we need a lot of work.


[0]. There are optimizations though (such as precalculating the signature),
which are easy to add, and will be added soon after 0.4.0.
[1]. This one calls _gnutls_cipher_suite_count() and _gnutls_cipher_suite_is_ok()
 many times.
[2]. This is only in single threaded servers, but I'm not sure if the server 
type was the same (gnutls was running in a non blocking server, openssl was used
with the included s_server command).


I attach the output of fcdump.

FunctionCheck V3.0 by Y.Perret
Total time spend in this processus is 583.099597
606 arc(s), 304 function(s) (304 shown, 0 hidden), 6 library(ies)


     total   |     local   |     total     |     local     |   #   |function
 time  |  %  | time  |  %  |  min  |  max  |  min  |  max  | calls |  name
-------|-----|-------|-----|-------|-------|-------|-------|-------|--------
 583.07|100.0|   3.68|  0.6| 583.07| 583.07|   3.68|   3.68|      1| main
 542.50| 93.0|   0.27|  0.0|   0.03|   0.31|   0.00|   0.00|   2562| gnutls_handshake
 475.18| 81.5|   0.45|  0.1|   0.03|   0.28|   0.00|   0.00|   2562| gnutls_handshake_server
 391.93| 67.2|   0.16|  0.0|   0.15|   0.22|   0.00|   0.00|   2561| _gnutls_recv_client_kx_message
 386.49| 66.3|   0.26|  0.0|   0.15|   0.22|   0.00|   0.00|   2561| proc_rsa_client_kx
 385.13| 66.0|   0.39|  0.1|   0.15|   0.22|   0.00|   0.00|   2561| _gnutls_pkcs1_rsa_decrypt
 383.13| 65.7| 377.73| 64.8|   0.14|   0.22|   0.14|   0.22|   2561| _gnutls_pk_encrypt
  72.68| 12.5|   0.59|  0.1|   0.00|   0.09|   0.00|   0.00|   7684| _gnutls_recv_handshake
  66.08| 11.3|   0.20|  0.0|   0.02|   0.09|   0.00|   0.00|   2561| gnutls_handshake_common
  53.33|  9.1|   0.07|  0.0|   0.01|   0.09|   0.00|   0.00|   2562| _gnutls_recv_hello
  53.26|  9.1|   0.46|  0.1|   0.01|   0.09|   0.00|   0.00|   2562| _gnutls_read_client_hello
  47.87|  8.2|   0.33|  0.1|   0.01|   0.09|   0.00|   0.00|   2561| _gnutls_server_select_suite
  44.98|  7.7|   2.81|  0.5|   0.00|   0.07|   0.00|   0.00|  17922| gnutls_send_int
  44.46|  7.6|   0.20|  0.0|   0.02|   0.08|   0.00|   0.00|   2561| _gnutls_recv_handshake_final
  44.09|  7.6|   3.11|  0.5|   0.01|   0.08|   0.00|   0.02|   2561| _gnutls_supported_ciphersuites
  37.75|  6.5|  18.35|  3.1|   0.01|   0.08|   0.00|   0.07|   2561| _gnutls_cipher_suite_count
  26.13|  4.5|   0.89|  0.2|   0.00|   0.07|   0.00|   0.00|  10244| _gnutls_send_handshake
  25.40|  4.4|  15.69|  2.7|   0.00|   0.04|   0.00|   0.04| 524957| gnutls_free
  25.04|  4.3|   3.15|  0.5|   0.00|   0.07|   0.00|   0.00|  30731| gnutls_recv_int
  22.77|  3.9|   0.47|  0.1|   0.00|   0.05|   0.00|   0.00|   5122| gnutls_ssl3_generate_random
  22.45|  3.8|   7.04|  1.2|   0.00|   0.04|   0.00|   0.04|  92184| gnutls_hash_deinit
  22.23|  3.8|   2.15|  0.4|   0.00|   0.04|   0.00|   0.00|  20488| ssl3_md5
  21.96|  3.8|   0.30|  0.1|   0.00|   0.07|   0.00|   0.00|  10244| _gnutls_handshake_io_send_int
  21.75|  3.7|   0.82|  0.1|   0.00|   0.02|   0.00|   0.00|  17922| _gnutls_io_write_buffered2
  20.93|  3.6|  20.93|  3.6|   0.00|   0.02|   0.00|   0.02|  17922| _gnutls_io_write_buffered
  20.38|  3.5|   0.41|  0.1|   0.01|   0.02|   0.00|   0.00|   2558| listener_free
  19.41|  3.3|  19.41|  3.3|   0.00|   0.01|   0.00|   0.01|1311232| _gnutls_cipher_suite_is_ok
  18.17|  3.1|   0.17|  0.0|   0.01|   0.07|   0.00|   0.00|   2561| _gnutls_send_handshake_final
  17.95|  3.1|   0.64|  0.1|   0.01|   0.05|   0.00|   0.00|   2561| _gnutls_read_connection_state_init
  17.50|  3.0|   1.02|  0.2|   0.00|   0.07|   0.00|   0.00|  17922| _gnutls_encrypt
  15.96|  2.7|   3.71|  0.6|   0.00|   0.07|   0.00|   0.00|  17922| _gnutls_compressed2TLSCiphertext
  15.74|  2.7|   0.58|  0.1|   0.00|   0.07|   0.00|   0.00|  23052| _gnutls_handshake_io_recv_int
  15.67|  2.7|   0.20|  0.0|   0.01|   0.05|   0.00|   0.00|   2561| _gnutls_set_read_keys
  15.40|  2.6|   0.36|  0.1|   0.00|   0.05|   0.00|   0.00|   5122| _gnutls_set_keys
  14.62|  2.5|   0.40|  0.1|   0.00|   0.07|   0.00|   0.00|   7684| _gnutls_recv_handshake_header
  14.56|  2.5|   0.24|  0.0|   0.01|   0.07|   0.00|   0.00|   2561| _gnutls_recv_finished
  14.20|  2.4|   0.10|  0.0|   0.01|   0.01|   0.00|   0.00|   2558| gnutls_bye
  14.10|  2.4|   0.10|  0.0|   0.00|   0.01|   0.00|   0.00|   2558| gnutls_alert_send
  12.37|  2.1|   0.21|  0.0|   0.00|   0.07|   0.00|   0.00|   2561| _gnutls_send_finished
  11.75|  2.0|   8.69|  1.5|   0.00|   0.06|   0.00|   0.06|  99870| gnutls_hash_init
  11.19|  1.9|   0.49|  0.1|   0.00|   0.07|   0.00|   0.00|  12805| _gnutls_decrypt
  11.13|  1.9|   1.92|  0.3|   0.00|   0.04|   0.00|   0.00|  20488| ssl3_sha
  10.95|  1.9|   0.56|  0.1|   0.00|   0.06|   0.00|   0.00|   5122| _gnutls_ssl3_finished
  10.77|  1.8|   1.64|  0.3|   0.00|   0.00|   0.00|   0.00|  12799| gnutls_mac_deinit_ssl3
  10.53|  1.8|   2.53|  0.4|   0.00|   0.07|   0.00|   0.06|  12805| _gnutls_ciphertext2TLSCompressed
  10.50|  1.8|   0.07|  0.0|   0.00|   0.04|   0.00|   0.00|   2561| _gnutls_send_empty_handshake
   9.31|  1.6|   0.08|  0.0|   0.00|   0.01|   0.00|   0.00|   2561| _gnutls_connection_state_init
   9.29|  1.6|   1.65|  0.3|   0.00|   0.06|   0.00|   0.00|  10244| gnutls_mac_deinit_ssl3_handshake
   9.23|  1.6|   0.08|  0.0|   0.00|   0.01|   0.00|   0.00|   2561| _gnutls_generate_master
   9.15|  1.6|   0.16|  0.0|   0.00|   0.01|   0.00|   0.00|   2561| generate_normal_master
   7.61|  1.3|   0.17|  0.0|   0.00|   0.07|   0.00|   0.00|   5118| gnutls_record_recv
   6.67|  1.1|   0.07|  0.0|   0.00|   0.07|   0.00|   0.00|   2561| _gnutls_send_hello
   6.65|  1.1|   0.15|  0.0|   0.00|   0.07|   0.00|   0.03|   2559| gnutls_record_send
   6.60|  1.1|   0.29|  0.0|   0.00|   0.07|   0.00|   0.00|   2561| _gnutls_send_server_hello
   6.56|  1.1|   0.15|  0.0|   0.00|   0.01|   0.00|   0.00|   2561| _gnutls_send_server_certificate
   6.47|  1.1|   6.47|  1.1|   0.00|   0.04|   0.00|   0.04| 507625| gnutls_malloc
   5.78|  1.0|   1.45|  0.2|   0.00|   0.02|   0.00|   0.00|   2558| gnutls_deinit
   5.61|  1.0|   5.61|  1.0|   0.00|   0.00|   0.00|   0.00| 263753| gnutls_hash
   5.29|  0.9|   5.29|  0.9|   0.00|   0.02|   0.00|   0.02| 512151| _gnutls_free
   4.87|  0.8|   4.87|  0.8|   0.00|   0.00|   0.00|   0.00| 507047| _gnutls_is_secure_memory
   3.76|  0.6|   3.37|  0.6|   0.00|   0.04|   0.00|   0.03|   5123| _gnutls_get_random
   3.74|  0.6|   1.22|  0.2|   0.00|   0.00|   0.00|   0.00|  30727| gnutls_mac_init_ssl3
   3.11|  0.5|   1.22|  0.2|   0.00|   0.06|   0.00|   0.00|  28168| _gnutls_io_read_buffered
   2.90|  0.5|   0.09|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_send_change_cipher_spec
   2.83|  0.5|   1.21|  0.2|   0.00|   0.00|   0.00|   0.00|  30731| _gnutls_check_buffers
   2.73|  0.5|   0.66|  0.1|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_write_connection_state_init
   2.58|  0.4|   0.46|  0.1|   0.00|   0.05|   0.00|   0.00|   2561| _gnutls_remove_unwanted_ciphersuites
   2.29|  0.4|   0.12|  0.0|   0.00|   0.03|   0.00|   0.00|   2562| _gnutls_create_random
   2.13|  0.4|   0.58|  0.1|   0.00|   0.00|   0.00|   0.00|  10244| _gnutls_handshake_hash_add_sent
   2.07|  0.4|   1.41|  0.2|   0.00|   0.06|   0.00|   0.06|  53780| gnutls_realloc_fast
   2.07|  0.4|   0.40|  0.1|   0.00|   0.00|   0.00|   0.00|   7684| _gnutls_handshake_hash_add_recvd
   2.01|  0.3|   0.65|  0.1|   0.00|   0.00|   0.00|   0.00|  23025| gnutls_sfree_datum
   1.99|  0.3|   0.92|  0.2|   0.00|   0.07|   0.00|   0.06|   2561| _gnutls_gen_extensions
   1.99|  0.3|   1.06|  0.2|   0.00|   0.00|   0.00|   0.00|  20489| _gnutls_handshake_hash_pending
   1.90|  0.3|   1.90|  0.3|   0.00|   0.00|   0.00|   0.00| 112672| gnutls_hash_get_algo_len
   1.86|  0.3|   0.89|  0.2|   0.00|   0.02|   0.00|   0.02|  40953| _gnutls_mpi_release
   1.75|  0.3|   0.25|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_server_register_current_session
   1.70|  0.3|   0.07|  0.0|   0.00|   0.04|   0.00|   0.00|   2561| _gnutls_generate_session_id
   1.66|  0.3|   0.70|  0.1|   0.00|   0.00|   0.00|   0.00|  25612| _gnutls_record_buffer_get
   1.55|  0.3|   0.72|  0.1|   0.00|   0.00|   0.00|   0.00|  20471| gnutls_secure_free
   1.53|  0.3|   0.37|  0.1|   0.00|   0.00|   0.00|   0.00|   2563| initialize_state
   1.50|  0.3|   0.17|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_handshake_hash_buffers_clear
   1.19|  0.2|   1.19|  0.2|   0.00|   0.07|   0.00|   0.07|  51196| gnutls_hmac
   1.18|  0.2|   0.54|  0.1|   0.00|   0.00|   0.00|   0.00|  17927| gnutls_sset_datum
   1.04|  0.2|   1.04|  0.2|   0.00|   0.00|   0.00|   0.00|  74258| gnutls_protocol_get_version
   1.03|  0.2|   0.46|  0.1|   0.00|   0.04|   0.00|   0.04|   2561| _gnutls_cert_supported_kx
   0.97|  0.2|   0.97|  0.2|   0.00|   0.00|   0.00|   0.00|  66586| _gnutls_cipher_suite_get_kx_algo
   0.95|  0.2|   0.95|  0.2|   0.00|   0.00|   0.00|   0.00|  69147| _gnutls_cipher_suite_get_version
   0.94|  0.2|   0.55|  0.1|   0.00|   0.00|   0.00|   0.00|  10244| gnutls_hash_copy
   0.94|  0.2|   0.40|  0.1|   0.00|   0.00|   0.00|   0.00|  15368| _gnutls_handshake_buffer_put
   0.93|  0.2|   0.62|  0.1|   0.00|   0.00|   0.00|   0.00|  25613| gnutls_datum_append
   0.93|  0.2|   0.26|  0.0|   0.00|   0.00|   0.00|   0.00|  10244| _gnutls_record_check_type
   0.87|  0.1|   0.07|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_gen_cert_server_certificate
   0.87|  0.1|   0.87|  0.1|   0.00|   0.00|   0.00|   0.00|  74251| _gnutls_malloc_ptr_size
   0.85|  0.1|   0.10|  0.0|   0.00|   0.00|   0.00|   0.00|   2562| _gnutls_handshake_hash_init
   0.83|  0.1|   0.49|  0.1|   0.00|   0.00|   0.00|   0.00|  12805| _gnutls_check_record_headers
   0.80|  0.1|   0.19|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_gen_x509_certificate
   0.79|  0.1|   0.75|  0.1|   0.00|   0.00|   0.00|   0.00|  33288| _gnutls_read
   0.73|  0.1|   0.29|  0.0|   0.00|   0.00|   0.00|   0.00|   2563| gnutls_init
   0.73|  0.1|   0.50|  0.1|   0.00|   0.00|   0.00|   0.00|  20489| gnutls_secure_malloc
   0.72|  0.1|   0.22|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_session_pack
   0.71|  0.1|   0.64|  0.1|   0.00|   0.00|   0.00|   0.00|   5122| gnutls_cipher_init
   0.70|  0.1|   0.70|  0.1|   0.00|   0.00|   0.00|   0.00|  51210| _gnutls_version_get_major
   0.69|  0.1|   0.69|  0.1|   0.00|   0.00|   0.00|   0.00|  51210| _gnutls_version_get_minor
   0.69|  0.1|   0.41|  0.1|   0.00|   0.00|   0.00|   0.00|  10244| _gnutls_get_kx_cred
   0.68|  0.1|   0.68|  0.1|   0.00|   0.00|   0.00|   0.00|  53782| _gnutls_record_buffer_get_size
   0.67|  0.1|   0.67|  0.1|   0.00|   0.07|   0.00|   0.07|  43537| _gnutls_ext_func_send
   0.67|  0.1|   0.27|  0.0|   0.00|   0.00|   0.00|   0.00|  10244| _gnutls_record_buffer_put
   0.67|  0.1|   0.67|  0.1|   0.00|   0.00|   0.00|   0.00|  48659| _gnutls_kx_priority
   0.64|  0.1|   0.64|  0.1|   0.00|   0.00|   0.00|   0.00|  43548| gnutls_realloc
   0.63|  0.1|   0.42|  0.1|   0.00|   0.00|   0.00|   0.00|  15366| WRITEuint24
   0.63|  0.1|   0.26|  0.0|   0.00|   0.00|   0.00|   0.00|   5116| gnutls_comp_deinit
   0.61|  0.1|   0.41|  0.1|   0.00|   0.00|   0.00|   0.00|  20471| _gnutls_secure_ptr_size
   0.59|  0.1|   0.59|  0.1|   0.00|   0.00|   0.00|   0.00|  46095| _gnutls_session_is_valid
   0.57|  0.1|   0.57|  0.1|   0.00|   0.00|   0.00|   0.00|  40971| _gnutls_mac_get_digest_size
   0.50|  0.1|   0.50|  0.1|   0.00|   0.06|   0.00|   0.06|  30727| CONVuint64
   0.49|  0.1|   0.14|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_server_select_comp_method
   0.48|  0.1|   0.48|  0.1|   0.00|   0.00|   0.00|   0.00|  33286| _gnutls_cipher_is_block
   0.46|  0.1|   0.31|  0.1|   0.00|   0.00|   0.00|   0.00|  12805| _gnutls_check_record_version
   0.46|  0.1|   0.17|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_session_size
   0.46|  0.1|   0.25|  0.0|   0.00|   0.00|   0.00|   0.00|   2561| _gnutls_find_pk_algos_in_ciphersuites
   0.43|  0.1|   0.43|  0.1|   0.00|   0.00|   0.00|   0.00|  30727| _gnutls_cipher_get_block_size
   0.43|  0.1|   0.34|  0.1|   0.00|   0.00|   0.00|   0.00|  17922| _gnutls_create_empty_record
   0.43|  0.1|   0.43|  0.1|   0.00|   0.00|   0.00|   0.00|  30732| _gnutls_map_kx_get_cred
   0.42|  0.1|   0.42|  0.1|   0.00|   0.00|   0.00|   0.00|  30727| CONVuint16
   0.42|  0.1|   0.25|  0.0|   0.00|   0.00|   0.00|   0.00|   5122| gnutls_auth_get_type
   0.40|  0.1|   0.24|  0.0|   0.00|   0.00|   0.00|   0.00|   5122| _gnutls_set_kx
   0.40|  0.1|   0.40|  0.1|   0.00|   0.00|   0.00|   0.00|  28166| uint64pp
   0.39|  0.1|   0.15|  0.0|   0.00|   0.00|   0.00|   0.00|   5116| gnutls_cipher_deinit
   0.38|  0.1|   0.38|  0.1|   0.00|   0.00|   0.00|   0.00|  17922| gnutls_cipher_encrypt

[...]

-- 
Nikos Mavroyanopoulos
mailto:nmav@gnutls.org