{"id":20890,"date":"2026-08-22T11:51:32","date_gmt":"2026-08-22T09:51:32","guid":{"rendered":"https:\/\/webhosting.de\/so-reuseport-linux-webserver-performance-optimierung-core\/"},"modified":"2026-08-22T11:51:32","modified_gmt":"2026-08-22T09:51:32","slug":"tak-reuseport-linux-serwer-www-optymalizacja-wydajnosci-rdzen","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pl\/so-reuseport-linux-webserver-performance-optimierung-core\/","title":{"rendered":"SO_REUSEPORT w systemie Linux: wi\u0119ksza wydajno\u015b\u0107 serwer\u00f3w WWW"},"content":{"rendered":"<p>Poka\u017c\u0119, w jaki spos\u00f3b SO_REUSEPORT przyspiesza dzia\u0142anie serwer\u00f3w WWW w systemie Linux obs\u0142uguj\u0105cych wiele jednoczesnych po\u0142\u0105cze\u0144 oraz eliminuje w\u0105skie gard\u0142a w <strong>Akceptuj<\/strong> usuni\u0119te. Stawiam przy tym na przejrzyste procedury, aby\u015b m\u00f3g\u0142 osi\u0105gn\u0105\u0107 wi\u0119cej na systemach wielordzeniowych <strong>Wydajno\u015b\u0107<\/strong> wyjmujesz.<\/p>\n\n<h2>Punkty centralne<\/h2>\n<ul>\n  <li><strong>Ograniczenie przepustowo\u015bci Accept<\/strong> unika\u0107 i zmniejsza\u0107 op\u00f3\u017anienia<\/li>\n  <li><strong>Wielordzeniowy<\/strong> efektywne wykorzystanie mocy obliczeniowej dzi\u0119ki rozk\u0142adowi j\u0105dra<\/li>\n  <li><strong>Grzmi\u0105ca kuchenka<\/strong> znacznie zmniejszy\u0107<\/li>\n  <li><strong>Architektura<\/strong> uproszczenie bez wykorzystania dyspozytora w przestrzeni u\u017cytkownika<\/li>\n  <li><strong>Nginx<\/strong> oraz korzysta\u0107 bezpo\u015brednio z innych serwer\u00f3w<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/webserver-performance-3471.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Jak SO_REUSEPORT rozwi\u0105zuje to pod wzgl\u0119dem technicznym<\/h2>\n\n<p>SO_REUSEPORT przydziela ka\u017cdemu procesowi roboczemu w\u0142asny gniazd s\u0142uchaj\u0105cy, dzi\u0119ki czemu mog\u0119 zastosowa\u0107 klasyczne <strong>w\u0105skie gard\u0142o<\/strong> nale\u017cy unika\u0107 w przypadku centralnego akceptowania po\u0142\u0105cze\u0144. Wcze\u015bniej wszystko opiera\u0142o si\u0119 na jednym gnie\u017adzie, co powodowa\u0142o konkurencj\u0119 mi\u0119dzy w\u0105tkami i wyd\u0142u\u017ca\u0142o czas oczekiwania. Obecnie j\u0105dro rozdziela nowe po\u0142\u0105czenia bezpo\u015brednio na wiele gniazd, co <strong>Op\u00f3\u017anienie<\/strong> znacznie zmniejsza. W ten spos\u00f3b eliminuj\u0119 potrzeb\u0119 uruchamiania oddzielnych proces\u00f3w dyspozytorskich i ograniczam liczb\u0119 zmian kontekstu. Przy du\u017cym obci\u0105\u017ceniu czasy reakcji pozostaj\u0105 bardziej stabilne, poniewa\u017c \u017caden pojedynczy modu\u0142 nas\u0142uchuj\u0105cy nie spowalnia dzia\u0142ania.<\/p>\n\n<h2>Kr\u00f3tkie por\u00f3wnanie SO_REUSEPORT i SO_REUSEADDR<\/h2>\n\n<p>SO_REUSEADDR pomaga mi w szybkim ponownym uruchomieniu, poniewa\u017c mog\u0119 korzysta\u0107 z port\u00f3w pomimo <strong>TIME_WAIT<\/strong> mo\u017ce ponownie nawi\u0105za\u0107 po\u0142\u0105czenie. SO_REUSEPORT rozwi\u0105zuje inn\u0105 kwesti\u0119: uruchamianie wielu listener\u00f3w jednocze\u015bnie na tej samej kombinacji adresu IP i portu. Dopiero gdy przed wywo\u0142aniem funkcji bind() ustawi\u0119 SO_REUSEPORT, j\u0105dro zezwala na r\u00f3wnoleg\u0142e <strong>Bind<\/strong>-Operacja. Wa\u017cna jest kolejno\u015b\u0107: je\u015bli port bez tej opcji jest zaj\u0119ty, nie mo\u017cna do niego pod\u0142\u0105czy\u0107 kolejnych gniazd. Dlatego w przypadku r\u00f3wnoleg\u0142ych proces\u00f3w roboczych kluczow\u0105 opcj\u0105 jest SO_REUSEPORT.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/optimierte_webserver_1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Dzia\u0142anie w j\u0105drze: grupy Reuseport i funkcja skr\u00f3tu<\/h2>\n\n<p>Wszystkie gniazda o identycznej kombinacji adresu IP i portu oraz z ustawionym flag\u0105 SO_REUSEPORT trafiaj\u0105 do jednej <strong>Grupa<\/strong>. J\u0105dro oblicza dla ka\u017cdego nowego po\u0142\u0105czenia skr\u00f3t na podstawie parametr\u00f3w \u017ar\u00f3d\u0142owych i docelowych. Na tej podstawie przypisuje po\u0142\u0105czenie do odpowiedniego modu\u0142u nas\u0142uchuj\u0105cego, zapewniaj\u0105c w ten spos\u00f3b stosunkowo sprawiedliwy rozk\u0142ad obci\u0105\u017cenia. Korzystam z lepszej lokalno\u015bci pami\u0119ci podr\u0119cznej, poniewa\u017c ka\u017cdy procesor cz\u0119\u015bciej obs\u0142uguje \u201eswoje\u201c po\u0142\u0105czenia. W szczeg\u00f3lnych przypadkach BPF mo\u017ce <strong>Wyb\u00f3r<\/strong> dalsze dostosowywanie, na przyk\u0142ad w celu wdro\u017cenia w\u0142asnych strategii.<\/p>\n\n<h2>W praktyce: Prawid\u0142owa konfiguracja serwera Nginx<\/h2>\n\n<p>W Nginxie w\u0142\u0105czam opcj\u0119 \u201ereuseport\u201d za pomoc\u0105 dyrektywy \u201elisten\u201d i korzystam z kilku <strong>Pracownik<\/strong>-procesy. Przyk\u0142ad: nale\u017cy ustawi\u0107 parametr `worker_processes` na liczb\u0119 rdzeni, a w bloku serwera wpisa\u0107 \u201elisten 80 reuseport;\u201c. W\u00f3wczas ka\u017cdy proces roboczy otrzyma w\u0142asny modu\u0142 nas\u0142uchuj\u0105cy, a j\u0105dro automatycznie rozdzieli nowe po\u0142\u0105czenia. Szczeg\u00f3\u0142owe informacje na temat optymalnej liczby proces\u00f3w roboczych mo\u017cna znale\u017a\u0107 w <a href=\"https:\/\/webhosting.de\/pl\/optymalna-konfiguracja-procesow-roboczych-nginx-zwiekszenie-wydajnosci\/\">Procesy robocze Nginx<\/a>. W ten spos\u00f3b uzyskuj\u0119 wy\u017csz\u0105 liczb\u0119 \u017c\u0105da\u0144 i r\u00f3wnomierne obci\u0105\u017cenie rdzeni.<\/p>\n\n<h2>Efektywne wykorzystanie mocy obliczeniowej procesor\u00f3w wielordzeniowych<\/h2>\n\n<p>Korzystam z kilku proces\u00f3w i opcji SO_REUSEPORT <strong>Wielordzeniowy<\/strong>-systemy dzia\u0142aj\u0105 bardziej r\u00f3wnomiernie. Przypisuj\u0119 procesy robocze do rdzeni na podstawie powinowactwa procesora, aby ograniczy\u0107 zjawisko \u201ecache-hoppingu\u201c. Funkcje RSS\/RPS na karcie sieciowej pomagaj\u0105 odpowiednio rozdziela\u0107 przychodz\u0105ce pakiety mi\u0119dzy kolejki. Dzi\u0119ki temu po\u0142\u0105czenia cz\u0119\u015bciej trafiaj\u0105 do \u201eodpowiednich\u201d rdzeni, co <strong>Przepustowo\u015b\u0107<\/strong>-zwi\u0119ksza przepustowo\u015b\u0107. Efekt ten jest szczeg\u00f3lnie widoczny w przypadku wielu kr\u00f3tkich po\u0142\u0105cze\u0144 i procedur nawi\u0105zywania po\u0142\u0105czenia TLS.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux-server-performance-boost-2341.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Monitorowanie, restartowanie stopniowe i pu\u0142apki<\/h2>\n\n<p>Planuj\u0119 restartowanie stopniowe z du\u017c\u0105 ostro\u017cno\u015bci\u0105, poniewa\u017c zamkni\u0119cie gniazda nas\u0142uchuj\u0105cego mo\u017ce spowodowa\u0107 utrat\u0119 <strong>zaleg\u0142o\u015bci<\/strong>-wpis\u00f3w. Zanim zako\u0144cz\u0119 dzia\u0142anie proces\u00f3w roboczych, czekam, a\u017c ich kolejki zostan\u0105 opr\u00f3\u017cnione, i dopiero wtedy wy\u0142\u0105czam je z dzia\u0142ania. W przypadku log\u00f3w wybieram oddzielne pliki dla ka\u017cdego procesu roboczego, aby p\u00f3\u017aniej m\u00f3c prze\u015bledzi\u0107 rozk\u0142ad danych. Narz\u0119dzia monitoruj\u0105ce musz\u0105 uwzgl\u0119dnia\u0107 wiele proces\u00f3w, w przeciwnym razie wska\u017aniki mog\u0105 wprowadza\u0107 w b\u0142\u0105d. W przypadku powi\u0105za\u0144 adres\u00f3w IP zwracam uwag\u0119 na sp\u00f3jno\u015b\u0107, poniewa\u017c w przeciwnym razie adres 0.0.0.0 i konkretne adresy IP <strong>Konflikty<\/strong> mo\u017cna wytworzy\u0107.<\/p>\n\n<h2>SO_REUSEPORT poza protoko\u0142em HTTP<\/h2>\n\n<p>Ta zasada pomaga mi r\u00f3wnie\u017c w <strong>UDP<\/strong>-us\u0142ug, takich jak DNS, streaming czy serwery gier. W ten spos\u00f3b wiele nowych pakiet\u00f3w na sekund\u0119 jest rozdzielanych mi\u0119dzy kilka modu\u0142\u00f3w nas\u0142uchuj\u0105cych, bez konieczno\u015bci stosowania load balancera w przestrzeni u\u017cytkownika. Korzy\u015bci odnosz\u0105 r\u00f3wnie\u017c proxy TCP, bramy sieciowe i platformy IoT. Istotne jest zachowanie odpowiedniej liczby proces\u00f3w roboczych, aby sprz\u0119t i oprogramowanie dzia\u0142a\u0142y zsynchronizowane. \u0141\u0105cz\u0119 t\u0119 konfiguracj\u0119 z jasnymi <strong>Ograniczenia<\/strong> dla deskryptor\u00f3w plik\u00f3w i prawid\u0142owych warto\u015bci limit\u00f3w czasu.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux_nacht_webserver_7834.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Optymalizacja stosu sieciowego: IRQ, odci\u0105\u017canie, bufory<\/h2>\n\n<p>Sprawdzam przydzia\u0142y IRQ karty sieciowej, aby kolejki by\u0142y przypisane do odpowiednich <strong>CPU<\/strong>-j\u0105der. Tam, gdzie to ma sens, korzystam z GRO\/LRO i offload\u00f3w, ale zawsze sprawdzam op\u00f3\u017anienie. Bufory gniazd ustawiam \u015bwiadomie, poniewa\u017c zbyt ma\u0142e warto\u015bci spowalniaj\u0105 dzia\u0142anie w momentach szczytowego obci\u0105\u017cenia, a zbyt du\u017ce marnuj\u0105 pami\u0119\u0107; wi\u0119cej na ten temat w sekcji <a href=\"https:\/\/webhosting.de\/pl\/bufory-gniazd-serwera-strojenie-hostingu-buforopti\/\">Bufor gniazda<\/a>. Sprawdzam r\u00f3wnie\u017c parametry sysctl, takie jak somaxconn i net.core.somaxconn, pod k\u0105tem zgodno\u015bci z profilem obci\u0105\u017cenia. Mierz\u0119 wp\u0142yw ka\u017cdej zmiany osobno, aby uzyska\u0107 rzeczywiste <strong>Wygrane<\/strong> zobaczy\u0107.<\/p>\n\n<h2>Por\u00f3wnanie popularnych konfiguracji serwer\u00f3w WWW<\/h2>\n\n<p>Poni\u017csza tabela przedstawia typowe cechy r\u00f3\u017cnych modeli listener\u00f3w i pomaga mi w <strong>Wyb\u00f3r<\/strong> projektu. Skupiam si\u0119 na \u015bcie\u017cce akceptacji, op\u00f3\u017anieniach pod obci\u0105\u017ceniem, w\u0142a\u015bciwo\u015bciach skalowalno\u015bci, nak\u0142adzie zwi\u0105zanym z architektur\u0105 oraz obci\u0105\u017ceniu procesora. Dzi\u0119ki temu szybko rozpoznaj\u0119, kt\u00f3ra konfiguracja pasuje do mojego profilu ruchu. Oddzielam teori\u0119 od praktyki, sprawdzaj\u0105c nast\u0119pnie rzeczywiste wska\u017aniki. Te <strong>Matryca<\/strong> s\u0142u\u017cy jako punkt wyj\u015bcia do przeprowadzenia ukierunkowanych test\u00f3w.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Konfiguracja<\/th>\n      <th>\u015acie\u017cka Accept<\/th>\n      <th>Op\u00f3\u017anienie pod obci\u0105\u017ceniem<\/th>\n      <th>Skalowanie<\/th>\n      <th>Koszty architektoniczne<\/th>\n      <th>Wykorzystanie procesora<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>S\u0142uchacz bez SO_REUSEPORT<\/td>\n      <td>A <strong>Gniazdo<\/strong><\/td>\n      <td>wschodzi wcze\u015bnie<\/td>\n      <td>ograniczony<\/td>\n      <td>niski<\/td>\n      <td>nier\u00f3wny<\/td>\n    <\/tr>\n    <tr>\n      <td>Kilka proces\u00f3w z opcj\u0105 SO_REUSEPORT<\/td>\n      <td>J\u0105dro-<strong>Dystrybucja<\/strong><\/td>\n      <td>bardziej sta\u0142y<\/td>\n      <td>wysoki<\/td>\n      <td>niski<\/td>\n      <td>bardziej r\u00f3wnomierny<\/td>\n    <\/tr>\n    <tr>\n      <td>Dyspozytor w przestrzeni u\u017cytkownika<\/td>\n      <td>przyj\u0119cie centralne<\/td>\n      <td>\u015bredni<\/td>\n      <td>\u015bredni<\/td>\n      <td>wysoki<\/td>\n      <td>zmienny<\/td>\n    <\/tr>\n    <tr>\n      <td>SO_REUSEPORT + logika BPF<\/td>\n      <td>dostosowany wyb\u00f3r<\/td>\n      <td>bardzo stabilny<\/td>\n      <td>Bardzo wysoka<\/td>\n      <td>\u015bredni<\/td>\n      <td>bardzo r\u00f3wnomiernie<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/entwicklerschreibtisch0391.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Jak prawid\u0142owo zaplanowa\u0107 testy por\u00f3wnawcze<\/h2>\n\n<p>Testuj\u0119 zar\u00f3wno z opcj\u0105 SO_REUSEPORT, jak i bez niej, aby uzyska\u0107 rzeczywiste <strong>R\u00f3\u017cnice<\/strong> do sprawdzenia. Istotnymi wska\u017anikami s\u0105 liczba \u017c\u0105da\u0144 na sekund\u0119, op\u00f3\u017anienia p95\/p99 oraz obci\u0105\u017cenie procesora na rdze\u0144. Zmieniam liczb\u0119 proces\u00f3w roboczych i sprawdzam optymalny punkt r\u00f3wnowagi mi\u0119dzy zmianami kontekstu a obci\u0105\u017ceniem. Dane testowe dobieram tak, aby by\u0142y zbli\u017cone do rzeczywistych, uwzgl\u0119dniaj\u0105c TLS, Keep-Alive oraz tre\u015bci statyczne i dynamiczne. Wyniki rejestruj\u0119 w spos\u00f3b umo\u017cliwiaj\u0105cy ich odtworzenie, aby p\u00f3\u017aniej <strong>Zmiany<\/strong> mo\u017cna por\u00f3wna\u0107.<\/p>\n\n<h2>Apache: Jak efektywnie korzysta\u0107 z modulu MPM Event<\/h2>\n\n<p>R\u00f3wnie\u017c Apache odniesie korzy\u015bci, je\u015bli oddziel\u0119 \u015bcie\u017ck\u0119 Accept i ustawi\u0119 <strong>Wydarzenie<\/strong>-Prawid\u0142owa eksploatacja MPM. Wyb\u00f3r mi\u0119dzy Event-MPM a Worker-MPM zale\u017cy od profilu po\u0142\u0105czenia i zasob\u00f3w. Bior\u0119 pod uwag\u0119 funkcj\u0119 Keep-Alive, pule w\u0105tk\u00f3w oraz limity dla klient\u00f3w. W skr\u00f3cie pomaga mi w tym poni\u017cszy przegl\u0105d: <a href=\"https:\/\/webhosting.de\/pl\/apache-mpm-event-a-mpm-worker-dostrajanie-i-optymalizacja-serwera-www\/\">MPM zdarzeniowy a MPM roboczy<\/a>. W po\u0142\u0105czeniu z SO_REUSEPORT pracuj\u0119 nad uzyskaniem r\u00f3wnomiernego <strong>Obci\u0105\u017cenie<\/strong> na proces.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/server-performance-linux-4852.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Ograniczenia i niuanse dystrybucji<\/h2>\n<p>SO_REUSEPORT rozdziela przychodz\u0105ce po\u0142\u0105czenia za pomoc\u0105 funkcji skr\u00f3tu w spos\u00f3b wzgl\u0119dnie sprawiedliwy, ale nie idealnie r\u00f3wnomierny. Szczyty obci\u0105\u017cenia mog\u0105 chwilowo silniej obci\u0105\u017ca\u0107 poszczeg\u00f3lne procesy robocze, je\u015bli parametry \u017ar\u00f3d\u0142a\/celu powoduj\u0105 niekorzystny rozk\u0142ad. Dlatego monitoruj\u0119 wska\u017aniki poszczeg\u00f3lnych proces\u00f3w roboczych (liczba przyj\u0119tych po\u0142\u0105cze\u0144, aktywne po\u0142\u0105czenia, obci\u0105\u017cenie procesora) i dostosowuj\u0119 liczb\u0119 proces\u00f3w roboczych, afynicze oraz kolejki RSS. Po\u0142\u0105czenia typu Keep-Alive pozostaj\u0105 przy pierwotnym listenerze, co zapewnia po\u017c\u0105dan\u0105 lokalno\u015b\u0107 pami\u0119ci podr\u0119cznej, ale mo\u017ce r\u00f3wnie\u017c prowadzi\u0107 do \u201eprzylepnych\u201c wzorc\u00f3w obci\u0105\u017cenia. W przypadku bardzo zr\u00f3\u017cnicowanych \u017c\u0105da\u0144 (mieszanych, obci\u0105\u017caj\u0105cych zar\u00f3wno procesor, jak i wej\u015bcie\/wyj\u015bcie) planuj\u0119 bufory, aby z\u0142agodzi\u0107 kr\u00f3tkie skoki obci\u0105\u017cenia.<\/p>\n\n<h2>Szczeg\u00f3\u0142y dotycz\u0105ce \u015bcie\u017cki Accept: Backlog, somaxconn i kolejki SYN<\/h2>\n<p>Rozr\u00f3\u017cniam kolejk\u0119 listy (SYN-Backlog) i kolejk\u0119 Accept. Parametry takie jak net.ipv4.tcp_max_syn_backlog, tcp_syncookies oraz net.core.somaxconn wp\u0142ywaj\u0105 na liczb\u0119 przechowywanych pr\u00f3b nawi\u0105zania po\u0142\u0105czenia i w pe\u0142ni ustanowionych gniazd. Backlog jest obliczany oddzielnie dla ka\u017cdego gniazda nas\u0142uchuj\u0105cego \u2013 przy u\u017cyciu SO_REUSEPORT teoretyczna pojemno\u015b\u0107 bufora mno\u017cy si\u0119 dla wszystkich proces\u00f3w roboczych. W praktyce ograniczeniem s\u0105 jednak karta sieciowa i obci\u0105\u017cenie procesora. Utrzymuj\u0119 sp\u00f3jno\u015b\u0107 bufor\u00f3w i mierz\u0119 wska\u017aniki odrzuconych i ponownie przes\u0142anych pakiet\u00f3w, aby wcze\u015bnie wykrywa\u0107 w\u0105skie gard\u0142a.<\/p>\n\n<h2>Szczeg\u00f3\u0142y dotycz\u0105ce Nginx: accept_mutex, wy\u0142\u0105czanie proces\u00f3w roboczych i TLS<\/h2>\n<p>Gdy tylko korzystam z reuseport, wy\u0142\u0105czam accept_mutex w Nginxie, poniewa\u017c j\u0105dro przejmuje zadanie sprawiedliwego przydzielania. Podczas restartu typu rolling-restart wybieram opcj\u0119 \u201egraceful\u201c i czekam na zako\u0144czenie po\u0142\u0105cze\u0144 Keep-Alive, aby nie przerwa\u0107 d\u0142ugotrwa\u0142ych transfer\u00f3w. Je\u015bli chodzi o TLS, dbam o wsp\u00f3lne klucze bilet\u00f3w mi\u0119dzy procesami roboczymi\/instancjami, aby wznowienie po\u0142\u0105cze\u0144 i identyfikatory sesji dzia\u0142a\u0142y niezale\u017cnie od przydzielonego s\u0142uchacza. Sprawdzam, czy procesy robocze nie staj\u0105 si\u0119 zbyt du\u017ce (zajmowana pami\u0119\u0107 podr\u0119czna i pami\u0119\u0107 operacyjna), aby unikn\u0105\u0107 \u201ezimnych\u201d pami\u0119ci podr\u0119cznych podczas prze\u0142\u0105czania proces\u00f3w.<\/p>\n\n<h2>Aktywacja gniazd systemd, kontenery i orkiestracja<\/h2>\n<p>Je\u015bli systemd otwiera gniazda z wyprzedzeniem, musi ustawi\u0107 flag\u0119 SO_REUSEPORT, w przeciwnym razie r\u00f3wnoleg\u0142e operacje bind zostan\u0105 zablokowane. W \u015brodowiskach kontenerowych zwracam uwag\u0119, aby dla ka\u017cdego poda\/kontenera faktycznie uruchamiana by\u0142a \u017c\u0105dana liczba proces\u00f3w worker\u00f3w, a przydzia\u0142 zasob\u00f3w procesora w cgroup by\u0142 zgodny ze strategi\u0105 powinowactwa. W orkiestratorach planuj\u0119 strategi\u0119 aktualizacji krocz\u0105cej tak, aby grupa Reuseport pozostawa\u0142a stabilna podczas wdra\u017cania i nie blokowa\u0142a \u017cadnego portu na wy\u0142\u0105czno\u015b\u0107. Kontrole stanu nie powinny generowa\u0107 niepotrzebnego \u201eszumu\u201d dla poszczeg\u00f3lnych proces\u00f3w roboczych i zafa\u0142szowywa\u0107 rozk\u0142adu wynik\u00f3w.<\/p>\n\n<h2>Obs\u0142uga NUMA i lokalno\u015b\u0107 pami\u0119ci<\/h2>\n<p>W systemach NUMA przypisuj\u0119 procesy robocze do rdzeni tego samego w\u0119z\u0142a NUMA i dbam o to, by sygna\u0142y IRQ kart sieciowych trafia\u0142y przede wszystkim tam. Monitoruj\u0119 dost\u0119py do pami\u0119ci zdalnej oraz migracje stron, poniewa\u017c powoduj\u0105 one skoki op\u00f3\u017anie\u0144. W przypadku znacznego skalowania obci\u0105\u017cenia sensownym rozwi\u0105zaniem mo\u017ce by\u0107 replikacja na ka\u017cdym w\u0119\u017ale NUMA z w\u0142asnym portem\/frontendem; w po\u0142\u0105czeniu z opcj\u0105 SO_REUSEPORT uzyskuj\u0119 bardzo stabilne op\u00f3\u017anienia, o ile \u015bcie\u017cki danych i kodu pozostaj\u0105 lokalne dla danego w\u0119z\u0142a.<\/p>\n\n<h2>HTTP\/3 i protok\u00f3\u0142 UDP<\/h2>\n<p>W przypadku protoko\u0142u HTTP\/3 (QUIC) szczeg\u00f3lnie korzystam z opcji SO_REUSEPORT w \u015bcie\u017cce UDP: wiele procedur uzgadniania po\u0142\u0105czenia i kr\u00f3tkotrwa\u0142ych po\u0142\u0105cze\u0144 jest rozdzielanych bez dodatkowego modulu r\u00f3wnowa\u017cenia obci\u0105\u017cenia w przestrzeni u\u017cytkownika. Dbam o wystarczaj\u0105co du\u017ce bufory UDP i sprawdzam liczniki utraty pakiet\u00f3w dla ka\u017cdej kolejki. Poniewa\u017c QUIC logicznie wi\u0105\u017ce po\u0142\u0105czenia z 5-tuplem, rozk\u0142ad pozostaje stabilny, jednak zabezpieczam si\u0119 za pomoc\u0105 sp\u00f3jnych strategii ponownych pr\u00f3b i token\u00f3w, aby wyb\u00f3r pracownika pozostawa\u0142 przejrzysty i wydajny.<\/p>\n\n<h2>Precyzyjne dostrojenie eBPF dla Reuseport<\/h2>\n<p>Za pomoc\u0105 programu BPF typu Reuseport mog\u0119 dalej sterowa\u0107 wyborem gniazd, na przyk\u0142ad na podstawie nazwy hosta docelowego (SNI), lokalnych priorytet\u00f3w lub obci\u0105\u017cenia poszczeg\u00f3lnych proces\u00f3w roboczych. Korzystam z tego tylko wtedy, gdy standardowy rozk\u0142ad hashowy nie wystarcza, poniewa\u017c dodatkowa logika zwi\u0119ksza z\u0142o\u017cono\u015b\u0107. W celu rozwi\u0105zywania problem\u00f3w sprawdzam, czy programy BPF zosta\u0142y rzeczywi\u015bcie za\u0142adowane i dzia\u0142aj\u0105 bezb\u0142\u0119dnie, a tak\u017ce przygotowuj\u0119 strategi\u0119 awaryjn\u0105 na wypadek konieczno\u015bci wy\u0142adowania polityki.<\/p>\n\n<h2>Odporno\u015b\u0107 i bezpiecze\u0144stwo DDoS<\/h2>\n<p>SO_REUSEPORT zwi\u0119ksza przepustowo\u015b\u0107 \u2013 to zar\u00f3wno zaleta, jak i ryzyko. Ustawiam limity przepustowo\u015bci i limity po\u0142\u0105cze\u0144 dla ka\u017cdego pracownika, aby poszczeg\u00f3lne procesy nie by\u0142y nadmiernie obci\u0105\u017cone. W po\u0142\u0105czeniu z plikami SYN-Cookie, umiarkowanymi limitami czasu i odpowiednimi limitami warstwy L7 zapobiegam sytuacji, w kt\u00f3rej szczyty obci\u0105\u017cenia trwale anga\u017cuj\u0105 zasoby. Rozdzielam logi, aby szybciej wykrywa\u0107 wzorce nadu\u017cy\u0107 dla poszczeg\u00f3lnych proces\u00f3w, a w razie potrzeby korzystam z iptables\/nftables, aby wcze\u015bnie ograniczy\u0107 z\u0142o\u015bliwe \u017ar\u00f3d\u0142a.<\/p>\n\n<h2>Debugowanie i weryfikacja<\/h2>\n<p>Sprawdzam konfiguracj\u0119 za pomoc\u0105 polece\u0144 `ss -ltnp` (TCP) lub `ss -lunp` (UDP), aby zobaczy\u0107, czy na tej samej kombinacji adresu IP i portu dzia\u0142a kilka proces\u00f3w nas\u0142uchuj\u0105cych. Za pomoc\u0105 narz\u0119dzi `perf`, `top\/htop` i `mpstat` weryfikuj\u0119, czy obci\u0105\u017cenie procesora jest r\u00f3wnomierne. Liczniki netstat\/ss, komunikaty dmesg oraz statystyki odrzuconych pakiet\u00f3w karty sieciowej (ethtool -S) wskazuj\u0105, czy kolejki ulegaj\u0105 przepe\u0142nieniu. W celu przeprowadzenia bardziej szczeg\u00f3\u0142owej analizy narz\u0119dzia tcpdump i zdarzenia Perf zapewniaj\u0105 wgl\u0105d w \u015bcie\u017cki akceptacji, retransmisje i ponowne pr\u00f3by. Wa\u017cna pozostaje korelacja: wska\u017aniki nale\u017cy zawsze analizowa\u0107 w podziale na pracownika, procesor i kolejk\u0119.<\/p>\n\n<h2>Jak unikn\u0105\u0107 typowych b\u0142\u0119d\u00f3w w konfiguracji<\/h2>\n<ul>\n  <li>Proces bez opcji SO_REUSEPORT nawi\u0105zuje po\u0142\u0105czenie jako pierwszy i blokuje wszystkie pozosta\u0142e.<\/li>\n  <li>Wsp\u00f3\u0142u\u017cytkowanie adres\u00f3w 0.0.0.0 i konkretnych adres\u00f3w IP \u2013 odbiorcy trafiaj\u0105 do oddzielnych grup.<\/li>\n  <li>Funkcja `accept_mutex` w Nginx jest aktywna pomimo opcji `reuseport` \u2013 niepotrzebna serializacja.<\/li>\n  <li>Nieprawid\u0142owe warto\u015bci backlogu: warto\u015b\u0107 somaxconn jest mniejsza ni\u017c warto\u015b\u0107 backlogu ustawiona na serwerze.<\/li>\n  <li>Brak wsp\u00f3lnej konfiguracji bilet\u00f3w TLS \u2013 gwa\u0142towny spadek wska\u017anika wznowienia po\u0142\u0105cze\u0144.<\/li>\n  <li>Nieprawid\u0142owe wymiarowanie RSS \u2013 obci\u0105\u017cenie IRQ skupia si\u0119 na kilku rdzeniach.<\/li>\n<\/ul>\n\n<h2>Planowanie wydajno\u015bci: wielko\u015b\u0107 grupy roboczej i limity FD<\/h2>\n<p>R\u00f3wnowa\u017c\u0119 liczb\u0119 proces\u00f3w roboczych z ilo\u015bci\u0105 pami\u0119ci RAM na proces, liczb\u0105 otwartych plik\u00f3w i liczb\u0105 po\u0142\u0105cze\u0144. Zbyt wiele proces\u00f3w zwi\u0119ksza liczb\u0119 zmian kontekstu i obci\u0105\u017cenie pami\u0119ci podr\u0119cznej, a zbyt ma\u0142o \u2013 marnuje mo\u017cliwo\u015bci r\u00f3wnoleg\u0142o\u015bci. Limity deskryptor\u00f3w plik\u00f3w ustalam hojnie i sp\u00f3jnie (ulimit, limity systemd, limity twarde\/mi\u0119kkie), poniewa\u017c ka\u017cdy proces roboczy potrzebuje w\u0142asnych deskryptor\u00f3w plik\u00f3w dla gniazd, log\u00f3w i po\u0142\u0105cze\u0144 z serwerami nadrz\u0119dnymi. Planuj\u0119 r\u00f3wnie\u017c wystarczaj\u0105c\u0105 liczb\u0119 port\u00f3w efemerycznych i monitoruj\u0119 obj\u0119to\u015b\u0107 stan\u00f3w TIME_WAIT, aby kr\u00f3tkotrwa\u0142e skoki obci\u0105\u017cenia nie ko\u0144czy\u0142y si\u0119 bezowocnie.<\/p>\n\n<h2>Testy por\u00f3wnawcze: typowe pu\u0142apki<\/h2>\n<p>Rozgrzewam serwery i pami\u0119ci podr\u0119czne, kalibruj\u0119 generator obci\u0105\u017cenia (\u017cadnych ukrytych w\u0105skich garde\u0142) oraz oddzielam sie\u0107 steruj\u0105c\u0105 od sieci danych. Testy trwaj\u0105 wystarczaj\u0105co d\u0142ugo, aby stabilnie zmierzy\u0107 warto\u015bci p99\/p999, a tak\u017ce uwzgl\u0119dniaj\u0105 zr\u00f3\u017cnicowane czasy Think-Time, cz\u0119stotliwo\u015bci Keep-Alive i parametry TLS. Rejestruj\u0119 r\u00f3wnie\u017c ustawienia j\u0105dra i serwera, aby p\u00f3\u017aniejsze przebiegi test\u00f3w by\u0142y por\u00f3wnywalne. Tam, gdzie stosuj\u0119 zasady eBPF, oddzielnie dokumentuj\u0119 ich wersj\u0119 i wp\u0142yw, aby nie myli\u0107 przyczyny ze skutkiem.<\/p>\n\n<h2>Lista kontrolna na pocz\u0105tek<\/h2>\n\n<p>Najpierw sprawdzam wersj\u0119 j\u0105dra i upewniam si\u0119, \u017ce SO_REUSEPORT jest dost\u0119pne i dzia\u0142a poprawnie <strong>ustalono<\/strong> jest. Nast\u0119pnie w\u0142\u0105czam t\u0119 opcj\u0119 w konfiguracji serwera WWW i ustawiam \u017c\u0105dan\u0105 liczb\u0119 proces\u00f3w roboczych. Sprawdzam somaxconn, limity deskryptor\u00f3w plik\u00f3w oraz kolejki kart sieciowych. Potem przeprowadzam testy obci\u0105\u017ceniowe, por\u00f3wnuj\u0119 wska\u017aniki i powtarzam proces. Na koniec optymalizuj\u0119 rejestrowanie, strategi\u0119 restart\u00f3w oraz <strong>Affinit\u00e4t<\/strong> od.<\/p>\n\n<h2>Streszczenie<\/h2>\n\n<p>SO_REUSEPORT eliminuje w\u0105skie gard\u0142o zwi\u0105zane z g\u0142owic\u0105 Accept, rozdziela nowe po\u0142\u0105czenia za pomoc\u0105 funkcji skr\u00f3tu j\u0105dra i zapewnia wi\u0119ksz\u0105 wydajno\u015b\u0107 w systemach wielordzeniowych <strong>Przepustowo\u015b\u0107<\/strong> . Korzystam z kilku modu\u0142\u00f3w nas\u0142uchuj\u0105cych na jeden port, unikam problemu \u201eThundering Herd\u201c i oszcz\u0119dzam sobie konieczno\u015bci stosowania oddzielnego dyspozytora. W Nginxie mo\u017cna to osi\u0105gn\u0105\u0107 za pomoc\u0105 opcji \u201elisten \u2026 reuseport\u201d i odpowiedniej liczby proces\u00f3w roboczych. W po\u0142\u0105czeniu z przypisaniem procesora, prawid\u0142owym rozk\u0142adem IRQ i odpowiednimi buforami zapewniam sta\u0142\u0105 <strong>Op\u00f3\u017anienia<\/strong> pod obci\u0105\u017ceniem. Kto sprawdzi, przetestuje i dopracuje te kroki, zwi\u0119kszy wydajno\u015b\u0107 bez dodatkowych koszt\u00f3w sprz\u0119towych w euro.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dowiedz si\u0119, w jaki spos\u00f3b SO_REUSEPORT poprawia wydajno\u015b\u0107 serwera WWW w systemie Linux. Poznaj dzia\u0142anie tej opcji gniazda oraz dowiedz si\u0119, jak j\u0105 wykorzysta\u0107 w Nginx i innych us\u0142ugach.<\/p>","protected":false},"author":1,"featured_media":20883,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20890","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"111","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"SO_REUSEPORT Linux","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20883","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/20890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/comments?post=20890"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/20890\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media\/20883"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media?parent=20890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/categories?post=20890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/tags?post=20890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}