{"id":75,"date":"2019-03-19T07:48:00","date_gmt":"2019-03-19T06:48:00","guid":{"rendered":"http:\/\/guillemrueda.com\/blog\/?p=75"},"modified":"2021-06-29T17:40:42","modified_gmt":"2021-06-29T16:40:42","slug":"latencia-de-una-azure-function","status":"publish","type":"post","link":"https:\/\/guillemrueda.com\/blog\/2019\/03\/19\/latencia-de-una-azure-function\/","title":{"rendered":"Lat\u00e8ncia de una Azure Function"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Revisi\u00f3 gener 2020: Aquesta entrada va ser escrita al 2018 en plena fase de desplegament. Actualment les Azure functions v2 i v3 ofereixen el <em>always on <\/em>qu\u00e8 disminueix dr\u00e0sticament la lat\u00e8ncia de les funcions. Les funcions escrites amb Net Framework nom\u00e9s poden anar amb V1 que ara mateix est\u00e0 en cam\u00ed a <em>deprecated<\/em>.<\/p><\/blockquote>\n\n\n\n<p>Des Azure fa un temps els webjobs de les WebApps d&#8217;Azure s&#8217;estan traslladant a funcions. Aix\u00f2 el teu els seus avantatges, com no consumir recursos de les inst\u00e0ncies de WebApp i consumir-ne sota demanda.<\/p>\n\n\n\n<p>Tot \u00e9s correcte fins que les versions actuals de serveis no ofereixen quelcom b\u00e0sic: estar sempre actives. Aix\u00f2 \u00e9s vital qual la funci\u00f3 es dedica a llegir una cua: o pot estar desactiva sempre o pot estar osiosa esperant a respondre. Les Azure Functions al no tenir <em>Always On<\/em> s\u00f3n el primer cas: desactiva fins que es digui el contrari. Doncs es plantegen dos solucions: (A) fer un pas enrere i tornar a workers o (B) fer un mecanisme de mantenir sempre viu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/pbs.twimg.com\/media\/D2BFvJ-X0AAG0-3?format=jpg&amp;name=small\" alt=\"Imatge\" width=\"680\" height=\"229\"\/><figcaption>La lat\u00e8ncia de les respostes del encadenat de processos \u00e9s alt degut al temps de warm up de una Azure Function<\/figcaption><\/figure><\/div>\n\n\n\n<p>La soluci\u00f3 A implica desplegar una s\u00e8rie de llibreries que tenen \u00fas cr\u00edtic de la CPU a una inst\u00e0ncia WebApp que ja de per si ja t\u00e9 pics de CPU. Descongestionar la inst\u00e0ncia de aquests pics \u00e9s una prioritat.<\/p>\n\n\n\n<p>La soluci\u00f3 B implica ref\u00f3rmular el codi de lectura de cues per a que quan a la senyal de vida, una senyal que anomenarem <em>keep_alive<\/em>. Un altre funci\u00f3 Azure inserir\u00e0 a la cua cada X (definirem el temps com una variable de configuraci\u00f3 per a trobar el rendiment \u00f2ptim) un missatge de <em>keep_alive<\/em> que els diferents processos encadenats en cues nom\u00e9s hauran de retransmetre de la cua d&#8217;entrada a la de sortida. <\/p>\n\n\n\n<p>\u00c9s una forma de mantenir els processos de la cua ociosos, tampoc \u00e9s una novetat. S\u00f3n principis que vaig veure a clustering amb heartbeat\/pacemaker o m\u00e9s simples, per evitar que el IIS decid\u00eds que era bon moment posar-se en rep\u00f2s.<\/p>\n\n\n\n<p>El problema \u00e9s qu\u00e8 pot saturar les cues (1), pot sobrecarregar els serveis (2) i pot implicar un consum extra (3). Aix\u00ed que caldr\u00e0 trobar el equilibri entre mantenir una lat\u00e8ncia optima: una repetici\u00f3 de la senyal <em>keep_alive<\/em> que no desajusti el sistema i dispari els costos.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/pbs.twimg.com\/media\/D2BGoJDW0AAJ2rx?format=png&amp;name=small\" alt=\"Imatge\"\/><figcaption>En vermell: un keep alive cada 10 segons, en blau cada 20 segons, en verd cada 30.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Provem 3 per\u00edodes per a l&#8217;enviament de <em>keep_alive<\/em>: cada 30 segons, cada 20 segons i despr\u00e9s cada 10. La Azure Function t\u00e9 aproximadament un per\u00edode de 10 segons per a aixecar-se (<em>warm up<\/em> a actiu) i de rep\u00f2s molt menor (al acabar ja passa a rep\u00f2s). <\/p>\n\n\n\n<p>El fet de mantenir-lo a 30 s&#8217;aconsegueix que les peticions intercalades entre les senyals de vida passin de pics de 120 a 60. Segueix sent un temps d&#8217;espera elevat per al client, que voldria resoldre les peticions en el menor temps possible.<\/p>\n\n\n\n<p>Reduint el <em>keep_alive <\/em>a 20 segons redu\u00efm els pics a 30 segons. La meitat de la meitat. I a 10 segons aconseguim que els pics es redueixin a menys de 10 segons. <\/p>\n\n\n\n<p>El curi\u00f3s de tot aix\u00f2 \u00e9s que s\u00f3n processos que a la versi\u00f3 de desktop mai vam aconseguir que arribessin a aquests n\u00fameros. Les Azure Functions amb una bona conjunci\u00f3 de SQL Server i optimitzaci\u00f3 poden arribar a mostrar molt bons resultats.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Revisi\u00f3 gener 2020: Aquesta entrada va ser escrita al 2018 en plena fase de desplegament. Actualment les Azure functions v2 i v3 ofereixen el always on qu\u00e8 disminueix dr\u00e0sticament la lat\u00e8ncia de les funcions. Les funcions escrites amb Net Framework nom\u00e9s poden anar amb V1 que ara mateix est\u00e0 en cam\u00ed a deprecated. Des Azure &hellip; <a href=\"https:\/\/guillemrueda.com\/blog\/2019\/03\/19\/latencia-de-una-azure-function\/\" class=\"more-link\">Continua la lectura de <span class=\"screen-reader-text\">Lat\u00e8ncia de una Azure Function<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,9,12,11,6],"tags":[],"class_list":["post-75","post","type-post","status-publish","format-standard","hentry","category-net-programacio","category-api","category-azure","category-cloud","category-programacio"],"_links":{"self":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/75","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/comments?post=75"}],"version-history":[{"count":2,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/75\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/75\/revisions\/115"}],"wp:attachment":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/media?parent=75"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/categories?post=75"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/tags?post=75"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}