{"id":35106,"date":"2019-10-31T22:02:22","date_gmt":"2019-10-31T19:02:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\/"},"modified":"2019-10-31T22:02:22","modified_gmt":"2019-10-31T19:02:22","slug":"proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Las aplicaciones web se utilizan hoy en d\u00eda en todas partes, y entre todos los protocolos de transporte, HTTP ocupa una parte significativa. Al estudiar los matices del desarrollo de aplicaciones web, la mayor\u00eda presta muy poca atenci\u00f3n al sistema operativo en el que realmente se ejecutan estas aplicaciones. La separaci\u00f3n entre desarrollo (Dev) y operaciones (Ops) ha empeorado la situaci\u00f3n. Pero con la difusi\u00f3n de la cultura DevOps, los desarrolladores comienzan a asumir la responsabilidad de desplegar sus aplicaciones en la nube, por lo que les resulta muy \u00fatil familiarizarse a fondo con el backend del sistema operativo. Esto es especialmente beneficioso si intentas implementar un sistema para miles o decenas de miles de conexiones simult\u00e1neas.<\/p>\n<p>Las limitaciones en los servicios web son muy similares a las limitaciones en otras aplicaciones. Ya sea en balanceadores de carga o en servidores de bases de datos, todos estos tipos de aplicaciones enfrentan problemas similares en un entorno de alto rendimiento. Comprender estas limitaciones fundamentales y las formas de superarlas en general permitir\u00e1 evaluar el rendimiento y la escalabilidad de tus aplicaciones web.<\/p>\n<p>Escribo esta serie de art\u00edculos en respuesta a las preguntas de j\u00f3venes desarrolladores que desean convertirse en arquitectos de sistemas bien informados. No se puede entender claramente los m\u00e9todos de optimizaci\u00f3n de aplicaciones en Linux sin profundizar en los fundamentos de c\u00f3mo funcionan a nivel de sistema operativo. Aunque hay muchos tipos de aplicaciones, en este ciclo quiero explorar aplicaciones de red, y no de escritorio, como un navegador o un editor de texto. Este material est\u00e1 dirigido a desarrolladores y arquitectos que desean entender c\u00f3mo funcionan los programas en Linux o Unix y c\u00f3mo estructurarlos para un alto rendimiento.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux es <i>un sistema operativo<\/i> servidor, y la mayor\u00eda de las veces tus aplicaciones funcionan precisamente en este SO. Aunque digo 'Linux', en la mayor parte del tiempo puedes suponer con confianza que me refiero a todos los sistemas operativos similares a Unix en general. Sin embargo, no he probado el c\u00f3digo de soporte en otros sistemas. As\u00ed que, si te interesa FreeBSD u OpenBSD, el resultado puede variar. Cuando pruebo algo espec\u00edfico de Linux, lo indico.<\/p>\n<p>Aunque puedes utilizar los conocimientos adquiridos para crear una aplicaci\u00f3n desde cero y que est\u00e9 perfectamente optimizada, es mejor no hacerlo. Si decides escribir un nuevo servidor web en C o C++ para la aplicaci\u00f3n empresarial de tu organizaci\u00f3n, probablemente ser\u00e1 tu \u00faltimo d\u00eda en el trabajo. Sin embargo, conocer la estructura de estas aplicaciones te ayudar\u00e1 a elegir programas existentes. Podr\u00e1s comparar sistemas basados en procesos con sistemas basados en hilos y tambi\u00e9n con sistemas basados en eventos. Entender\u00e1s y apreciar\u00e1s por qu\u00e9 Nginx funciona mejor que Apache httpd, y por qu\u00e9 una aplicaci\u00f3n de Python basada en Tornado puede atender a m\u00e1s usuarios en comparaci\u00f3n con una aplicaci\u00f3n de Python basada en Django.<\/p>\n<h1>ZeroHTTPd: herramienta de aprendizaje<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 un servidor web que he escrito desde cero en C como herramienta educativa. No tiene dependencias externas, incluyendo acceso a Redis. Ejecutamos nuestros propios procedimientos de Redis. M\u00e1s detalles abajo.<\/p>\n<p>Aunque podr\u00edamos discutir mucho sobre la teor\u00eda, no hay nada mejor que escribir c\u00f3digo, ejecutarlo y comparar entre las diferentes arquitecturas de servidor. Este es el m\u00e9todo m\u00e1s ilustrativo. Por eso, estaremos escribiendo un servidor web simple ZeroHTTPd, aplicando cada modelo: basado en procesos, hilos y eventos. Probaremos cada uno de estos servidores y veremos c\u00f3mo funcionan en comparaci\u00f3n uno con otro. ZeroHTTPd est\u00e1 implementado en un solo archivo C. El servidor basado en eventos incluye <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, una excelente implementaci\u00f3n de tabla hash que se proporciona en un solo archivo de cabecera. En otros casos, no hay dependencias para no complicar el proyecto.<\/p>\n<p>El c\u00f3digo tiene muchos comentarios para ayudar a entender. Siendo un servidor web simple en pocas l\u00edneas de c\u00f3digo, ZeroHTTPd tambi\u00e9n es un marco m\u00ednimo para el desarrollo web. Tiene funcionalidad limitada, pero es capaz de entregar archivos est\u00e1ticos y p\u00e1ginas 'din\u00e1micas' muy b\u00e1sicas. Debo decir que ZeroHTTPd es muy adecuado para aprender a crear aplicaciones de Linux de alto rendimiento. En general, la mayor\u00eda de los servicios web est\u00e1n a la espera de solicitudes, las verifican y las procesan. Eso es exactamente lo que har\u00e1 ZeroHTTPd. Es una herramienta de aprendizaje, no para producci\u00f3n. No es fuerte en el manejo de errores y probablemente no presuma de las mejores pr\u00e1cticas de seguridad (oh s\u00ed, utilic\u00e9 <code>strcpy<\/code>) o con trucos enrevesados del lenguaje C. Pero espero que haga bien su trabajo.<\/p>\n<p><img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>P\u00e1gina principal de ZeroHTTPd. Puede entregar diferentes tipos de archivos, incluyendo im\u00e1genes.<\/i><\/p>\n<h1>Aplicaci\u00f3n del libro de visitas.<\/h1>\n<p>\nLas aplicaciones web modernas generalmente no se limitan a archivos est\u00e1ticos. Tienen interacciones complejas con diferentes bases de datos, cach\u00e9s, etc. Por lo tanto, crearemos una aplicaci\u00f3n web sencilla llamada \u2018Libro de visitas\u2019, donde los visitantes dejan mensajes con sus nombres. En el libro de visitas se guardan los mensajes dejados anteriormente. Tambi\u00e9n hay un contador de visitantes en la parte inferior de la p\u00e1gina.<\/p>\n<p><img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Aplicaci\u00f3n del libro de visitas ZeroHTTPd.<\/i><\/p>\n<p>El contador de visitantes y los mensajes del libro de visitas se almacenan en Redis. Se han implementado procedimientos propios para la comunicaci\u00f3n con Redis, que no dependen de bibliotecas externas. No soy un gran fan de sacar c\u00f3digo hecho en casa cuando hay soluciones disponibles y bien probadas. Sin embargo, el objetivo de ZeroHTTPd es estudiar el rendimiento de Linux y el acceso a servicios externos, mientras que el manejo de las solicitudes HTTP afecta gravemente al rendimiento. Debemos controlar completamente las comunicaciones con Redis en cada una de nuestras arquitecturas de servidor. En una arquitectura usamos llamadas bloqueantes, en otras, procedimientos basados en eventos. Usar una librer\u00eda cliente externa de Redis no proporcionar\u00e1 ese control. Adem\u00e1s, nuestro peque\u00f1o cliente de Redis solo realiza unas pocas funciones (obtener, configurar y aumentar una clave; obtener y agregar a un array). Adem\u00e1s, el protocolo Redis es excepcionalmente elegante y simple. Ni siquiera es necesario aprenderlo espec\u00edficamente. El hecho de que todo el trabajo del protocolo se realice en aproximadamente cien l\u00edneas de c\u00f3digo habla de lo bien dise\u00f1ado que est\u00e1.<\/p>\n<p>La siguiente figura muestra las acciones de la aplicaci\u00f3n cuando el cliente (navegador) solicita. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mecanismo de funcionamiento de la aplicaci\u00f3n del libro de visitas.<\/i><\/p>\n<p>Cuando se necesita generar la p\u00e1gina del libro de visitas, se realiza una llamada al sistema de archivos para leer la plantilla en memoria y tres llamadas a Redis. El archivo de la plantilla contiene la mayor parte del contenido HTML para la p\u00e1gina en la captura de pantalla de arriba. Tambi\u00e9n hay marcadores especiales para la parte din\u00e1mica del contenido: las entradas y el contador de visitantes. Las obtenemos de Redis, las insertamos en la p\u00e1gina y entregamos al cliente el contenido completamente formado. Se puede evitar la tercera llamada a Redis, ya que Redis devuelve un nuevo valor de clave al incrementarse. Sin embargo, para nuestro servidor con arquitectura asincr\u00f3nica basada en eventos, m\u00faltiples llamadas de red son una buena prueba con fines educativos. As\u00ed, ignoramos el valor devuelto por Redis sobre la cantidad de visitantes y lo solicitamos en una llamada separada.<\/p>\n<h1>Arquitecturas de servidor ZeroHTTPd<\/h1>\n<p>\nConstruimos siete versiones de ZeroHTTPd con la misma funcionalidad, pero con diferentes arquitecturas:<\/p>\n<ul>\n<li>Iterativa\n<\/li>\n<li>Servidor fork (un proceso hijo por solicitud)\n<\/li>\n<li>Servidor pre-fork (forking previo de procesos)\n<\/li>\n<li>Servidor con hilos de ejecuci\u00f3n (un hilo por solicitud)\n<\/li>\n<li>Servidor con creaci\u00f3n previa de hilos\n<\/li>\n<li>Arquitectura basada en <code>poll()<\/code>\n<\/li>\n<li>Arquitectura basada en <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nMedimos el rendimiento de cada arquitectura cargando el servidor con solicitudes HTTP. Pero al comparar arquitecturas con un alto grado de paralelismo, la cantidad de solicitudes aumenta. Probamos tres veces y calculamos el promedio.<\/p>\n<h1>Metodolog\u00eda de prueba<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Configuraci\u00f3n para la prueba de carga de ZeroHTTPd<\/i> <\/p>\n<p>Es importante que al realizar las pruebas, todos los componentes no se ejecuten en una sola m\u00e1quina. En este caso, el sistema operativo incurre en costos adicionales de planificaci\u00f3n, ya que los componentes compiten por la CPU. Medir el costo del sistema operativo con cada una de las arquitecturas de servidor elegidas es uno de los objetivos m\u00e1s importantes de este ejercicio. Agregar m\u00e1s variables perjudicar\u00e1 el proceso. Por lo tanto, la configuraci\u00f3n en la imagen anterior funciona mejor.<\/p>\n<h3>Qu\u00e9 hace cada uno de estos servidores<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: aqu\u00ed ejecutamos <code>ab<\/code>, la utilidad Apache Benchmark. Genera la carga necesaria para probar nuestras arquitecturas de servidor.\n<\/li>\n<li>nginx.unixism.net: a veces queremos ejecutar m\u00e1s de una instancia de un programa de servidor. Para esto, el servidor Nginx con la configuraci\u00f3n adecuada funciona como un equilibrador de carga, recibiendo las peticiones de <i>ab<\/i> nuestros procesos de servidor.\n<\/li>\n<li>zerohttpd.unixism.net: aqu\u00ed ejecutamos nuestros programas de servidor en siete arquitecturas diferentes, una a la vez.\n<\/li>\n<li>redis.unixism.net: en este servidor se ejecuta el demonio Redis, donde se almacenan los registros en el libro de visitas y el contador de visitantes.<\/li>\n<\/ul>\n<p>\nTodos los servidores funcionan en un n\u00facleo de CPU. La idea es evaluar el rendimiento m\u00e1ximo de cada una de las arquitecturas. Como todos los programas de servidor se pruebas en el mismo hardware, este es el nivel b\u00e1sico para su comparaci\u00f3n. Mi instalaci\u00f3n de prueba consiste en servidores virtuales alquilados a Digital Ocean.<\/p>\n<h3>\u00bfQu\u00e9 estamos midiendo?<\/h3>\n<p>\nSe pueden medir diferentes m\u00e9tricas. Evaluamos el rendimiento de cada arquitectura en esta configuraci\u00f3n, cargando los servidores con solicitudes a diferentes niveles de paralelismo: la carga aumenta de 20 a 15,000 usuarios concurrentes.<\/p>\n<h1>Resultados de pruebas<\/h1>\n<p>\nEn el siguiente diagrama se muestra el rendimiento de los servidores en diferentes arquitecturas a varios niveles de paralelismo. En el eje y \u2014 cantidad de solicitudes por segundo, en el eje x \u2014 conexiones paralelas.<\/p>\n<p><img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA continuaci\u00f3n, una tabla con los resultados.<\/p>\n<p> solicitudes por segundo <\/p>\n<p><strong>paralelismo<\/strong><br \/>\n<strong>iterativo<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>hilo<\/strong><br \/>\n<strong>pre-hilo<\/strong><br \/>\n<strong>poll<\/strong><br \/>\n<strong>epoll<\/strong><\/p>\n<p>20<br \/>\n7<br \/>\n112<br \/>\n2100<br \/>\n1800<br \/>\n2250<br \/>\n1900<br \/>\n2050<\/p>\n<p>50<br \/>\n7<br \/>\n190<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2000<br \/>\n2000<\/p>\n<p>100<br \/>\n7<br \/>\n245<br \/>\n2200<br \/>\n1700<br \/>\n2200<br \/>\n2150<br \/>\n2100<\/p>\n<p>200<br \/>\n7<br \/>\n330<br \/>\n2300<br \/>\n1750<br \/>\n2300<br \/>\n2200<br \/>\n2100<\/p>\n<p>300<br \/>\n\u2013<br \/>\n380<br \/>\n2200<br \/>\n1800<br \/>\n2400<br \/>\n2250<br \/>\n2150<\/p>\n<p>400<br \/>\n\u2013<br \/>\n410<br \/>\n2200<br \/>\n1750<br \/>\n2600<br \/>\n2000<br \/>\n2000<\/p>\n<p>500<br \/>\n\u2013<br \/>\n440<br \/>\n2300<br \/>\n1850<br \/>\n2700<br \/>\n1900<br \/>\n2212<\/p>\n<p>600<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1800<br \/>\n2500<br \/>\n1700<br \/>\n2519<\/p>\n<p>700<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2490<br \/>\n1550<br \/>\n2607<\/p>\n<p>800<br \/>\n\u2013<br \/>\n460<br \/>\n2400<br \/>\n1600<br \/>\n2540<br \/>\n1400<br \/>\n2553<\/p>\n<p>900<br \/>\n\u2013<br \/>\n460<br \/>\n2300<br \/>\n1600<br \/>\n2472<br \/>\n1200<br \/>\n2567<\/p>\n<p>1000<br \/>\n\u2013<br \/>\n475<br \/>\n2300<br \/>\n1700<br \/>\n2485<br \/>\n1150<br \/>\n2439<\/p>\n<p>1500<br \/>\n\u2013<br \/>\n490<br \/>\n2400<br \/>\n1550<br \/>\n2620<br \/>\n900<br \/>\n2479<\/p>\n<p>2000<br \/>\n\u2013<br \/>\n350<br \/>\n2400<br \/>\n1400<br \/>\n2396<br \/>\n550<br \/>\n2200<\/p>\n<p>2500<br \/>\n\u2013<br \/>\n280<br \/>\n2100<br \/>\n1300<br \/>\n2453<br \/>\n490<br \/>\n2262<\/p>\n<p>3000<br \/>\n\u2013<br \/>\n280<br \/>\n1900<br \/>\n1250<br \/>\n2502<br \/>\ngran variabilidad<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\ngran variabilidad<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\ngran variabilidad<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\ngran variabilidad<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2200<\/p>\n<p>11\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n2200<br \/>\n\u2013<br \/>\n2122<\/p>\n<p>12\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n970<br \/>\n\u2013<br \/>\n1958<\/p>\n<p>13\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n730<br \/>\n\u2013<br \/>\n1897<\/p>\n<p>14\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n590<br \/>\n\u2013<br \/>\n1466<\/p>\n<p>15\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n\u2013<br \/>\n532<br \/>\n\u2013<br \/>\n1281<\/p>\n<p>\nDel gr\u00e1fico y la tabla se observa que por encima de 8000 solicitudes concurrentes solo nos quedan dos competidores: pre-fork y epoll. A medida que aumenta la carga, el servidor basado en polling tiene un rendimiento peor que el basado en hilos. La arquitectura con creaci\u00f3n previa de hilos compite dignamente con epoll: esto es un testimonio de cu\u00e1n bien el n\u00facleo de Linux planifica una gran cantidad de hilos.<\/p>\n<h1>C\u00f3digo fuente de ZeroHTTPd<\/h1>\n<p>\nC\u00f3digo fuente de ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">aqu\u00ed<\/a><\/noindex>. Para cada arquitectura hay un directorio separado.<\/p>\n<pre>ZeroHTTPd\n\u2502\n\u251c\u2500\u2500 01_iterative\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 02_forking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 03_preforking\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 04_threading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 05_prethreading\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 06_poll\n\u2502   \u251c\u2500\u2500 main.c\n\u251c\u2500\u2500 07_epoll\n\u2502    \u2514\u2500\u2500 main.c\n\u251c\u2500\u2500 Makefile\n\u251c\u2500\u2500 public\n\u2502   \u251c\u2500\u2500 index.html\n\u2502   \u2514\u2500\u2500 tux.png\n\u2514\u2500\u2500 templates\n    \u2514\u2500\u2500 guestbook\n        \u2514\u2500\u2500 index.html<\/pre>\n<p>\nAdem\u00e1s de los siete directorios para todas las arquitecturas, en el directorio de nivel superior hay dos m\u00e1s: public y templates. En el primero se encuentra el archivo index.html y una imagen del primer screenshot. Se pueden colocar otros archivos y carpetas ah\u00ed, y ZeroHTTPd deber\u00eda servir estos archivos est\u00e1ticos sin problemas. Si la ruta en el navegador coincide con la ruta en la carpeta public, ZeroHTTPd busca el archivo index.html en este directorio. El contenido para el libro de visitas se genera din\u00e1micamente. Solo tiene una p\u00e1gina principal, y su contenido se basa en el archivo 'templates\/guestbook\/index.html'. En ZeroHTTPd se pueden agregar f\u00e1cilmente p\u00e1ginas din\u00e1micas para la expansi\u00f3n. La idea es que los usuarios pueden a\u00f1adir plantillas en este directorio y expandir ZeroHTTPd seg\u00fan sea necesario.<\/p>\n<p>Para compilar los siete servidores, ejecute <code>make all<\/code> desde el directorio ra\u00edz \u2014 y todas las compilaciones aparecer\u00e1n en este directorio. Los archivos ejecutables buscan los directorios public y templates en el directorio desde el cual se inician.<\/p>\n<h1>Linux API<\/h1>\n<p>\nPara entender la informaci\u00f3n en este ciclo de art\u00edculos, no es necesario tener un buen dominio de la Linux API. Sin embargo, recomiendo leer m\u00e1s sobre este tema, hay muchos recursos de referencia disponibles en la red. Aunque tocamos algunas categor\u00edas de la Linux API, nuestra atenci\u00f3n se centrar\u00e1 principalmente en los procesos, hilos, eventos y la pila de red. Adem\u00e1s de libros y art\u00edculos sobre la Linux API, tambi\u00e9n recomiendo consultar las p\u00e1ginas man para las llamadas del sistema y las funciones de biblioteca utilizadas.<\/p>\n<h1>Rendimiento y escalabilidad<\/h1>\n<p>\nUna observaci\u00f3n sobre rendimiento y escalabilidad. Te\u00f3ricamente, no hay ninguna relaci\u00f3n entre ellos. Puede tener un servicio web que funcione muy bien, con tiempos de respuesta de unos pocos milisegundos, pero que no sea escalable en absoluto. De igual manera, puede haber una aplicaci\u00f3n web que funcione mal, que requiera varios segundos para responder, pero que sea escalable para manejar decenas de miles de usuarios simult\u00e1neos. Sin embargo, la combinaci\u00f3n de alto rendimiento y escalabilidad es una combinaci\u00f3n muy poderosa. Las aplicaciones de alto rendimiento, en general, utilizan los recursos de manera econ\u00f3mica y, por lo tanto, pueden atender a m\u00e1s usuarios simult\u00e1neos en el servidor de manera efectiva, reduciendo costos.<\/p>\n<h1>Tareas de CPU y I\/O<\/h1>\n<p>\nFinalmente, en los c\u00e1lculos siempre hay dos tipos posibles de tareas: para I\/O y CPU. Obtener solicitudes a trav\u00e9s de Internet (entrada\/salida de red), gestionar archivos (entrada\/salida de red y disco), comunicarse con bases de datos (entrada\/salida de red y disco) \u2014 todas estas son acciones de I\/O. Algunas consultas a la base de datos pueden cargar un poco la CPU (ordenamiento, c\u00e1lculo del promedio de un mill\u00f3n de resultados, etc.). La mayor\u00eda de las aplicaciones web est\u00e1n limitadas por el I\/O m\u00e1ximo posible, mientras que el procesador rara vez se utiliza a plena capacidad. Cuando observa que se utiliza mucha CPU para una tarea de entrada\/salida, es probable que sea un signo de mala arquitectura de la aplicaci\u00f3n. Esto puede significar que los recursos de CPU se gastan en la gesti\u00f3n de procesos y el cambio de contexto \u2014 y eso no es del todo \u00fatil. Si est\u00e1 haciendo algo como procesamiento de im\u00e1genes, conversi\u00f3n de archivos de audio o aprendizaje autom\u00e1tico, entonces la aplicaci\u00f3n requiere recursos de CPU potentes. Pero para la mayor\u00eda de las aplicaciones no es as\u00ed.<\/p>\n<h1>M\u00e1s sobre arquitecturas de servidores<\/h1>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-i-iterative-servers\/\">Parte I. Arquitectura Iterativa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Parte II. Servidores Fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Parte III. Servidores Pre-Fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Parte IV. Servidores con Hilos de Ejecuci\u00f3n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Parte V. Servidores con Hilos Precreados<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Parte VI. Arquitectura Basada en Poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Parte VII. Arquitectura Basada en Epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/455212\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP. \u0418\u0437\u0443\u0447\u0430\u044f \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0443\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0433\u0434\u0435 \u044d\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (Dev) \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 (Ops) \u043b\u0438\u0448\u044c \u0443\u0445\u0443\u0434\u0448\u0430\u043b\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041d\u043e \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b DevOps \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043d\u0435\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35106","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:02:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Rendimiento de aplicaciones de red en Linux. Introducci\u00f3n | ProHoster","description":"Las aplicaciones web hoy en d\u00eda se utilizan en todas partes, y entre todos los protocolos de transporte, HTTP ocupa una gran parte.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Linux. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u044b\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e, \u0430 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 HTTP.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:02:22+00:00","article:modified_time":"2019-10-31T19:02:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35106","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 21:51:33","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:09:55","updated":"2026-01-21 21:51:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}