Pour ceux qui ne connaissent pas: LAppS - Lua Application Server , c'est presque comme nginx ou apache, mais uniquement pour le protocole WebSocket, au lieu de HTTP.
HTTP n'est pris en charge qu'au niveau de la demande de mise à niveau.
LAppS a été initialement affiné pour une charge élevée et une évolutivité verticale, et aujourd'hui, il a atteint le sommet de ses capacités sur mon matériel (enfin, presque, vous pouvez optimiser davantage, mais ce sera un travail long et dur).
Plus important encore, LAppS en termes de performances de pile WebSocket a dépassé la bibliothèque uWebSockets, qui se positionne comme l'implémentation WebSocket la plus rapide.
Intéressé s'il vous plaît sous cat.
Cela fait quelques mois depuis mon dernier article LAppS , cet article n'a pas suscité d'intérêt. J'espère que cet article semble plus intéressant pour Khabrovites. LAppS au cours de cette période a fait un chemin assez difficile vers la version 0.7.0, surchargé de fonctionnalités et a augmenté en termes de performances (ce qui avait été promis plus tôt).
L'une des fonctionnalités qui est apparue: un module chargeable avec l'implémentation de la partie client du protocole WebSocket, - cws.
Grâce à ce module, j'ai finalement pu tout extraire de mon ordinateur personnel et charger LAppS pour de vrai.
Des tests antérieurs ont été effectués en utilisant le client ebs de la bibliothèque websocketpp (plus de détails peuvent être trouvés sur la page du projet github), qui est non seulement lent, mais aussi difficile à paralléliser. Les tests ont été effectués simplement: un groupe de clients a commencé, les résultats de chaque client ont été collectés à l'aide de awk, et une simple arithmétique a donné des résultats de performance. Les résultats sont les suivants:
Serveur | Nombre de clients | Serveur RPS | RPS par client | charge utile (octets) |
---|
LAppS 0.7.0 | 240 | 84997 | 354.154 | 128 |
uWebSockets (dernière) | 240 | 74172,7 | 309.053 | 128 |
LAppS 0.7.0 | 240 | 83627.4 | 348.447 | 512 |
uWebSockets (dernière) | 240 | 71024.4 | 295.935 | 512 |
LAppS 0.7.0 | 240 | 79270.1 | 330.292 | 1024 |
uWebSockets (dernière) | 240 | 66499.8 | 277.083 | 1024 |
LAppS 0.7.0 | 240 | 51621 | 215.087 | 8192 |
uWebSockets (dernière) | 240 | 45341,6 | 188,924 | 8192 |
Dans ce test, ainsi que dans le nombre de paquets suivants, il est en fait deux fois plus élevé. la mesure est effectuée sur on_message et dans la méthode on_message du client, un nouveau paquet de la même taille est envoyé. C'est-à-dire la demande du client et la réponse du serveur sont de la même taille, et si vous considérez la quantité de trafic traitée par le serveur, vous devez doubler le résultat RPS en multipliant par la charge utile et en négligeant les en-têtes, vous pouvez obtenir une quantité approximative de trafic en octets.
De toute évidence, avec le fonctionnement simultané de 240 processus clients, LAppS lui-même (comme uWebSockets) n'a plus beaucoup de ressources CPU.
J'ai examiné plusieurs implémentations client pour WebSocket sous Lua, et malheureusement je n'ai pas trouvé de module simple et suffisamment productif avec lequel je pouvais charger LAppS correctement. Par conséquent, comme d'habitude, votre vélo a fait.
Le module a une interface assez simple et imite le comportement de l' API WebSocket du navigateur
Un exemple simple de la façon de travailler avec ce module (un service pour recevoir des transactions avec BitMEX):
Texte masquébitmex={} bitmex.__index=bitmex bitmex.init=function() end - bitmex.run=function()
Je vous préviens immédiatement, le module est apparu seulement aujourd'hui et il est mal testé.
Pour les tests, j'ai écrit un service simple pour LAppS et l'ai appelé le même benchmark sans prétention.
Ce service crée au départ 100 connexions au serveur d'écho WebSocket (peu importe lequel), et si la connexion réussit, il envoie un message de 1 Ko. Lors de la réception d'un message du serveur, il le renvoie.
Mon ordinateur personnel: processeur Intel® Core (TM) i7-7700 à 3,60 GHz, microcode 0x5e
Mémoire: DIMM DDR4 synchrone sans tampon (non enregistré) 2400 MHz (0,4 ns), Kingston KHX2400C15 / 16G
Tous les tests ont été effectués sur cet hôte local.
Configuration de l' écho de service dans LAppS:
"echo": { "auto_start": true, "instances": 2, "internal": false, "max_inbound_message_size": 16777216, "preload": null, "protocol": "raw", "request_target": "/echo" }
Le paramètre instances nécessite LAppS pour démarrer deux services d'écho parallèles.
Configuration du service de référence (client):
"benchmark" : { "auto_start" : true, "instances": 4, "internal": true, "preload" : [ "cws", "time" ] }
Au début, 4 instances de référence de service sont créées
Résultat avec TLS activé
Serveur | Nombre de clients | Serveur RPS | RPS par client | charge utile (octets) |
---|
LAppS 0.7.0-Upstream | 400 | 257828 | 644,57 | 1024 |
nginx & lua-resty-websocket 4 travailleurs | 400 | 33788 | 84,47 | 1024 |
websocketpp | 400 | 9789,52 | 24,47 | 1024 |
uWebSockets n'a pas réussi jusqu'à présent à tester - la prise de contact TLS jure sur SSLv3 (mon client utilise TLSv1.2 et est découpé dans le libreSSL SSLv3 que j'utilise).
Résultat sans TLS
Serveur | Nombre de clients | Serveur RPS | RPS par client | charge utile (octets) |
---|
LAppS 0.7.0-amont | 400 | 439700 | 1099,25 | 1024 |
uWebSockets-upstream | 400 | 247549 | 618,87 | 1024 |
Pourquoi dans la rubrique "un demi-million" de messages, et dans le test 257828? Parce qu'il y a deux fois plus de messages (comme expliqué ci-dessus).
uWebsockets, montre des résultats peu enviables dans ce test, uniquement parce qu'il fonctionne sur le 1er noyau, la version multi-thread de uWebSockets du référentiel de projet ne fonctionne pas réellement, et lorsque TLS est activé, il a une course de données dans la pile OpenSSL.
Si vous imaginez que uWebSockets fonctionne correctement sur 2 cœurs (comme 2 services d'écho LAppS), alors il peut être conditionnellement réglé sur 495098 RPS (il suffit de doubler le résultat du tableau).
Mais vous devez considérer que le serveur d'écho ( uWebSockets ) ne fait rien avec les données reçues, mais les renvoie immédiatement. LAppS transmet les données à la pile Lua correspondant au service.
Quoi de neuf dans LAppS
- Module d'authentification PAM pam_auth
- Module de file d'attente de messages: mqr - pour échanger des messages entre les services au sein du même serveur LAppS (pour l'échange multi-serveur, vous devez utiliser quelque chose déjà existant, par exemple: RabbitMQ, mosquitto, etc.)
- Connexions réseau ACL
Tout cela peut être trouvé sur la page wiki du projet.
Eh bien, pour une collation, pour les connaisseurs, que fait exactement LAppS pendant ces tests.
Sans TLS
Texte masqué iptables. 4.98% lapps [ip_tables] [k] ipt_do_table 3.80% lapps [kernel.vmlinux] [.] syscall_return_via_sysret Lua 3.52% lapps libluajit-5.1.so.2.0.5 [.] lj_str_new WebSocket 1.96% lapps lapps [.] WSStreamProcessing::WSStreamServerParser::parse 1.88% lapps [kernel.vmlinux] [k] copy_user_enhanced_fast_string 1.81% lapps [kernel.vmlinux] [k] __fget 1.61% lapps [kernel.vmlinux] [k] tcp_ack 1.49% lapps [kernel.vmlinux] [k] _raw_spin_lock_irqsave 1.48% lapps [kernel.vmlinux] [k] sys_epoll_ctl 1.45% lapps [xt_tcpudp] [k] tcp_mt LAppS 1.35% lapps lapps [.] LAppS::IOWorker<false, true>::execute 1.28% lapps lapps [.] cws_eventloop ... 1.27% lapps [nf_conntrack] [k] __nf_conntrack_find_get.isra.11 1.14% lapps [kernel.vmlinux] [k] __inet_lookup_established 1.14% lapps libluajit-5.1.so.2.0.5 [.] lj_BC_TGETS C++ 1.01% lapps lapps [.] LAppS::Application<false, true, (abstract::Application::Protocol)0>::execute ... 0.98% lapps [kernel.vmlinux] [k] ep_send_events_proc 0.98% lapps [kernel.vmlinux] [k] tcp_recvmsg 0.96% lapps libc-2.26.so [.] __memmove_avx_unaligned_erms 0.93% lapps libc-2.26.so [.] malloc 0.92% lapps [kernel.vmlinux] [k] tcp_transmit_skb 0.88% lapps [kernel.vmlinux] [k] sock_poll 0.85% lapps [nf_conntrack] [k] nf_conntrack_in 0.83% lapps [nf_conntrack] [k] tcp_packet 0.79% lapps [kernel.vmlinux] [k] do_syscall_64 0.78% lapps [kernel.vmlinux] [k] ___slab_alloc 0.78% lapps [kernel.vmlinux] [k] _raw_spin_lock_bh 0.73% lapps libc-2.26.so [.] _int_free 0.69% lapps [kernel.vmlinux] [k] __slab_free 0.66% lapps libcryptopp.so.5.6.5 [.] CryptoPP::Rijndael::Base::UncheckedSetKey 0.66% lapps [kernel.vmlinux] [k] tcp_write_xmit 0.65% lapps [kernel.vmlinux] [k] sock_def_readable 0.65% lapps [kernel.vmlinux] [k] tcp_sendmsg_locked 0.64% lapps libc-2.26.so [.] vfprintf ( - bemchmark) 0.64% lapps lapps [.] LAppS::ClientWebSocket::send ... 0.64% lapps [kernel.vmlinux] [k] tcp_v4_rcv 0.63% lapps [kernel.vmlinux] [k] __alloc_skb 0.61% lapps lapps [.] std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release 0.61% lapps [kernel.vmlinux] [k] _raw_spin_lock 0.60% lapps libc-2.26.so [.] __memset_avx2_unaligned_erms 0.60% lapps [kernel.vmlinux] [k] kmem_cache_alloc_node 0.59% lapps libluajit-5.1.so.2.0.5 [.] lj_tab_get 0.59% lapps [kernel.vmlinux] [k] __local_bh_enable_ip 0.58% lapps [kernel.vmlinux] [k] __dev_queue_xmit 0.57% lapps [kernel.vmlinux] [k] nf_hook_slow 0.55% lapps [kernel.vmlinux] [k] ep_poll_callback 0.55% lapps [kernel.vmlinux] [k] skb_release_data 0.54% lapps [kernel.vmlinux] [k] native_queued_spin_lock_slowpath 0.54% lapps libc-2.26.so [.] cfree@GLIBC_2.2.5 0.53% lapps [kernel.vmlinux] [k] ip_finish_output2 0.49% lapps libluajit-5.1.so.2.0.5 [.] lj_BC_RET 0.49% lapps libc-2.26.so [.] __strlen_avx2 0.48% lapps [kernel.vmlinux] [k] _raw_spin_unlock_irqrestore
Nous trouverons 10 différences lors de l'utilisation de TLS
Texte masqué 3.73% lapps [kernel.vmlinux] [k] syscall_return_via_sysret 3.49% lapps libcrypto.so.43.0.1 [.] gcm_ghash_clmul 3.42% lapps libcrypto.so.43.0.1 [.] aesni_ctr32_encrypt_blocks 2.74% lapps [ip_tables] [k] ipt_do_table 2.17% lapps libluajit-5.1.so.2.0.5 [.] lj_str_new 1.41% lapps libpthread-2.26.so [.] __pthread_mutex_lock 1.34% lapps libssl.so.45.0.1 [.] tls1_enc 1.32% lapps [kernel.vmlinux] [k] __fget 1.16% lapps libcrypto.so.43.0.1 [.] getrn 1.06% lapps libc-2.26.so [.] __memmove_avx_unaligned_erms 1.06% lapps lapps [.] WSStreamProcessing::WSStreamServerParser::parse 1.05% lapps [kernel.vmlinux] [k] tcp_ack 1.02% lapps [kernel.vmlinux] [k] copy_user_enhanced_fast_string 1.02% lapps [nf_conntrack] [k] __nf_conntrack_find_get.isra.11 0.98% lapps lapps [.] cws_eventloop 0.98% lapps [kernel.vmlinux] [k] native_queued_spin_lock_slowpath 0.93% lapps libcrypto.so.43.0.1 [.] aead_aes_gcm_open 0.92% lapps lapps [.] LAppS::IOWorker<true, true>::execute 0.91% lapps [kernel.vmlinux] [k] tcp_recvmsg 0.89% lapps [kernel.vmlinux] [k] sys_epoll_ctl 0.88% lapps libcrypto.so.43.0.1 [.] aead_aes_gcm_seal 0.84% lapps [kernel.vmlinux] [k] do_syscall_64 0.82% lapps [kernel.vmlinux] [k] __inet_lookup_established 0.82% lapps [kernel.vmlinux] [k] tcp_transmit_skb 0.79% lapps libpthread-2.26.so [.] __pthread_mutex_unlock_usercnt 0.77% lapps [kernel.vmlinux] [k] _raw_spin_lock_irqsave 0.76% lapps [xt_tcpudp] [k] tcp_mt 0.71% lapps libcrypto.so.43.0.1 [.] aesni_encrypt 0.70% lapps [kernel.vmlinux] [k] _raw_spin_lock 0.67% lapps [kernel.vmlinux] [k] ep_send_events_proc 0.66% lapps libcrypto.so.43.0.1 [.] ERR_clear_error 0.63% lapps [kernel.vmlinux] [k] sock_def_readable 0.62% lapps lapps [.] LAppS::Application<true, true, (abstract::Application::Protocol)0>::execute 0.61% lapps libc-2.26.so [.] malloc 0.61% lapps [nf_conntrack] [k] nf_conntrack_in 0.58% lapps libssl.so.45.0.1 [.] ssl3_read_bytes 0.58% lapps libluajit-5.1.so.2.0.5 [.] lj_BC_TGETS 0.57% lapps [kernel.vmlinux] [k] tcp_write_xmit 0.56% lapps libssl.so.45.0.1 [.] do_ssl3_write 0.55% lapps [kernel.vmlinux] [k] __netif_receive_skb_core 0.54% lapps [kernel.vmlinux] [k] ___slab_alloc 0.54% lapps libc-2.26.so [.] __memset_avx2_unaligned_erms 0.51% lapps [kernel.vmlinux] [k] _raw_spin_lock_bh 0.51% lapps libcrypto.so.43.0.1 [.] gcm_gmult_clmul 0.51% lapps [kernel.vmlinux] [k] sock_poll 0.48% lapps [nf_conntrack] [k] tcp_packet 0.48% lapps libc-2.26.so [.] cfree@GLIBC_2.2.5 0.48% lapps libssl.so.45.0.1 [.] SSL_read 0.46% lapps [kernel.vmlinux] [k] copy_user_generic_unrolled 0.45% lapps [kernel.vmlinux] [k] tcp_sendmsg_locked 0.45% lapps lapps [.] LAppS::ClientWebSocket::send 0.44% lapps libc-2.26.so [.] _int_free 0.44% lapps libssl.so.45.0.1 [.] ssl3_read_internal 0.43% lapps [kernel.vmlinux] [k] futex_wake 0.42% lapps libluajit-5.1.so.2.0.5 [.] lj_tab_get 0.42% lapps libc-2.26.so [.] vfprintf 0.41% lapps [kernel.vmlinux] [k] tcp_v4_rcv