{"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\/pl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aplikacje webowe s\u0105 obecnie powszechnie u\u017cywane, a w\u015br\u00f3d wszystkich protoko\u0142\u00f3w transportowych HTTP zajmuje znaczn\u0105 cz\u0119\u015b\u0107. Podczas badania niuans\u00f3w tworzenia aplikacji webowych, wi\u0119kszo\u015b\u0107 os\u00f3b po\u015bwi\u0119ca bardzo ma\u0142o uwagi systemowi operacyjnemu, na kt\u00f3rym te aplikacje s\u0105 rzeczywi\u015bcie uruchamiane. Podzia\u0142 mi\u0119dzy rozwojem (Dev) a operacjami (Ops) jedynie pogarsza\u0142 sytuacj\u0119. Jednak wraz z rozprzestrzenieniem si\u0119 kultury DevOps, programi\u015bci zaczynaj\u0105 bra\u0107 odpowiedzialno\u015b\u0107 za uruchamianie swoich aplikacji w chmurze, dlatego bardzo przydatne jest dok\u0142adne zapoznanie si\u0119 z backendem systemu operacyjnego. Jest to szczeg\u00f3lnie pomocne, je\u015bli starasz si\u0119 wdro\u017cy\u0107 system dla tysi\u0119cy lub dziesi\u0105tek tysi\u0119cy jednoczesnych po\u0142\u0105cze\u0144.<\/p>\n<p>Ograniczenia w us\u0142ugach webowych s\u0105 bardzo podobne do ogranicze\u0144 w innych aplikacjach. Niezale\u017cnie od tego, czy s\u0105 to load balancery, czy serwery baz danych, wszystkie te aplikacje maj\u0105 podobne problemy w wysokowydajnym \u015brodowisku. Zrozumienie tych podstawowych ogranicze\u0144 oraz sposob\u00f3w ich przezwyci\u0119\u017cania pozwoli oceni\u0107 wydajno\u015b\u0107 i skalowalno\u015b\u0107 Twoich aplikacji webowych.<\/p>\n<p>Pisz\u0119 t\u0119 seri\u0119 artyku\u0142\u00f3w w odpowiedzi na pytania m\u0142odych programist\u00f3w, kt\u00f3rzy chc\u0105 sta\u0107 si\u0119 dobrze poinformowanymi architektami system\u00f3w. Niemo\u017cliwe jest dok\u0142adne zrozumienie metod optymalizacji aplikacji Linux, nie zag\u0142\u0119biaj\u0105c si\u0119 w podstawy ich dzia\u0142ania na poziomie systemu operacyjnego. Chocia\u017c istnieje wiele typ\u00f3w aplikacji, w tej serii chc\u0119 zbada\u0107 aplikacje sieciowe, a nie desktopowe, takie jak przegl\u0105darka czy edytor tekstu. Materia\u0142 ten jest skierowany do programist\u00f3w i architekt\u00f3w, kt\u00f3rzy chc\u0105 zrozumie\u0107, jak dzia\u0142aj\u0105 programy Linux lub Unix i jak je strukturyzowa\u0107 dla wysokiej wydajno\u015bci.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux to <i>system operacyjny<\/i> , a najcz\u0119\u015bciej Twoje aplikacje dzia\u0142aj\u0105 w\u0142a\u015bnie na tym systemie. Chocia\u017c m\u00f3wi\u0119 \u201eLinux\u201d, przez wi\u0119kszo\u015b\u0107 czasu mo\u017cesz z pewno\u015bci\u0105 za\u0142o\u017cy\u0107, \u017ce mam na my\u015bli wszystkie systemy operacyjne podobne do Unix. Niemniej jednak, nie testowa\u0142em towarzysz\u0105cego kodu na innych systemach. Tak wi\u0119c, je\u015bli interesuje Ci\u0119 FreeBSD lub OpenBSD, wyniki mog\u0105 si\u0119 r\u00f3\u017cni\u0107. Kiedy testuj\u0119 co\u015b specyficznego dla Linux, zaznaczam to.<\/p>\n<p>Chocia\u017c mo\u017cesz wykorzysta\u0107 zdobyt\u0105 wiedz\u0119 do stworzenia aplikacji od podstaw, co mo\u017ce by\u0107 wspaniale zoptymalizowane, lepiej tego nie robi\u0107. Je\u015bli napiszesz nowy serwer WWW w C lub C++ dla aplikacji biznesowej swojej organizacji, mo\u017ce to by\u0107 tw\u00f3j ostatni dzie\u0144 w pracy. Jednak znajomo\u015b\u0107 struktury tych aplikacji pomo\u017ce w wyborze ju\u017c istniej\u0105cych program\u00f3w. B\u0119dziesz m\u00f3g\u0142 por\u00f3wnywa\u0107 systemy oparte na procesach z systemami opartymi na w\u0105tkach oraz na zdarzeniach. Zrozumiesz i docenisz, dlaczego Nginx dzia\u0142a lepiej ni\u017c Apache httpd, a tak\u017ce dlaczego aplikacja Python oparta na Tornado mo\u017ce obs\u0142ugiwa\u0107 wi\u0119cej u\u017cytkownik\u00f3w w por\u00f3wnaniu do aplikacji Python opartej na Django.<\/p>\n<h1>ZeroHTTPd: narz\u0119dzie edukacyjne<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 serwer WWW, kt\u00f3ry napisa\u0142em od podstaw w C jako narz\u0119dzie edukacyjne. Nie ma \u017cadnych zewn\u0119trznych zale\u017cno\u015bci, w tym dost\u0119pu do Redis. Uruchamiamy nasze w\u0142asne procedury Redis. Wi\u0119cej informacji poni\u017cej.<\/p>\n<p>Chocia\u017c mogliby\u015bmy d\u0142ugo dyskutowa\u0107 o teorii, nie ma nic lepszego ni\u017c napisanie kodu, uruchomienie go i por\u00f3wnanie r\u00f3\u017cnych architektur serwerowych. To najbardziej wymowna metoda. Dlatego napiszemy prosty serwer WWW ZeroHTTPd, stosuj\u0105c ka\u017cdy model: oparty na procesach, w\u0105tkach i zdarzeniach. Sprawdzimy ka\u017cdy z tych serwer\u00f3w i zobaczymy, jak dzia\u0142aj\u0105 w por\u00f3wnaniu ze sob\u0105. ZeroHTTPd jest zaimplementowany w jednym pliku C. Sk\u0142ad serwera opartego na zdarzeniach zawiera <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, doskona\u0142\u0105 implementacj\u0119 tabeli haszuj\u0105cej, kt\u00f3r\u0105 dostarczono w jednym pliku nag\u0142\u00f3wkowym. W pozosta\u0142ych przypadkach nie ma \u017cadnych zale\u017cno\u015bci, aby nie komplikowa\u0107 projektu.<\/p>\n<p>Kod zawiera wiele komentarzy, aby pom\u00f3c w zrozumieniu. B\u0119d\u0105c prostym serwerem WWW w kilku linijkach kodu, ZeroHTTPd jest r\u00f3wnie\u017c minimalnym frameworkiem do tworzenia aplikacji webowych. Ma ograniczon\u0105 funkcjonalno\u015b\u0107, ale jest w stanie zwraca\u0107 pliki statyczne oraz bardzo proste 'dynamiczne' strony. Musz\u0119 powiedzie\u0107, \u017ce ZeroHTTPd jest doskona\u0142ym narz\u0119dziem do nauki, jak tworzy\u0107 wysokowydajne aplikacje w systemie Linux. W zasadzie wi\u0119kszo\u015b\u0107 us\u0142ug internetowych oczekuje na zapytania, sprawdza je i przetwarza. Dok\u0142adnie to b\u0119dzie robi\u0107 ZeroHTTPd. To narz\u0119dzie edukacyjne, a nie produkcyjne. Nie jest mocny w obs\u0142udze b\u0142\u0119d\u00f3w i raczej nie zaoferuje najlepszych praktyk bezpiecze\u0144stwa (o tak, u\u017cy\u0142em <code>strcpy<\/code>) lub zawi\u0142ymi sztuczkami j\u0119zyka C. Ale mam nadziej\u0119, \u017ce poradzi sobie dobrze ze swoim zadaniem.<\/p>\n<p><img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Strona g\u0142\u00f3wna ZeroHTTPd. Mo\u017ce serwowa\u0107 r\u00f3\u017cne typy plik\u00f3w, w tym obrazy.<\/i><\/p>\n<h1>Aplikacja ksi\u0119gi go\u015bci.<\/h1>\n<p>\nNowoczesne aplikacje webowe zazwyczaj nie ograniczaj\u0105 si\u0119 do statycznych plik\u00f3w. Maj\u0105 skomplikowane interakcje z r\u00f3\u017cnymi bazami danych, pami\u0119ciami podr\u0119cznymi itp. Dlatego stworzymy prost\u0105 aplikacj\u0119 webow\u0105 o nazwie \u201eKsi\u0119ga go\u015bci\u201d, w kt\u00f3rej odwiedzaj\u0105cy zostawiaj\u0105 wpisy podpisuj\u0105c si\u0119. W ksi\u0119dze go\u015bci przechowywane s\u0105 wcze\u015bniejsze wpisy. Jest te\u017c licznik odwiedzin na dole strony.<\/p>\n<p><img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Aplikacja webowa \u201eKsi\u0119ga go\u015bci\u201d ZeroHTTPd.<\/i><\/p>\n<p>Licznik odwiedzin i wpisy ksi\u0119gi go\u015bci s\u0105 przechowywane w Redis. Dla komunikacji z Redis zaimplementowano w\u0142asne procedury, niezale\u017cne od zewn\u0119trznej biblioteki. Nie jestem wielkim fanem korzystania z domowego kodu, gdy istniej\u0105 publiczne i dobrze przetestowane rozwi\u0105zania. Ale celem ZeroHTTPd jest poznanie wydajno\u015bci Linuxa i dost\u0119pu do zewn\u0119trznych us\u0142ug, podczas gdy obs\u0142uga \u017c\u0105da\u0144 HTTP powa\u017cnie wp\u0142ywa na wydajno\u015b\u0107. Musimy mie\u0107 pe\u0142n\u0105 kontrol\u0119 nad komunikacj\u0105 z Redis w ka\u017cdej z naszych architektur serwerowych. W jednej architekturze u\u017cywamy blokuj\u0105cych wywo\u0142a\u0144, w innych procedur bazuj\u0105cych na zdarzeniach. U\u017cycie zewn\u0119trznej biblioteki klienckiej Redis nie da nam takiej kontroli. Ponadto, nasz ma\u0142y klient Redis wykonuje tylko kilka funkcji (pobieranie, ustawianie i zwi\u0119kszanie klucza; pobieranie i dodawanie do tablicy). Dodatkowo, protok\u00f3\u0142 Redis jest niezwykle elegancki i prosty. Nie trzeba go nawet specjalnie uczy\u0107. Sam fakt, \u017ce ca\u0142a praca protoko\u0142u wykonywana jest w oko\u0142o stu liniach kodu, \u015bwiadczy o tym, jak dobrze jest przemy\u015blany.<\/p>\n<p>Na nast\u0119pnym obrazku przedstawione s\u0105 dzia\u0142ania aplikacji, gdy klient (przegl\u0105darka) wysy\u0142a \u017c\u0105danie. <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mechanizm dzia\u0142ania aplikacji ksi\u0119gi go\u015bci.<\/i><\/p>\n<p>Kiedy trzeba wygenerowa\u0107 stron\u0119 ksi\u0119gi go\u015bci, odbywa si\u0119 jedno wywo\u0142anie do systemu plik\u00f3w w celu odczytania szablonu do pami\u0119ci oraz trzy wywo\u0142ania sieciowe do Redis. Plik szablonu zawiera wi\u0119kszo\u015b\u0107 zawarto\u015bci HTML dla strony na zrzucie ekranu powy\u017cej. Zawiera r\u00f3wnie\u017c specjalne znaczniki dla dynamicznej cz\u0119\u015bci tre\u015bci: wpis\u00f3w oraz licznika odwiedzaj\u0105cych. Pobieramy je z Redis, wstawiamy na stron\u0119 i wydajemy klientowi w pe\u0142ni sformu\u0142owan\u0105 tre\u015b\u0107. Trzeciego wywo\u0142ania do Redis mo\u017cna unikn\u0105\u0107, poniewa\u017c Redis zwraca now\u0105 warto\u015b\u0107 klucza przy inkrementacji. Jednak dla naszego serwera o architekturze asynchronicznej opartej na zdarzeniach, wiele wywo\u0142a\u0144 sieciowych stanowi dobre \u0107wiczenie edukacyjne. W zwi\u0105zku z tym porzucamy zwracana warto\u015b\u0107 Redis dotycz\u0105c\u0105 liczby odwiedzaj\u0105cych i prosimy o ni\u0105 oddzielnym wywo\u0142aniem.<\/p>\n<h1>Architektury serwerowe ZeroHTTPd<\/h1>\n<p>\nBudujemy siedem wersji ZeroHTTPd z identyczn\u0105 funkcjonalno\u015bci\u0105, ale r\u00f3\u017cnymi architekturami:<\/p>\n<ul>\n<li>Iteracyjna\n<\/li>\n<li>Serwer fork (jeden proces potomny na \u017c\u0105danie)\n<\/li>\n<li>Serwer pre-fork (wst\u0119pne forkowanie proces\u00f3w)\n<\/li>\n<li>Serwer z w\u0105tkami wykonawczymi (jeden w\u0105tek na \u017c\u0105danie)\n<\/li>\n<li>Serwer z wst\u0119pnym tworzeniem w\u0105tk\u00f3w\n<\/li>\n<li>Architektura oparta na <code>poll()<\/code>\n<\/li>\n<li>Architektura oparta na <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nMierzymy wydajno\u015b\u0107 ka\u017cdej architektury, obci\u0105\u017caj\u0105c serwer zapytaniami HTTP. Jednak podczas por\u00f3wnywania architektur z wysokim stopniem r\u00f3wnoleg\u0142o\u015bci liczba zapyta\u0144 wzrasta. Testujemy trzy razy i obliczamy \u015bredni\u0105.<\/p>\n<h1>Metodologia testowania<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Konfiguracja do testowania obci\u0105\u017ceniowego ZeroHTTPd<\/i> <\/p>\n<p>Wa\u017cne jest, aby podczas przeprowadzania test\u00f3w wszystkie komponenty nie dzia\u0142a\u0142y na jednej maszynie. W przeciwnym razie system operacyjny niesie dodatkowe koszty zwi\u0105zane z planowaniem, poniewa\u017c komponenty rywalizuj\u0105 o CPU. Pomiar obci\u0105\u017cenia systemu operacyjnego z ka\u017cd\u0105 z wybranych architektur serwerowych jest jednym z najwa\u017cniejszych cel\u00f3w tego \u0107wiczenia. Dodanie wi\u0119kszej liczby zmiennych b\u0119dzie mia\u0142o negatywny wp\u0142yw na proces. Dlatego konfiguracja na powy\u017cszym rysunku dzia\u0142a najlepiej.<\/p>\n<h3>Co robi ka\u017cdy z tych serwer\u00f3w<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: tutaj uruchamiamy <code>ab<\/code>, narz\u0119dzie Apache Benchmark. Generuje ono obci\u0105\u017cenie niezb\u0119dne do testowania naszych architektur serwerowych.\n<\/li>\n<li>nginx.unixism.net: czasami chcemy uruchomi\u0107 wi\u0119cej ni\u017c jeden egzemplarz programu serwerowego. W tym celu serwer Nginx z odpowiednimi ustawieniami dzia\u0142a jako r\u00f3wnowa\u017cnik obci\u0105\u017cenia, przychodz\u0105cego z <i>ab<\/i> naszych proces\u00f3w serwerowych.\n<\/li>\n<li>zerohttpd.unixism.net: tutaj uruchamiamy nasze programy serwerowe na siedmiu r\u00f3\u017cnych architekturach, jedna po drugiej.\n<\/li>\n<li>redis.unixism.net: na tym serwerze dzia\u0142a demon Redis, w kt\u00f3rym przechowywane s\u0105 wpisy w ksi\u0119dze go\u015bci i licznik odwiedzin.<\/li>\n<\/ul>\n<p>\nWszystkie serwery dzia\u0142aj\u0105 na jednym rdzeniu procesora. Idea polega na ocenie maksymalnej wydajno\u015bci ka\u017cdej z architektur. Poniewa\u017c wszystkie programy serwerowe s\u0105 testowane na tym samym sprz\u0119cie, to jest to poziom bazowy dla ich por\u00f3wnania. Moja instalacja testowa sk\u0142ada si\u0119 z wirtualnych serwer\u00f3w wynajmowanych od Digital Ocean.<\/p>\n<h3>Co mierzymy?<\/h3>\n<p>\nMo\u017cna zmierzy\u0107 r\u00f3\u017cne wska\u017aniki. Oceniamy wydajno\u015b\u0107 ka\u017cdej architektury w danej konfiguracji, obci\u0105\u017caj\u0105c serwery zapytaniami na r\u00f3\u017cnych poziomach r\u00f3wnoleg\u0142o\u015bci: obci\u0105\u017cenie wzrasta od 20 do 15 000 jednoczesnych u\u017cytkownik\u00f3w.<\/p>\n<h1>Wyniki test\u00f3w<\/h1>\n<p>\nNa nast\u0119puj\u0105cym wykresie przedstawiona jest wydajno\u015b\u0107 serwer\u00f3w na r\u00f3\u017cnych architekturach przy r\u00f3\u017cnych poziomach r\u00f3wnoleg\u0142o\u015bci. O\u015b y \u2014 liczba zapyta\u0144 na sekund\u0119, o\u015b x \u2014 po\u0142\u0105czenia r\u00f3wnoleg\u0142e.<\/p>\n<p><img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoni\u017cej tabela z wynikami.<\/p>\n<p> zapytania na sekund\u0119 <\/p>\n<p><strong>r\u00f3wnoleg\u0142o\u015b\u0107<\/strong><br \/>\n<strong>iteracyjny<\/strong><br \/>\n<strong>forka<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>w\u0105tkowy<\/strong><br \/>\n<strong>pre-w\u0105tkowy<\/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 \/>\ndu\u017ca rozbie\u017cno\u015b\u0107<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\ndu\u017ca rozbie\u017cno\u015b\u0107<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\ndu\u017ca rozbie\u017cno\u015b\u0107<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\ndu\u017ca rozbie\u017cno\u015b\u0107<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>\nZ wykresu i tabeli wida\u0107, \u017ce powy\u017cej 8000 jednoczesnych zapyta\u0144 pozostaj\u0105 tylko dwa gracze: pre-fork i epoll. Wraz ze wzrostem obci\u0105\u017cenia serwer oparty na poll dzia\u0142a gorzej ni\u017c w\u0105tkowy. Architektura z wcze\u015bniejszym tworzeniem w\u0105tk\u00f3w stanowi godn\u0105 konkurencj\u0119 dla epoll: \u015bwiadczy to o tym, jak dobrze j\u0105dro Linux planuje du\u017c\u0105 liczb\u0119 w\u0105tk\u00f3w.<\/p>\n<h1>Kod \u017ar\u00f3d\u0142owy ZeroHTTPd<\/h1>\n<p>\nKod \u017ar\u00f3d\u0142owy ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">tutaj<\/a><\/noindex>. Dla ka\u017cdej architektury osobny katalog.<\/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>\nOpr\u00f3cz siedmiu katalog\u00f3w dla wszystkich architektur, w g\u0142\u00f3wnym katalogu znajduj\u0105 si\u0119 jeszcze dwa: public i templates. W pierwszym znajduje si\u0119 plik index.html oraz obrazek z pierwszego zrzutu ekranu. Mo\u017cna tam umieszcza\u0107 inne pliki i foldery, a ZeroHTTPd powinien bez problemu zrealizowa\u0107 te statyczne pliki. Je\u015bli \u015bcie\u017cka w przegl\u0105darce odpowiada \u015bcie\u017cce w folderze public, to ZeroHTTPd szuka w tym katalogu pliku index.html. Zawarto\u015b\u0107 dla ksi\u0119gi go\u015bci generowana jest dynamicznie. Ma tylko stron\u0119 g\u0142\u00f3wn\u0105, a jej zawarto\u015b\u0107 bazuje na pliku 'templates\/guestbook\/index.html'. W ZeroHTTPd \u0142atwo dodaje si\u0119 strony dynamiczne w celu rozszerzenia. Idea polega na tym, \u017ce u\u017cytkownicy mog\u0105 dodawa\u0107 w tym katalogu szablony i rozszerza\u0107 ZeroHTTPd w razie potrzeby.<\/p>\n<p>Aby zbudowa\u0107 wszystkie siedem serwer\u00f3w, uruchom <code>make all<\/code> z katalogu g\u0142\u00f3wnego \u2013 a wszystkie buildy pojawi\u0105 si\u0119 w tym katalogu. Pliki wykonywalne szukaj\u0105 katalog\u00f3w public i templates w tym katalogu, z kt\u00f3rego s\u0105 uruchamiane.<\/p>\n<h1>Linux API<\/h1>\n<p>\nAby zrozumie\u0107 informacje w tej serii artyku\u0142\u00f3w, nie trzeba dobrze rozumie\u0107 Linux API. Jednak polecam przeczyta\u0107 wi\u0119cej na ten temat, w sieci jest wiele zasob\u00f3w informacyjnych. Cho\u0107 om\u00f3wimy kilka kategorii Linux API, nasza uwaga skupi si\u0119 g\u0142\u00f3wnie na procesach, w\u0105tkach, zdarzeniach i stosie sieciowym. Opr\u00f3cz ksi\u0105\u017cek i artyku\u0142\u00f3w na temat Linux API, polecam r\u00f3wnie\u017c zapozna\u0107 si\u0119 z manualami dla wywo\u0142a\u0144 systemowych i u\u017cywanych funkcji bibliotecznych.<\/p>\n<h1>Wydajno\u015b\u0107 i skalowalno\u015b\u0107<\/h1>\n<p>\nJedna uwaga dotycz\u0105ca wydajno\u015bci i skalowalno\u015bci. Teoretycznie nie ma mi\u0119dzy nimi \u017cadnego zwi\u0105zku. Mo\u017cesz mie\u0107 us\u0142ug\u0119 internetow\u0105, kt\u00f3ra dzia\u0142a bardzo dobrze, z czasem odpowiedzi rz\u0119du kilku milisekund, ale wcale nie jest skalowalna. Podobnie mo\u017ce istnie\u0107 \u017ale dzia\u0142aj\u0105ca aplikacja internetowa, kt\u00f3ra wymaga kilku sekund na odpowied\u017a, ale jest skalowalna na dziesi\u0105tki, aby obs\u0142u\u017cy\u0107 dziesi\u0105tki tysi\u0119cy r\u00f3wnoczesnych u\u017cytkownik\u00f3w. Niemniej jednak, po\u0142\u0105czenie wysokiej wydajno\u015bci i skalowalno\u015bci to bardzo pot\u0119\u017cne po\u0142\u0105czenie. Wysokowydajne aplikacje generalnie ekonomicznie wykorzystuj\u0105 zasoby i w ten spos\u00f3b efektywnie obs\u0142uguj\u0105 wi\u0119ksz\u0105 liczb\u0119 r\u00f3wnoczesnych u\u017cytkownik\u00f3w na serwerze, obni\u017caj\u0105c koszty.<\/p>\n<h1>Zadania CPU i I\/O<\/h1>\n<p>\nW obliczeniach zawsze istniej\u0105 dwa rodzaje zada\u0144: dotycz\u0105ce I\/O i CPU. Odbieranie zapyta\u0144 przez Internet (wej\u015bcie\/wyj\u015bcie sieciowe), zarz\u0105dzanie plikami (wej\u015bcie\/wyj\u015bcie sieciowe i dyskowe), komunikacja z baz\u0105 danych (wej\u015bcie\/wyj\u015bcie sieciowe i dyskowe) \u2014 to wszystko s\u0105 dzia\u0142ania I\/O. Niekt\u00f3re zapytania do bazy danych mog\u0105 lekko obci\u0105\u017ca\u0107 CPU (sortowanie, obliczanie \u015bredniej z miliona wynik\u00f3w itp.). Wi\u0119kszo\u015b\u0107 aplikacji webowych ma ograniczenia co do maksymalnego I\/O, a procesor rzadko dzia\u0142a na pe\u0142nej mocy. Kiedy widzisz, \u017ce w jakim\u015b zadaniu wej\u015bcia\/wyj\u015bcia wykorzystywana jest du\u017ca moc CPU, najprawdopodobniej jest to oznaka s\u0142abej architektury aplikacji. Mo\u017ce to oznacza\u0107, \u017ce zasoby CPU s\u0105 wykorzystywane na zarz\u0105dzanie procesami i prze\u0142\u0105czanie kontekstu \u2014 co nie jest zbyt u\u017cyteczne. Je\u015bli robisz co\u015b jak przetwarzanie obraz\u00f3w, konwersja plik\u00f3w audio lub uczenie maszynowe, aplikacja wymaga du\u017cych zasob\u00f3w CPU. Lecz dla wi\u0119kszo\u015bci aplikacji tak nie jest.<\/p>\n<h1>Szczeg\u00f3\u0142y dotycz\u0105ce architektur serwerowych<\/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\/\">Cz\u0119\u015b\u0107 I. Architektura iteracyjna<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Cz\u0119\u015b\u0107 II. Serwery forkowe<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Cz\u0119\u015b\u0107 III. Serwery 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\/\">Cz\u0119\u015b\u0107 IV. Serwery z w\u0105tkami wykonawczymi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Cz\u0119\u015b\u0107 V. Serwery z wst\u0119pnym utworzeniem w\u0105tk\u00f3w<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Cz\u0119\u015b\u0107 VI. Architektura oparta na poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Cz\u0119\u015b\u0107 VII. Architektura oparta na epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47 Wydajno\u015b\u0107 aplikacji sieciowych Linux. Wprowadzenie | ProHoster","description":"Aplikacje webowe s\u0105 obecnie powszechnie u\u017cywane, a w\u015br\u00f3d wszystkich protoko\u0142\u00f3w transportowych dominuj\u0105c\u0105 rol\u0119 odgrywa HTTP.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}