{"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\/en\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Performance of Linux network applications. Introduction.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Web applications are now used everywhere, and among all transport protocols, HTTP takes the lion's share. When studying the nuances of web application development, most people pay very little attention to the operating system where these applications actually run. The division between development (Dev) and operations (Ops) has only worsened the situation. However, with the spread of DevOps culture, developers are starting to take responsibility for running their applications in the cloud, making it very useful for them to get acquainted with the backend of the operating system. This is particularly beneficial if you're trying to deploy a system for thousands or tens of thousands of simultaneous connections.<\/p>\n<p>Limitations in web services are very similar to those in other applications. Whether it's load balancers or database servers, all of these applications have similar problems in a high-performance environment. Understanding these fundamental limitations and ways to overcome them will ultimately help evaluate the performance and scalability of your web applications.<\/p>\n<p>I am writing this series of articles in response to questions from young developers who want to become well-informed system architects. It is impossible to clearly understand Linux application optimization methods without diving into the basics of how they work at the operating system level. While there are many types of applications, in this cycle, I want to explore network applications, rather than desktop ones like browsers or text editors. This material is aimed at developers and architects who want to understand how Linux or Unix programs work and how to structure them for high performance.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux is <i>a server<\/i> operating system, and most often your applications run on this OS. Although I say 'Linux', most of the time you can confidently assume that all Unix-like operating systems are meant in general. Nevertheless, I have not tested the accompanying code on other systems. So, if you're interested in FreeBSD or OpenBSD, the results may differ. When I try something specific to Linux, I indicate that.<\/p>\n<p>While you can use the knowledge gained to create an application from scratch and it will be well optimized, it's usually best not to do so. If you write a new web server in C or C++ for your organization's business application, it might be your last day at work. However, understanding the structure of these applications will assist you in selecting existing programs. You will be able to compare process-based systems with thread-based and event-based systems. You will understand and appreciate why Nginx outperforms Apache httpd, and why a Python application based on Tornado can handle more users compared to a Python application based on Django.<\/p>\n<h1>ZeroHTTPd: A Learning Tool<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 is a web server that I wrote from scratch in C as a teaching tool. It has no external dependencies, including access to Redis. We run our own Redis procedures. See below for more details.<\/p>\n<p>While we could discuss theory for a long time, there is nothing better than writing code, running it, and comparing all server architectures with each other. This is the most visually effective method. Therefore, we will write a simple web server ZeroHTTPd, applying each model: process-based, thread-based, and event-based. We will test each of these servers and see how they perform in comparison to one another. ZeroHTTPd is implemented in a single C file. The event-based server includes <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, a great implementation of a hash table that comes in a single header file. Otherwise, there are no dependencies to complicate the project.<\/p>\n<p>The code has many comments to help with understanding. As a simple web server in a few lines of code, ZeroHTTPd also serves as a minimal framework for web development. It has limited functionality but can serve static files and very simple \"dynamic\" pages. I must say that ZeroHTTPd is well suited for learning how to create high-performance Linux applications. Essentially, most web services wait for requests, check them, and process them. This is exactly what ZeroHTTPd will do. It is a teaching tool, not for production. It is not strong in error handling and is unlikely to boast best security practices (oh yes, I used <code>strcpy<\/code>) or with an abstract C language trick. But I hope it will perform its task well.<\/p>\n<p><img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>ZeroHTTPd Homepage. It can serve different types of files, including images.<\/i><\/p>\n<h1>Guest Book Application<\/h1>\n<p>\nModern web applications are typically not limited to static files. They involve complex interactions with various databases, caches, etc. Therefore, we will create a simple web application called 'Guest Book,' where visitors can leave entries under their names. The guest book retains previously left entries. There is also a visitor counter at the bottom of the page.<\/p>\n<p><img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>ZeroHTTPd Guest Book Web Application<\/i><\/p>\n<p>The visitor counter and guest book entries are stored in Redis. Custom procedures for communicating with Redis have been implemented and are independent of external libraries. I am not a big fan of rolling out homemade code when there are public and well-tested solutions available. However, the goal of ZeroHTTPd is to explore Linux performance and access to external services, while handling HTTP requests seriously impacts performance. We need to maintain full control over communications with Redis in each of our server architectures. In one architecture, we use blocking calls, while in others, we use event-driven procedures. Using an external Redis client library would not provide such control. Moreover, our small Redis client only performs a few functions (get, set, and increment a key; get and add to an array). Additionally, the Redis protocol is remarkably elegant and simple. You don't even need to learn it explicitly. The fact that the entire protocol work is managed in about a hundred lines of code speaks volumes about its thoughtful design.<\/p>\n<p>The next figure illustrates the actions of the application when a client (browser) makes a request. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>How the guest book application works<\/i><\/p>\n<p>When a guestbook page needs to be generated, a single call is made to the file system to read the template into memory, along with three network calls to Redis. The template file contains most of the HTML content for the page shown in the screenshot above. It also includes special placeholders for the dynamic content part: entries and the visitor counter. We retrieve these from Redis, insert them into the page, and deliver the fully formed content to the client. The third Redis call could be avoided, as Redis returns the new value of the key when incremented. However, for our event-driven asynchronous architecture server, multiple network calls serve as a good test for educational purposes. Thus, we discard the returned Redis value for the visitor count and request it with a separate call.<\/p>\n<h1>ZeroHTTPd Server Architectures<\/h1>\n<p>\nWe build seven versions of ZeroHTTPd with identical functionality but different architectures:<\/p>\n<ul>\n<li>Iterative\n<\/li>\n<li>Fork server (one child process per request)\n<\/li>\n<li>Pre-fork server (process forking beforehand)\n<\/li>\n<li>Threaded server (one thread per request)\n<\/li>\n<li>Thread pool server\n<\/li>\n<li>Architecture based on <code>poll()<\/code>\n<\/li>\n<li>Architecture based on <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nWe measure the performance of each architecture by loading the server with HTTP requests. However, when comparing architectures with high levels of parallelism, the number of requests increases. We test three times and calculate the average.<\/p>\n<h1>Testing Methodology<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Setup for Load Testing ZeroHTTPd<\/i> <\/p>\n<p>It's crucial that during testing, all components do not run on a single machine. In such cases, the OS incurs additional scheduling overhead, as components compete for CPU. Measuring the operating system overhead with each of the selected server architectures is one of the most important goals of this exercise. Adding more variables would be detrimental to the process. Therefore, the setup shown in the illustration above works best.<\/p>\n<h3>What Each of These Servers Does<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: here we run <code>ab<\/code>, the Apache Benchmark utility. It generates the load necessary to test our server architectures.\n<\/li>\n<li>nginx.unixism.net: sometimes we want to run more than one instance of the server program. For this, the Nginx server with the appropriate settings acts as a load balancer for the incoming requests from <i>ab<\/i> our server processes.\n<\/li>\n<li>zerohttpd.unixism.net: here we run our server programs on seven different architectures, one at a time.\n<\/li>\n<li>redis.unixism.net: on this server, the Redis daemon is running, where entries in the guestbook and the visitor counter are stored.<\/li>\n<\/ul>\n<p>\nAll servers run on a single CPU core. The idea is to assess the maximum performance of each architecture. Since all server programs are tested on the same hardware, this serves as a baseline for their comparison. My testing setup consists of virtual servers rented from Digital Ocean.<\/p>\n<h3>What are we measuring?<\/h3>\n<p>\nDifferent metrics can be measured. We assess the performance of each architecture in this configuration by loading the servers with requests at varying levels of parallelism: the load increases from 20 to 15,000 simultaneous users.<\/p>\n<h1>Test results<\/h1>\n<p>\nThe next chart shows the performance of servers on different architectures at various levels of parallelism. On the y-axis \u2014 the number of requests per second, on the x-axis \u2014 parallel connections.<\/p>\n<p><img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performance of Linux network applications. Introduction.\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBelow is a table with the results.<\/p>\n<p> requests per second <\/p>\n<p><strong>parallelism<\/strong><br \/>\n<strong>iterative<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>threaded<\/strong><br \/>\n<strong>pre-threaded<\/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 \/>\nhigh variability<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nhigh variability<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nhigh variability<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nhigh variability<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>\nFrom the graph and the table, it's clear that above 8000 simultaneous requests, only two contenders remain: pre-fork and epoll. As the load increases, the poll-based server performs worse than the threaded one. The architecture with pre-created threads provides worthy competition to epoll: this reflects how well the Linux kernel schedules a large number of threads.<\/p>\n<h1>ZeroHTTPd source code<\/h1>\n<p>\nZeroHTTPd source code <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">here<\/a><\/noindex>. A separate directory for each architecture.<\/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>\nIn addition to the seven directories for all architectures, there are two more at the root level: public and templates. The first contains the index.html file and an image from the first screenshot. You can place other files and folders there, and ZeroHTTPd should serve these static files without any issues. If the path in the browser matches the path in the public folder, then ZeroHTTPd looks for the index.html file in this directory. The guest book content is generated dynamically. It has only a main page, and its content is based on the file 'templates\/guestbook\/index.html'. Dynamic pages can easily be added to ZeroHTTPd for expansion. The idea is that users can add templates to this directory and extend ZeroHTTPd as needed.<\/p>\n<p>To build all seven servers, run <code>make all<\/code> from the root directory \u2014 and all builds will appear in this directory. Executable files look for the public and templates directories in the directory from which they are launched.<\/p>\n<h1>Linux API<\/h1>\n<p>\nTo understand the information in this series of articles, you don't need to have a deep understanding of the Linux API. However, I recommend reading more on this topic, as there are many reference resources online. While we will touch on several categories of the Linux API, our focus will primarily be on processes, threads, events, and the network stack. In addition to books and articles about the Linux API, I also recommend reading the man pages for the system calls and library functions used.<\/p>\n<h1>Performance and Scalability<\/h1>\n<p>\nOne note about performance and scalability. Theoretically, there is no connection between them. You can have a web service that performs very well, with response times of a few milliseconds, but it may not scale at all. Conversely, there may be a poorly performing web application that takes several seconds to respond, yet it scales to handle dozens of simultaneous users. Nevertheless, the combination of high performance and scalability is a very powerful one. High-performance applications generally use resources efficiently and thus can support more concurrent users on a server cost-effectively.<\/p>\n<h1>CPU and I\/O Tasks<\/h1>\n<p>\nFinally, there are always two possible types of tasks in calculations: I\/O and CPU. Receiving requests over the internet (network I\/O), serving files (network and disk I\/O), and communicating with a database (network and disk I\/O) are all I\/O actions. Some database queries may slightly load the CPU (sorting, calculating the average of a million results, etc.). Most web applications are limited by their maximum possible I\/O, and the CPU is rarely utilized to its full capacity. When you see high CPU usage in an I\/O task, it's likely a sign of poor application architecture. This may indicate that CPU resources are being spent on process management and context switching, which is not particularly useful. If you are doing something like image processing, audio file conversion, or machine learning, then the application requires strong CPU resources. But for most applications, this is not the case.<\/p>\n<h1>More on server architectures<\/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\/\">Part I. Iterative architecture<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Part II. Fork servers<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Part III. Pre-fork servers<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iv-threaded-servers\/\">Part IV. Servers with execution threads<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Part V. Servers with thread pre-creation<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Part VI. Poll-based architecture<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Part VII. Epoll-based architecture<\/a><\/noindex><\/li>\n<\/ol>\n<p>Source: <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\/en\/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=\"en_US\" \/>\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\/en\/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\udd47Performance of Linux network applications. Introduction | ProHoster","description":"Web applications are now used everywhere, and among all transport protocols, HTTP takes the lion's share.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}