{"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\/ro\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","title":{"rendered":"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aplica\u021biile web sunt acum utilizate pe scar\u0103 larg\u0103, iar dintre toate protocoalele de transport, HTTP ocup\u0103 o pondere majoritar\u0103. Studiind nuan\u021bele dezvolt\u0103rii aplica\u021biilor web, majoritatea acord\u0103 foarte pu\u021bin\u0103 aten\u021bie sistemului de operare pe care aceste aplica\u021bii ruleaz\u0103 efectiv. Separarea \u00eentre dezvoltare (Dev) \u0219i opera\u021biuni (Ops) a agravat doar situa\u021bia. \u00cens\u0103, odat\u0103 cu r\u0103sp\u00e2ndirea culturii DevOps, dezvoltatorii \u00eencep s\u0103 \u00ee\u0219i asume responsabilitatea pentru desf\u0103\u0219urarea aplica\u021biilor lor \u00een cloud, a\u0219a c\u0103 este foarte util pentru ei s\u0103-\u0219i cunoasc\u0103 \u00een detaliu backend-ul sistemului de operare. Acest lucru este deosebit de important dac\u0103 \u00eencerca\u021bi s\u0103 implementa\u021bi un sistem pentru mii sau zeci de mii de conexiuni simultane.<\/p>\n<p>Limit\u0103rile din serviciile web sunt foarte asem\u0103n\u0103toare cu cele din alte aplica\u021bii. Fie c\u0103 este vorba despre balance-uri de sarcin\u0103 sau servere de baze de date, toate aceste aplica\u021bii se confrunt\u0103 cu probleme similare \u00eentr-un mediu de \u00eenalt\u0103 performan\u021b\u0103. \u00cen\u021belegerea acestor limit\u0103ri fundamentale \u0219i a modurilor \u00een care pot fi dep\u0103\u0219ite va permite, \u00een general, evaluarea performan\u021bei \u0219i scalabilit\u0103\u021bii aplica\u021biilor web.<\/p>\n<p>Scriu aceast\u0103 serie de articole ca r\u0103spuns la \u00eentreb\u0103rile tinerilor dezvoltatori care doresc s\u0103 devin\u0103 arhitec\u021bi de sistem bine informa\u021bi. Este imposibil s\u0103 \u00een\u021belegi clar metodele de optimizare a aplica\u021biilor Linux f\u0103r\u0103 a te aprofunda \u00een fundamentele modului \u00een care acestea func\u021bioneaz\u0103 la nivelul sistemului de operare. De\u0219i exist\u0103 multe tipuri de aplica\u021bii, \u00een acest ciclu vreau s\u0103 explorez aplica\u021biile de re\u021bea, nu aplica\u021biile desktop, precum browserul sau editorul de text. Acest material este destinat dezvoltatorilor \u0219i arhitec\u021bilor care doresc s\u0103 \u00een\u021beleag\u0103 cum func\u021bioneaz\u0103 programele Linux sau Unix \u0219i cum s\u0103 le structureze pentru o performan\u021b\u0103 ridicat\u0103.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux este <i>un sistem de operare<\/i> server, iar cel mai adesea aplica\u021biile dvs. func\u021bioneaz\u0103 pe acest sistem de operare. De\u0219i spun \u00abLinux\u00bb, \u00een cea mai mare parte a timpului, pute\u021bi presupune cu \u00eencredere c\u0103 se refer\u0103 la toate sistemele de operare de tip Unix \u00een general. Totu\u0219i, nu am testat codul care \u00eenso\u021be\u0219te pe alte sisteme. A\u0219adar, dac\u0103 v\u0103 intereseaz\u0103 FreeBSD sau OpenBSD, rezultatul poate varia. C\u00e2nd \u00eencerc ceva specific Linux, voi specifica acest lucru.<\/p>\n<p>De\u0219i pute\u021bi folosi cuno\u0219tin\u021bele dob\u00e2ndite pentru a crea o aplica\u021bie de la zero, care va fi optimizat\u0103 excelent, este mai bine s\u0103 nu face\u021bi astfel. Dac\u0103 ve\u021bi scrie un nou server web \u00een C sau C++ pentru aplica\u021bia de afaceri a organiza\u021biei dvs., s-ar putea s\u0103 fie ultima zi de munc\u0103 pentru dumneavoastr\u0103. Cu toate acestea, cunoa\u0219terea structurii acestor aplica\u021bii va ajuta \u00een alegerea programelor deja existente. Ve\u021bi putea compara sistemele bazate pe procese cu sistemele bazate pe fire, dar \u0219i cu cele bazate pe evenimente. Ve\u021bi \u00een\u021belege \u0219i aprecia de ce Nginx func\u021bioneaz\u0103 mai bine dec\u00e2t Apache httpd, de ce o aplica\u021bie Python bazat\u0103 pe Tornado poate deservi mai mul\u021bi utilizatori comparativ cu o aplica\u021bie Python bazat\u0103 pe Django.<\/p>\n<h1>ZeroHTTPd: instrument de \u00eenv\u0103\u021bare<\/h1>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">ZeroHTTPd<\/a><\/noindex>\u00a0\u2014 server web pe care l-am scris de la zero \u00een C ca instrument educa\u021bional. Nu are dependen\u021be externe, inclusiv acces la Redis. Rul\u0103m propriile proceduri Redis. Detalii mai jos.<\/p>\n<p>De\u0219i am putea discuta mult teorie, nu exist\u0103 nimic mai bun dec\u00e2t s\u0103 scriem cod, s\u0103-l rul\u0103m \u0219i s\u0103 compar\u0103m toate arhitecturile serverelor \u00eentre ele. Aceasta este cea mai ilustrativ\u0103 metod\u0103. Prin urmare, vom scrie un server web simplu ZeroHTTPd, aplic\u00e2nd fiecare model: bazat pe procese, fire \u0219i evenimente. Vom verifica fiecare dintre ace\u0219ti serveri \u0219i vom observa cum func\u021bioneaz\u0103 comparativ unul cu cel\u0103lalt. ZeroHTTPd este implementat \u00eentr-un singur fi\u0219ier C. Serverul bazat pe evenimente include <noindex><a rel=\"nofollow\" href=\"https:\/\/troydhanson.github.io\/uthash\/\">uthash<\/a><\/noindex>, o implementare excelent\u0103 a tabelului hash, care vine \u00eentr-un singur fi\u0219ier header. \u00cen celelalte cazuri, nu exist\u0103 dependen\u021be pentru a nu complica proiectul.<\/p>\n<p>Codul con\u021bine multe comentarii pentru a ajuta la \u00een\u021belegere. Fiind un server web simplu format din c\u00e2teva linii de cod, ZeroHTTPd reprezint\u0103, de asemenea, un cadru minim pentru dezvoltarea web. Are func\u021bionalitate limitat\u0103, dar este capabil s\u0103 livreze fi\u0219iere statice \u0219i pagini \u201edinamice\u201d foarte simple. Trebuie s\u0103 spun c\u0103 ZeroHTTPd este potrivit pentru \u00eenv\u0103\u021barea cre\u0103rii aplica\u021biilor Linux de \u00eenalt\u0103 performan\u021b\u0103. \u00cen esen\u021b\u0103, majoritatea serviciilor web a\u0219teapt\u0103 solicit\u0103ri, le verific\u0103 \u0219i le proceseaz\u0103. Exact aceasta va face ZeroHTTPd. Este un instrument de \u00eenv\u0103\u021bare, nu pentru produc\u021bie. Nu exceleaz\u0103 \u00een gestionarea erorilor \u0219i este pu\u021bin probabil s\u0103 se laude cu cele mai bune practici de securitate (oh da, am folosit <code>strcpy<\/code>) sau metode complexe ale limbajului C. Dar sper c\u0103 \u00ee\u0219i va \u00eendeplini bine sarcina.<\/p>\n<p><img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/33fd0a5353667001523d5d4c8ada9ecf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pagina principal\u0103 ZeroHTTPd. Poate livra diferite tipuri de fi\u0219iere, inclusiv imagini<\/i><\/p>\n<h1>Aplica\u021bia de carte de oaspe\u021bi<\/h1>\n<p>\nAplica\u021biile web moderne nu sunt \u00een general limitate la fi\u0219iere statice. Acestea au interac\u021biuni complexe cu diverse baze de date, cache-uri etc. A\u0219adar, vom crea o aplica\u021bie web simpl\u0103 numit\u0103 \u201eCartea de Oaspe\u021bi\u201d, unde vizitatorii pot l\u0103sa mesaje sub numele lor. \u00cen cartea de oaspe\u021bi se p\u0103streaz\u0103 mesajele anterioare. De asemenea, exist\u0103 un contor de vizitatori \u00een partea de jos a paginii.<\/p>\n<p><img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/ed8e828e8567d3d114875520988742d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Aplica\u021bia web \u201eCartea de Oaspe\u021bi\u201d ZeroHTTPd<\/i><\/p>\n<p>Contorul vizitatorilor \u0219i mesajele din cartea de oaspe\u021bi sunt stocate \u00een Redis. Pentru comunicarea cu Redis sunt implementate proceduri proprii, care nu depind de biblioteci externe. Nu sunt un mare fan al scrierii codului de m\u00e2n\u0103, c\u00e2nd exist\u0103 solu\u021bii publice bine testate. Dar scopul ZeroHTTPd este de a explora performan\u021ba Linux \u0219i accesul la servicii externe, \u00een timp ce gestionarea cererilor HTTP afecteaz\u0103 semnificativ performan\u021ba. Trebuie s\u0103 control\u0103m complet comunic\u0103rile cu Redis \u00een fiecare dintre arhitecturile noastre server. \u00centr-o arhitectur\u0103 folosim apeluri blocate, iar \u00een altele \u2013 proceduri bazate pe evenimente. Folosirea unei biblioteci client externe Redis nu ne va oferi un astfel de control. \u00cen plus, clientul nostru mic Redis execut\u0103 doar c\u00e2teva func\u021bii (recuperare, setare \u0219i incrementare a cheii; recuperare \u0219i ad\u0103ugare \u00eentr-un array). De asemenea, protocolul Redis este extrem de elegant \u0219i simplu. Nici nu trebuie s\u0103-l \u00eenve\u021bi special. Faptul c\u0103 toat\u0103 munca este realizat\u0103 de protocol \u00een aproximativ o sut\u0103 de linii de cod arat\u0103 c\u00e2t de bine a fost g\u00e2ndit.<\/p>\n<p>\u00cen figura urm\u0103toare sunt prezentate ac\u021biunile aplica\u021biei atunci c\u00e2nd clientul (browserul) face o cerere <code>\/guestbookURL<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/5c5e6740419384b7232aeead95db491b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mecanismul de func\u021bionare al aplica\u021biei c\u0103r\u021bii de oaspe\u021bi<\/i><\/p>\n<p>C\u00e2nd este nevoie s\u0103 livr\u0103m pagina c\u0103r\u021bii de oaspe\u021bi, se face un apel la sistemul de fi\u0219iere pentru a citi \u0219ablonul \u00een memorie \u0219i trei apeluri re\u021bea c\u0103tre Redis. Fi\u0219ierul \u0219ablon con\u021bine cea mai mare parte a con\u021binutului HTML pentru pagina din captura de ecran de mai sus. De asemenea, exist\u0103 locuri rezervate speciale pentru partea dinamic\u0103 a con\u021binutului: \u00eenregistr\u0103rile \u0219i contorul vizitatorilor. Le ob\u021binem din Redis, le inser\u0103m pe pagin\u0103 \u0219i oferim clientului con\u021binutul complet generat. Apelul al treilea c\u0103tre Redis poate fi evitat, deoarece Redis returneaz\u0103 o nou\u0103 valoare a cheii la incrementare. Totu\u0219i, pentru serverul nostru cu arhitectur\u0103 asincron\u0103 bazat\u0103 pe evenimente, numeroase apeluri re\u021bea sunt o provocare bun\u0103 \u00een scopuri educa\u021bionale. Astfel, abandon\u0103m valoarea returnat\u0103 de Redis despre num\u0103rul de vizitatori \u0219i o cerem printr-un apel separat.<\/p>\n<h1>Arhitecturi server ZeroHTTPd<\/h1>\n<p>\nConstruim \u0219apte versiuni ZeroHTTPd cu aceea\u0219i func\u021bionalitate, dar cu arhitecturi diferite:<\/p>\n<ul>\n<li>Iterativ\n<\/li>\n<li>Server fork (un proces fiu pe cerere)\n<\/li>\n<li>Server pre-fork (forking proces pe anticipat)\n<\/li>\n<li>Server cu fire de execu\u021bie (un fir pe cerere)\n<\/li>\n<li>Server cu fire pre-create\n<\/li>\n<li>Arhitectur\u0103 bazat\u0103 pe <code>poll()<\/code>\n<\/li>\n<li>Arhitectur\u0103 bazat\u0103 pe <code>epoll<\/code><\/li>\n<\/ul>\n<p>\nM\u0103sur\u0103m performan\u021ba fiec\u0103rei arhitecturi \u00eenc\u0103rc\u00e2nd serverul cu cereri HTTP. Dar c\u00e2nd compar\u0103m arhitecturi cu un grad \u00eenalt de concuren\u021b\u0103, num\u0103rul de cereri cre\u0219te. Test\u0103m de trei ori \u0219i calcul\u0103m media.<\/p>\n<h1>Metodologia de testare<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/aa4f337b6e90fa032fbef5374fac8f53.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Configurarea pentru testarea \u00eenc\u0103rc\u0103rii ZeroHTTPd<\/i> <\/p>\n<p>Este important ca, \u00een timpul test\u0103rii, toate componentele s\u0103 nu func\u021bioneze pe aceea\u0219i ma\u0219in\u0103. \u00cen acest caz, OS suport\u0103 costuri suplimentare de planificare, deoarece componentele concureaz\u0103 pentru CPU. M\u0103surarea costurilor de suprafa\u021b\u0103 ale sistemului de operare cu fiecare dintre arhitecturile server alese este unul dintre cele mai importante obiective ale acestui exerci\u021biu. Ad\u0103ugarea de variabile suplimentare va fi d\u0103un\u0103toare procesului. Drept urmare, configurarea din imaginea de mai sus func\u021bioneaz\u0103 cel mai bine.<\/p>\n<h3>Ce face fiecare dintre aceste servere<\/h3>\n<p><\/p>\n<ul>\n<li>load.unixism.net: aici rul\u0103m <code>ab<\/code>, utilitarul Apache Benchmark. Acesta genereaz\u0103 \u00eenc\u0103rcarea necesar\u0103 pentru a testa arhitecturile noastre server.\n<\/li>\n<li>nginx.unixism.net: uneori dorim s\u0103 rul\u0103m mai multe instan\u021be ale programului server. Pentru aceasta, serverul Nginx cu set\u0103rile corespunz\u0103toare ac\u021bioneaz\u0103 ca un balansor de \u00eenc\u0103rcare pentru <i>ab<\/i> procesele noastre de server.\n<\/li>\n<li>zerohttpd.unixism.net: aici rul\u0103m programele noastre server pe \u0219apte arhitecturi diferite, c\u00e2te una de fiecare dat\u0103.\n<\/li>\n<li>redis.unixism.net: pe acest server ruleaz\u0103 demonul Redis, unde sunt stocate \u00eenregistr\u0103rile din cartea de vizit\u0103 \u0219i num\u0103r\u0103torul vizitatorilor.<\/li>\n<\/ul>\n<p>\nToate serverele ruleaz\u0103 pe un singur nucleu de procesor. Ideea este de a evalua performan\u021ba maxim\u0103 a fiec\u0103rei arhitecturi. Deoarece toate programele server sunt testate pe acela\u0219i echipament, aceasta este baza de comparare. Configura\u021bia mea de testare const\u0103 \u00een servere virtuale \u00eenchiriate de la Digital Ocean.<\/p>\n<h3>Ce m\u0103sur\u0103m?<\/h3>\n<p>\nSe pot m\u0103sura diferite metrici. Evalu\u0103m performan\u021ba fiec\u0103rei arhitecturi \u00een aceast\u0103 configura\u021bie, \u00eenc\u0103rc\u00e2nd serverele cu cereri la diferite niveluri de paralelism: \u00eenc\u0103rcarea cre\u0219te de la 20 la 15.000 de utilizatori simultan.<\/p>\n<h1>Rezultatele testelor<\/h1>\n<p>\n\u00cen urm\u0103torul grafic este prezentat\u0103 performan\u021ba serverelor pe arhitecturi diferite la diferite niveluri de paralelism. Pe axa y \u2013 num\u0103rul de cereri pe secund\u0103, pe axa x \u2013 conexiuni paralele.<\/p>\n<p><img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/3415bcfb66503152d644130f68bd19da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/ba457b671eb758f3226e0eeafaadc6aa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Performan\u021ba aplica\u021biilor de re\u021bea Linux. Introducere\" src=\"\/wp-content\/uploads\/aea06856d61d4d4bdda9814c53a28d4a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMai jos este un tabel cu rezultatele.<\/p>\n<p> cereri pe secund\u0103 <\/p>\n<p><strong>paralelism<\/strong><br \/>\n<strong>iterativ<\/strong><br \/>\n<strong>fork<\/strong><br \/>\n<strong>pre-fork<\/strong><br \/>\n<strong>pe flux<\/strong><br \/>\n<strong>pre-pe flux<\/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 \/>\nvariabilitate mare<br \/>\n2138<\/p>\n<p>5000<br \/>\n\u2013<br \/>\nvariabilitate mare<br \/>\n1600<br \/>\n1100<br \/>\n2519<br \/>\n\u2013<br \/>\n2235<\/p>\n<p>8000<br \/>\n\u2013<br \/>\n\u2013<br \/>\n1200<br \/>\nvariabilitate mare<br \/>\n2451<br \/>\n\u2013<br \/>\n2100<\/p>\n<p>10\u00a0000<br \/>\n\u2013<br \/>\n\u2013<br \/>\nvariabilitate mare<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>\nDin grafic \u0219i tabel se observ\u0103 c\u0103 peste 8000 de cereri simultane, ne r\u0103m\u00e2n doar doi juc\u0103tori: pre-fork \u0219i epoll. Pe m\u0103sur\u0103 ce \u00eenc\u0103rcarea cre\u0219te, serverul bazat pe poll func\u021bioneaz\u0103 mai r\u0103u dec\u00e2t pe flux. Arhitectura cu crearea anticipat\u0103 a firelor se afl\u0103 \u00eentr-o competi\u021bie demn\u0103 cu epoll: aceasta arat\u0103 c\u00e2t de bine kernelul Linux planific\u0103 un num\u0103r mare de fire.<\/p>\n<h1>Codul surs\u0103 ZeroHTTPd<\/h1>\n<p>\nCodul surs\u0103 ZeroHTTPd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shuveb\/zerohttpd\">aici<\/a><\/noindex>. Pentru fiecare arhitectur\u0103 exist\u0103 un catalog separat.<\/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>\n\u00cen plus fa\u021b\u0103 de cele \u0219apte directoare pentru toate arhitecturile, \u00een directorul de nivel superior mai sunt dou\u0103: public \u0219i templates. \u00cen primul se afl\u0103 fi\u0219ierul index.html \u0219i imaginea din primul screenshot. Acolo se pot plasa alte fi\u0219iere \u0219i foldere, iar ZeroHTTPd ar trebui s\u0103 furnizeze f\u0103r\u0103 probleme aceste fi\u0219iere statice. Dac\u0103 calea din browser corespunde c\u0103ii din folderul public, atunci ZeroHTTPd caut\u0103 \u00een acest director fi\u0219ierul index.html. Con\u021binutul pentru cartea de oaspe\u021bi este generat dinamic. Are doar pagina principal\u0103, iar con\u021binutul s\u0103u se bazeaz\u0103 pe fi\u0219ierul 'templates\/guestbook\/index.html'. \u00cen ZeroHTTPd, paginile dinamice pot fi ad\u0103ugate u\u0219or pentru extensie. Ideea este c\u0103 utilizatorii pot ad\u0103uga \u0219abloane \u00een acest director \u0219i extinde ZeroHTTPd dup\u0103 cum este necesar.<\/p>\n<p>Pentru a construi toate cele \u0219apte servere, rula\u021bi <code>make all<\/code> din directorul de nivel superior - \u0219i toate construc\u021biile vor ap\u0103rea \u00een acest director. Fi\u0219ierele executabile caut\u0103 directoarele public \u0219i templates \u00een directorul din care sunt lansate.<\/p>\n<h1>API-ul Linux<\/h1>\n<p>\nPentru a \u00een\u021belege informa\u021biile din acest ciclu de articole, nu este necesar s\u0103 ave\u021bi o cuno\u0219tin\u021b\u0103 profund\u0103 despre API-ul Linux. Totu\u0219i, recomand s\u0103 citi\u021bi mai multe despre acest subiect, exist\u0103 multe resurse de referin\u021b\u0103 online. De\u0219i vom aborda c\u00e2teva categorii ale API-ului Linux, aten\u021bia noastr\u0103 se va concentra \u00een principal asupra proceselor, firelor de execu\u021bie, evenimentelor \u0219i stivei de re\u021bea. Pe l\u00e2ng\u0103 c\u0103r\u021bile \u0219i articolele despre API-ul Linux, v\u0103 recomand de asemenea s\u0103 consulta\u021bi man-urile pentru apelurile sistem \u0219i func\u021biile bibliotecilor utilizate.<\/p>\n<h1>Performan\u021b\u0103 \u0219i scalabilitate<\/h1>\n<p>\nO observa\u021bie despre performan\u021b\u0103 \u0219i scalabilitate. Teoretic, nu exist\u0103 nicio leg\u0103tur\u0103 \u00eentre ele. Pute\u021bi avea un serviciu web care func\u021bioneaz\u0103 foarte bine, cu un timp de r\u0103spuns de c\u00e2teva milisecunde, dar care nu se scal\u0103 deloc. De asemenea, poate exista o aplica\u021bie web care func\u021bioneaz\u0103 prost, care necesit\u0103 c\u00e2teva secunde pentru a r\u0103spunde, dar care se scaleaz\u0103 pe zeci pentru a gestiona zeci de mii de utilizatori simultan. Cu toate acestea, combina\u021bia de performan\u021b\u0103 ridicat\u0103 \u0219i scalabilitate este o combina\u021bie foarte puternic\u0103. Aplica\u021biile de \u00eenalt\u0103 performan\u021b\u0103 folosesc, \u00een general, resursele \u00eentr-un mod economic \u0219i, prin urmare, servesc eficient mai mul\u021bi utilizatori simultani pe server, reduc\u00e2nd costurile.<\/p>\n<h1>Sarcinile CPU \u0219i I\/O<\/h1>\n<p>\n\u00cen sf\u00e2r\u0219it, \u00een calcule exist\u0103 \u00eentotdeauna dou\u0103 tipuri posibile de sarcini: pentru I\/O \u0219i CPU. Primele cereri prin internet (input-output de re\u021bea), gestionarea fi\u0219ierelor (input-output de re\u021bea \u0219i de pe disc), comunic\u0103rile cu baza de date (input-output de re\u021bea \u0219i de pe disc) \u2014 toate acestea sunt ac\u021biuni I\/O. Unele cereri c\u0103tre baza de date pot solicita pu\u021bin din CPU (sortare, calcularea mediei a unui milion de rezultate etc.). Majoritatea aplica\u021biilor web sunt limitate de I\/O-ul maxim posibil, iar procesorul este rareori utilizat la capacitate maxim\u0103. C\u00e2nd observa\u021bi c\u0103 o sarcin\u0103 de input-output utilizeaz\u0103 mult CPU, probabil c\u0103 acesta este un semn al unei arhitecturi slabe a aplica\u021biei. Acest lucru poate \u00eensemna c\u0103 resursele CPU sunt consumate pentru gestionarea proceselor \u0219i schimbarea contextului \u2014 \u0219i acest lucru nu este foarte util. Dac\u0103 face\u021bi ceva de genul prelucr\u0103rii imaginilor, conversiei fi\u0219ierelor audio sau \u00eenv\u0103\u021b\u0103rii automate, atunci aplica\u021bia necesit\u0103 resurse CPU puternice. Dar pentru majoritatea aplica\u021biilor, nu este cazul.<\/p>\n<h1>Mai multe detalii despre arhitecturile serverului<\/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\/\">Partea I. Arhitectura iterativ\u0103<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-ii-forking-servers\/\">Partea II. Servere de tip fork<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-iii-preforked-servers\/\">Partea III. Servere 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\/\">Partea IV. Servere cu fire de execu\u021bie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-v-pre-threaded-servers\/\">Partea V. Servere cu crearea anticipat\u0103 a firelor<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vi-polling-servers\/\">Partea VI. Arhitectura bazat\u0103 pe poll<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/unixism.net\/2019\/04\/28\/linux-applications-performance-part-vii-epoll-servers\/\">Partea VII. Arhitectura bazat\u0103 pe epoll<\/a><\/noindex><\/li>\n<\/ol>\n<p>Sursa: <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.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\/ro\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Performan\u021ba aplica\u021biilor de re\u021bea pe Linux. Introducere | ProHoster","description":"Aplica\u021biile web sunt acum utilizate pe scar\u0103 larg\u0103, iar printre toate protocoalele de transport, HTTP ocup\u0103 o mare parte.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/proizvoditelnost-setevyh-prilozhenij-linux-vvedenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/35106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=35106"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/35106\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=35106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=35106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=35106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}