{"id":15863,"date":"2025-12-07T11:51:26","date_gmt":"2025-12-07T10:51:26","guid":{"rendered":"https:\/\/webhosting.de\/memory-fragmentation-webhosting-php-mysql-optimierung-bytefluss\/"},"modified":"2025-12-07T11:51:26","modified_gmt":"2025-12-07T10:51:26","slug":"fragmentacja-pamieci-hosting-php-mysql-optymalizacja-przeplyw-bajtow","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pl\/memory-fragmentation-webhosting-php-mysql-optimierung-bytefluss\/","title":{"rendered":"Fragmentacja pami\u0119ci w hostingu internetowym: pu\u0142apka wydajno\u015bciowa dla PHP i MySQL"},"content":{"rendered":"<p><strong>Fragmentacja pami\u0119ci<\/strong> W hostingu internetowym PHP-FPM i MySQL dzia\u0142aj\u0105 wolniej, mimo \u017ce wydaje si\u0119, \u017ce jest wystarczaj\u0105ca ilo\u015b\u0107 pami\u0119ci RAM, poniewa\u017c pami\u0119\u0107 jest podzielona na wiele ma\u0142ych blok\u00f3w, a wi\u0119ksze alokacje ko\u0144cz\u0105 si\u0119 niepowodzeniem. Poka\u017c\u0119 w praktyce, jak fragmentacja podnosi koszty zapyta\u0144, uruchamia swap i dlaczego celowe dostrojenie PHP i MySQL wyra\u017anie poprawia czasy \u0142adowania, niezawodno\u015b\u0107 i skalowalno\u015b\u0107.<\/p>\n\n<h2>Punkty centralne<\/h2>\n<ul>\n  <li><strong>PHP-FPM<\/strong> Recykling: regularne ponowne uruchamianie proces\u00f3w za pomoc\u0105 pm.max_requests<\/li>\n  <li><strong>Bufor<\/strong> Dozowanie: zachowaj konserwatywne ustawienia bufora MySQL na po\u0142\u0105czenie<\/li>\n  <li><strong>Zamiana<\/strong> Unikaj: zmniejsz swappiness, zwr\u00f3\u0107 uwag\u0119 na NUMA<\/li>\n  <li><strong>Tabele<\/strong> Konserwacja: sprawd\u017a Data_free, zoptymalizuj w spos\u00f3b ukierunkowany<\/li>\n  <li><strong>Monitoring<\/strong> Wykorzystaj: dostrzegaj trendy wcze\u015bnie i dzia\u0142aj<\/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\/2025\/12\/php-mysql-fragmentierung-7243.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Co oznacza fragmentacja pami\u0119ci w codziennej pracy hostingu?<\/h2>\n\n<p>W hostingu spotyka si\u0119 <strong>Fragmentacja<\/strong> na d\u0142ugotrwa\u0142e procesy, kt\u00f3re nieustannie \u017c\u0105daj\u0105 i zwalniaj\u0105 pami\u0119\u0107, powoduj\u0105c luki w przestrzeni adresowej. Chocia\u017c suma wolnej pami\u0119ci RAM wydaje si\u0119 du\u017ca, brakuje sp\u00f3jnych blok\u00f3w dla wi\u0119kszych alokacji, co spowalnia pr\u00f3by alokacji. Obserwuj\u0119 to w procesach PHP\u2011FPM i mysqld, kt\u00f3re po kilku godzinach wydaj\u0105 si\u0119 coraz bardziej \u201enad\u0119te\u201c. Efekt ten sprawia, \u017ce ka\u017cde \u017c\u0105danie jest minimalnie dro\u017csze, a czasy odpowiedzi pod obci\u0105\u017ceniem zauwa\u017calnie si\u0119 wyd\u0142u\u017caj\u0105. W rezultacie szczyty, takie jak akcje sprzeda\u017cowe lub tworzenie kopii zapasowych, staj\u0105 si\u0119 hamulcem, mimo \u017ce procesor i sie\u0107 pozostaj\u0105 niezmienione.<\/p>\n\n<h2>Dlaczego PHP-FPM powoduje fragmentacj\u0119<\/h2>\n\n<p>Ka\u017cdy modu\u0142 roboczy PHP\u2011FPM \u0142aduje kod, wtyczki i dane do w\u0142asnego <strong>Przestrze\u0144 adresowa<\/strong>, obs\u0142uguje najr\u00f3\u017cniejsze \u017c\u0105dania i pozostawia rozproszone luki podczas zwalniania. Z czasem procesy rosn\u0105 i zwalniaj\u0105 pami\u0119\u0107 wewn\u0119trzn\u0105, ale niekoniecznie do systemu operacyjnego, co powoduje wzrost fragmentacji. R\u00f3\u017cne skrypty, zadania importu i przetwarzanie obraz\u00f3w wzmacniaj\u0105 t\u0119 mieszank\u0119 i prowadz\u0105 do zmiennych wzorc\u00f3w alokacji. Obserwuj\u0119 to jako stopniowy wzrost pami\u0119ci RAM, mimo \u017ce obci\u0105\u017cenie i ruch wydaj\u0105 si\u0119 sta\u0142e. Bez recyklingu ta wewn\u0119trzna fragmentacja spowalnia alokacj\u0119 i utrudnia planowanie przy du\u017cej liczbie odwiedzaj\u0105cych.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/memoryfragmentierung_meeting_7421.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Wyra\u017any wp\u0142yw na czas \u0142adowania i niezawodno\u015b\u0107<\/h2>\n\n<p>Fragmentowane procesy generuj\u0105 wi\u0119cej <strong>Nad g\u0142ow\u0105<\/strong> w zarz\u0105dzaniu pami\u0119ci\u0105, co objawia si\u0119 spowolnieniem dzia\u0142ania zaplecza administracyjnego i op\u00f3\u017anieniami przy realizacji transakcji. Szczeg\u00f3lnie sklepy WordPress lub du\u017ce instancje CMS reaguj\u0105 opieszale, gdy wiele r\u00f3wnoczesnych \u017c\u0105da\u0144 trafia do fragmentarycznych proces\u00f3w roboczych. Skutkuje to przekroczeniem limit\u00f3w czasu, b\u0142\u0119dami 502\/504 i zwi\u0119kszon\u0105 liczb\u0105 ponownych pr\u00f3b po stronie NGINX lub Apache. Takie sytuacje odczytuj\u0119 w metrykach, takich jak szczyty czasu odpowiedzi, rosn\u0105ca linia bazowa pami\u0119ci RAM i nag\u0142y wzrost wykorzystania pami\u0119ci wymiany. Ignorowanie tego powoduje utrat\u0119 wydajno\u015bci, pogorszenie komfortu u\u017cytkowania i wzrost wska\u017anika rezygnacji w krytycznych lejkach.<\/p>\n\n<h2>Prawid\u0142owe ustawienie PHP-FPM: limity, pule, recykling<\/h2>\n\n<p>Stawiam na realistyczne <strong>Ograniczenia<\/strong>, oddzielne pule i konsekwentny recykling w celu ograniczenia fragmentacji. pm.max_requests ko\u0144cz\u0119 w taki spos\u00f3b, aby pracownicy regularnie rozpoczynali prac\u0119 od nowa, nie przeszkadzaj\u0105c obecnym u\u017cytkownikom. W przypadku profili ruchu z szczytami obci\u0105\u017cenia cz\u0119sto lepiej sprawdza si\u0119 pm = dynamic, natomiast pm = ondemand pozwala zaoszcz\u0119dzi\u0107 pami\u0119\u0107 RAM w przypadku spokojnych witryn. Celowo utrzymuj\u0119 memory_limit na umiarkowanym poziomie dla ka\u017cdej witryny i dostosowuj\u0119 go do rzeczywistych skrypt\u00f3w; wprowadzenie do tego tematu znajduje si\u0119 w sekcji <a href=\"https:\/\/webhosting.de\/pl\/php-zwiekszenie-limitu-pamieci-unikaj-bledow-wydajny\/\">Limit pami\u0119ci PHP<\/a>. Dodatkowo dziel\u0119 projekty o du\u017cym obci\u0105\u017ceniu na osobne pule, aby jeden projekt zajmuj\u0105cy du\u017co pami\u0119ci nie wp\u0142ywa\u0142 negatywnie na wszystkie strony.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/memory-fragmentierung-php-mysql-7348.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>OPcache, preloading i PHP-Allocator w skr\u00f3cie<\/h2>\n\n<p>Aby ograniczy\u0107 fragmentacj\u0119 w procesie PHP, stawiam na odpowiednio dobrany <strong>OPcache<\/strong>. Du\u017ca, ale nie przesadzona warto\u015b\u0107 opcache.memory_consumption i wystarczaj\u0105ca liczba internowanych ci\u0105g\u00f3w znak\u00f3w zmniejszaj\u0105 liczb\u0119 powtarzaj\u0105cych si\u0119 alokacji na \u017c\u0105danie. Obserwuj\u0119 wsp\u00f3\u0142czynnik trafie\u0144, marnotrawstwo i pozosta\u0142\u0105 pojemno\u015b\u0107; je\u015bli marnotrawstwo ro\u015bnie w czasie, lepiej jest zaplanowa\u0107 ponowne za\u0142adowanie ni\u017c pozwoli\u0107 na niekontrolowany wzrost liczby pracownik\u00f3w. Wst\u0119pne \u0142adowanie mo\u017ce utrzyma\u0107 gor\u0105cy kod stabilnie w pami\u0119ci, wyr\u00f3wnuj\u0105c w ten spos\u00f3b wzorce alokacji, pod warunkiem, \u017ce baza kodu jest odpowiednio przygotowana. Dodatkowo zwracam uwag\u0119 na <strong>Wyb\u00f3r alokatora<\/strong>: W zale\u017cno\u015bci od dystrybucji PHP\u2011FPM i rozszerzenia dzia\u0142aj\u0105 z r\u00f3\u017cnymi implementacjami malloc. Alternatywne alokatory, takie jak jemalloc, w niekt\u00f3rych konfiguracjach znacznie zmniejszaj\u0105 fragmentacj\u0119. Jednak wprowadzam takie zmiany tylko po przetestowaniu, poniewa\u017c debugowanie, profilowanie DTrace\/eBPF i zrzuty pami\u0119ci reaguj\u0105 r\u00f3\u017cnie w zale\u017cno\u015bci od alokatora.<\/p>\n\n<p>W przypadku zada\u0144 wymagaj\u0105cych du\u017cej ilo\u015bci pami\u0119ci, takich jak przetwarzanie obraz\u00f3w lub eksportowanie, preferuj\u0119 oddzielne pule z bardziej restrykcyjnymi limitami. Dzi\u0119ki temu g\u0142\u00f3wna pula nie ro\u015bnie w spos\u00f3b niekontrolowany, a fragmentacja pozostaje izolowana. Ponadto ograniczam rozszerzenia wymagaj\u0105ce du\u017cej ilo\u015bci pami\u0119ci (np. poprzez zmienne \u015brodowiskowe) i stosuj\u0119 backpressure: \u017c\u0105dania wymagaj\u0105ce du\u017cych bufor\u00f3w s\u0105 ograniczane lub przenoszone do asynchronicznych kolejek, zamiast obci\u0105\u017ca\u0107 jednocze\u015bnie wszystkich pracownik\u00f3w.<\/p>\n\n<h2>Zrozumienie pami\u0119ci MySQL: bufory, po\u0142\u0105czenia, tabele<\/h2>\n\n<p>W MySQL rozr\u00f3\u017cniam globalne <strong>Bufor<\/strong> takie jak bufor InnoDB, bufor na po\u0142\u0105czenie i struktury tymczasowe, kt\u00f3re mog\u0105 rosn\u0105\u0107 wraz z ka\u017cd\u0105 operacj\u0105. Zbyt du\u017ce warto\u015bci powoduj\u0105 przy du\u017cym obci\u0105\u017ceniu po\u0142\u0105cze\u0144 gwa\u0142towny wzrost zapotrzebowania na pami\u0119\u0107 RAM i wi\u0119ksz\u0105 fragmentacj\u0119 na poziomie systemu operacyjnego. Ponadto tabele ulegaj\u0105 fragmentacji w wyniku aktualizacji\/usuwania i pozostawiaj\u0105 cz\u0119\u015bci Data_free, kt\u00f3re pogarszaj\u0105 wykorzystanie puli bufor\u00f3w. Dlatego regularnie sprawdzam rozmiar, wsp\u00f3\u0142czynniki trafie\u0144 i liczb\u0119 tymczasowych tabel dyskowych. Poni\u017cszy przegl\u0105d pomaga mi trafnie przyporz\u0105dkowa\u0107 typowe objawy i rozwa\u017cy\u0107 odpowiednie dzia\u0142ania.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Objaw<\/th>\n      <th>Prawdopodobna przyczyna<\/th>\n      <th>Pomiar<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>RAM stale ro\u015bnie, swap zaczyna dzia\u0142a\u0107<\/td>\n      <td>Zbyt du\u017ca pula bufor\u00f3w lub zbyt wiele bufor\u00f3w na po\u0142\u0105czenie<\/td>\n      <td>Ogranicz rozmiar puli do odpowiedniej wielko\u015bci, zmniejsz bufor po\u0142\u0105cze\u0144<\/td>\n    <\/tr>\n    <tr>\n      <td>Wiele powolnych sortowa\u0144\/\u0142\u0105cze\u0144<\/td>\n      <td>Brakuj\u0105ce indeksy, nadmierne bufory sortowania\/\u0142\u0105czenia<\/td>\n      <td>Sprawd\u017a indeksy, zachowaj konserwatywne sortowanie\/\u0142\u0105czenie<\/td>\n    <\/tr>\n    <tr>\n      <td>Du\u017ca ilo\u015b\u0107 danych wolnych w tabelach<\/td>\n      <td>Silne aktualizacje\/usuni\u0119cia, rozdrobnione strony<\/td>\n      <td>Ukierunkowana OPTYMALIZACJA, archiwizacja, usprawnienie schematu<\/td>\n    <\/tr>\n    <tr>\n      <td>Szczyty w tymczasowych tabelach dyskowych<\/td>\n      <td>Zbyt ma\u0142a warto\u015b\u0107 tmp_table_size lub nieodpowiednie zapytania<\/td>\n      <td>Umiarkowane podwy\u017cszanie warto\u015bci, przebudowa zapyta\u0144<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>Optymalizacja pami\u0119ci MySQL: wybieraj rozmiary zamiast przesadza\u0107<\/h2>\n\n<p>Wybieram pul\u0119 bufor\u00f3w InnoDB tak, aby <strong>System operacyjny<\/strong> wystarczaj\u0105c\u0105 ilo\u015b\u0107 pami\u0119ci dla pami\u0119ci podr\u0119cznej systemu plik\u00f3w i us\u0142ug, zw\u0142aszcza w przypadku serwer\u00f3w kombinowanych z internetem i baz\u0105 danych. Bufory po\u0142\u0105cze\u0144, takie jak sort_buffer_size, join_buffer_size i read-Buffer, skaluj\u0119 konserwatywnie, aby wiele jednoczesnych po\u0142\u0105cze\u0144 nie prowadzi\u0142o do przeci\u0105\u017cenia pami\u0119ci RAM. tmp_table_size i max_heap_table_size ustawiam tak, aby nieistotne operacje nie wymaga\u0142y ogromnych tabel w pami\u0119ci. Wi\u0119cej opcji regulacyjnych mo\u017cna znale\u017a\u0107 pod adresem <a href=\"https:\/\/webhosting.de\/pl\/optymalizacja-wydajnosci-mysql-porady-dotyczace-skalowania-sprzetowego-szybkosc-pamieci-podrecznej\/\">Wydajno\u015b\u0107 MySQL<\/a> Pomocne wskaz\u00f3wki do przemy\u015ble\u0144. Najwa\u017cniejsze pozostaje to, \u017ce wol\u0119 ustawi\u0107 nieco mniejsz\u0105 warto\u015b\u0107 i dokona\u0107 pomiaru, ni\u017c \u015blepo zwi\u0119ksza\u0107 moc i ryzykowa\u0107 fragmentacj\u0119 oraz swap.<\/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\/2025\/12\/memoryfragmentation_office_4217.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>InnoDB w szczeg\u00f3\u0142ach: strategie przebudowy i instancje puli<\/h2>\n\n<p>Aby MySQL by\u0142 bardziej \u201ekompaktowy\u201c wewn\u0119trznie, planuj\u0119 regularne <strong>Przebudowy<\/strong> dla tabel z du\u017c\u0105 ilo\u015bci\u0105 operacji zapisu. Celowe OPTIMIZE TABLE (lub przebudowa online za pomoc\u0105 ALTER) \u0142\u0105czy dane i indeksy oraz zmniejsza <em>Data_free<\/em>. Wybieram przedzia\u0142y czasowe o niskim obci\u0105\u017ceniu, poniewa\u017c operacje przebudowy s\u0105 intensywne pod wzgl\u0119dem operacji wej\u015bcia\/wyj\u015bcia. Opcja <em>innodb_file_per_table<\/em> Uwa\u017cam to za aktywne, poniewa\u017c umo\u017cliwia kontrolowane przebudowy za pomoc\u0105 tabeli i zmniejsza ryzyko, \u017ce pojedyncze \u201eproblematyczne elementy\u201c spowoduj\u0105 fragmentacj\u0119 ca\u0142ego pliku przestrzeni tabel.<\/p>\n\n<p>Korzystam z kilku <strong>Instancje puli bufor\u00f3w<\/strong> (innodb_buffer_pool_instances) w stosunku do wielko\u015bci puli i rdzeni procesora, aby odci\u0105\u017cy\u0107 wewn\u0119trzne zatrzaski i roz\u0142o\u017cy\u0107 dost\u0119p. Poprawia to nie tylko r\u00f3wnoleg\u0142o\u015b\u0107, ale tak\u017ce wyr\u00f3wnuje wzorce alokacji w puli. Dodatkowo sprawdzam rozmiar dziennik\u00f3w redo i aktywno\u015b\u0107 w\u0105tk\u00f3w czyszcz\u0105cych, poniewa\u017c zgromadzona historia mo\u017ce zajmowa\u0107 pami\u0119\u0107 i operacje wej\u015bcia\/wyj\u015bcia, co zwi\u0119ksza fragmentacj\u0119 na poziomie systemu operacyjnego. Wa\u017cne jest, aby zmienia\u0107 ustawienia stopniowo, mierzy\u0107 i zachowywa\u0107 je tylko wtedy, gdy op\u00f3\u017anienia i wska\u017aniki b\u0142\u0119d\u00f3w faktycznie spadaj\u0105.<\/p>\n\n<h2>Unikanie swapowania: ustawienia j\u0105dra i NUMA<\/h2>\n\n<p>Gdy tylko Linux aktywuje swapowanie, czasy odpowiedzi wzrastaj\u0105 o <strong>rz\u0119dy wielko\u015bci<\/strong>, poniewa\u017c dost\u0119p do pami\u0119ci RAM staje si\u0119 zbyt wolny. Znacznie obni\u017cam vm.swappiness, aby j\u0105dro d\u0142u\u017cej korzysta\u0142o z fizycznej pami\u0119ci RAM. Na hostach z wieloma procesorami sprawdzam topologi\u0119 NUMA i w razie potrzeby aktywuj\u0119 interleaving, aby zmniejszy\u0107 nier\u00f3wnomierne wykorzystanie pami\u0119ci. Je\u015bli chodzi o t\u0142o i wp\u0142yw sprz\u0119tu, pomaga mi perspektywa <a href=\"https:\/\/webhosting.de\/pl\/blog-numa-architektura-serwer-wydajnosc-hosting-sprzet-optymalizacja-infrastruktura\/\">Architektura NUMA<\/a>. Dodatkowo planuj\u0119 rezerwy bezpiecze\u0144stwa dla pami\u0119ci podr\u0119cznej stron, poniewa\u017c wyczerpana pami\u0119\u0107 podr\u0119czna przyspiesza fragmentacj\u0119 ca\u0142ego komputera.<\/p>\n\n<h2>Przejrzyste ogromne strony, nadmierne przydzielanie i wyb\u00f3r alokatora<\/h2>\n\n<p><strong>Przejrzyste ogromne strony<\/strong> (THP) mog\u0105 powodowa\u0107 szczyty op\u00f3\u017anie\u0144 w bazach danych, poniewa\u017c scalanie\/dzielenie du\u017cych stron odbywa si\u0119 w nieodpowiednim momencie. Ustawiam THP na \u201emadvise\u201c lub wy\u0142\u0105czam t\u0119 funkcj\u0119, je\u015bli MySQL reaguje zbyt wolno pod obci\u0105\u017ceniem. Jednocze\u015bnie zwracam uwag\u0119 na <strong>Nadmierne zaanga\u017cowanie<\/strong>: Zbyt hojna konfiguracja vm.overcommit_memory grozi wyst\u0105pieniem b\u0142\u0119d\u00f3w OOM w\u0142a\u015bnie wtedy, gdy fragmentacja sprawia, \u017ce du\u017ce, sp\u00f3jne bloki staj\u0105 si\u0119 rzadko\u015bci\u0105. Preferuj\u0119 konserwatywne ustawienia overcommit i regularnie sprawdzam logi j\u0105dra pod k\u0105tem oznak obci\u0105\u017cenia pami\u0119ci.<\/p>\n\n<p>The <strong>Wyb\u00f3r alokatora<\/strong> Warto przyjrze\u0107 si\u0119 temu na poziomie systemu. glibc\u2011malloc, jemalloc lub tcmalloc zachowuj\u0105 si\u0119 r\u00f3\u017cnie pod wzgl\u0119dem fragmentacji. Zawsze testuj\u0119 alternatywy w izolacji, mierz\u0119 przebieg RSS i op\u00f3\u017anienia i wdra\u017cam zmiany tylko wtedy, gdy wska\u017aniki pozostaj\u0105 stabilne w rzeczywistym ruchu. Korzy\u015bci r\u00f3\u017cni\u0105 si\u0119 znacznie w zale\u017cno\u015bci od obci\u0105\u017cenia, kombinacji rozszerze\u0144 i wersji systemu operacyjnego.<\/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\/2025\/12\/memoryfragmentationdev3452.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Rozpoznawanie fragmentacji: wska\u017aniki i wskaz\u00f3wki<\/h2>\n\n<p>Zwracam uwag\u0119 na powolny wzrost <strong>linie bazowe<\/strong> w przypadku pami\u0119ci RAM, wi\u0119cej odpowiedzi 5xx pod obci\u0105\u017ceniem i op\u00f3\u017anienia w dzia\u0142aniach administratora. Spojrzenie na statystyki PM PHP-FPM pokazuje, czy procesy potomne osi\u0105gaj\u0105 limity lub dzia\u0142aj\u0105 zbyt d\u0142ugo. W MySQL sprawdzam wsp\u00f3\u0142czynniki trafie\u0144, tymczasowe tabele na dysku i Data_free dla ka\u017cdej tabeli. R\u00f3wnolegle pomocne s\u0105 wska\u017aniki systemu operacyjnego, takie jak b\u0142\u0119dy stron, swap-in\/out i wska\u017aniki fragmentacji pami\u0119ci, w zale\u017cno\u015bci od wersji j\u0105dra. \u0141\u0105cz\u0105c te sygna\u0142y, mo\u017cna wcze\u015bnie rozpozna\u0107 wzorce i zaplanowa\u0107 odpowiednie dzia\u0142ania.<\/p>\n\n<h2>Wzmocnienie monitorowania: jak \u0142\u0105cz\u0119 sygna\u0142y<\/h2>\n\n<p>Koreluj\u0119 <strong>Metryki aplikacji<\/strong> (op\u00f3\u017anienia p95\/p99, wska\u017aniki b\u0142\u0119d\u00f3w) z <strong>wska\u017aniki procesowe<\/strong> (RSS na FPM\u2011Worker, pami\u0119\u0107 mysqld) oraz <strong>Warto\u015bci OS<\/strong> (Pagecache, Slab, Major Faults). W PHP\u2011FPM u\u017cywam interfejsu statusowego do sprawdzania d\u0142ugo\u015bci kolejek, aktywnych\/spawned Children oraz czasu \u017cycia worker\u00f3w. W MySQL obserwuj\u0119 Created_tmp_disk_tables, Handler_write\/Handler_tmp_write oraz Buffer\u2011Pool\u2011Misses. Dodatkowo sprawdzam mapy proces\u00f3w (pmap\/smaps), aby dowiedzie\u0107 si\u0119, czy powsta\u0142o wiele ma\u0142ych aren. Wa\u017cne jest dla mnie <strong>orientacja na trendy<\/strong>: to nie pojedynczy szczyt, ale stopniowe przesuni\u0119cie w ci\u0105gu godzin\/dni decyduje o tym, czy fragmentacja stanie si\u0119 prawdziwym zagro\u017ceniem.<\/p>\n\n<h2>Praktyczna rutyna: konserwacja i piel\u0119gnacja danych<\/h2>\n\n<p>Regularnie sprz\u0105tam <strong>Dane<\/strong> na: wygas\u0142e sesje, stare logi, niepotrzebne rewizje i porzucone pami\u0119ci podr\u0119czne. W przypadku tabel podlegaj\u0105cych znacznym zmianom planuj\u0119 ukierunkowane okna OPTIMIZE, aby po\u0142\u0105czy\u0107 fragmentaryczne strony. Du\u017ce zadania importowe lub fale cron rozk\u0142adam w czasie, aby wszystkie procesy nie wymaga\u0142y jednocze\u015bnie maksymalnych bufor\u00f3w. W przypadku rosn\u0105cych projekt\u00f3w wcze\u015bnie oddzielam sie\u0107 i baz\u0119 danych, aby wyizolowa\u0107 wzorce wymagaj\u0105ce du\u017cej ilo\u015bci pami\u0119ci. Ta dyscyplina pozwala zachowa\u0107 sp\u00f3jno\u015b\u0107 pami\u0119ci roboczej i zmniejsza ryzyko wyst\u0105pienia op\u00f3\u017anie\u0144 typu burst.<\/p>\n\n<h2>Dok\u0142adne obliczanie rozmiar\u00f3w: wymiarowanie limit\u00f3w i pul<\/h2>\n\n<p>Okre\u015blam pm.max_children na podstawie faktycznie dost\u0119pnej pami\u0119ci RAM dla PHP. W tym celu mierz\u0119 <strong>\u015bredni RSS<\/strong> pracownika pod rzeczywistym obci\u0105\u017ceniem (w tym rozszerzenia i OPcache) i dodaj\u0119 margines bezpiecze\u0144stwa na szczyty. Przyk\u0142ad: na ho\u015bcie 16 GB rezerwuj\u0119 4\u20136 GB dla systemu operacyjnego, pami\u0119ci podr\u0119cznej stron i MySQL. Pozostaje 10 GB dla PHP; przy 150 MB na pracownika daje to teoretycznie 66 potomk\u00f3w. W praktyce ustawiam pm.max_children na ~80\u201390% tej warto\u015bci, aby pozostawi\u0107 margines na szczyty, czyli oko\u0142o 52\u201358. <strong>pm.max_requests<\/strong> Wybieram tak, aby pracownicy byli ponownie zatrudniani przed zauwa\u017caln\u0105 fragmentacj\u0105 (cz\u0119sto w zakresie 500\u20132000, w zale\u017cno\u015bci od kombinacji kodu). <\/p>\n\n<p>W przypadku MySQL obliczam <strong>Pula buforowa<\/strong> z aktywnej wielko\u015bci danych, a nie z ca\u0142kowitej wielko\u015bci bazy danych. Wa\u017cne tabele i indeksy powinny si\u0119 zmie\u015bci\u0107, ale pami\u0119\u0107 podr\u0119czna systemu operacyjnego potrzebuje miejsca na binlogi, gniazda i zasoby statyczne. W przypadku bufora po\u0142\u0105cze\u0144 obliczam maksymaln\u0105 realistyczn\u0105 r\u00f3wnoleg\u0142o\u015b\u0107. Je\u015bli mo\u017cliwe jest 200 po\u0142\u0105cze\u0144, nie wymiaruj\u0119 tak, aby w sumie eksplodowa\u0142o kilka gigabajt\u00f3w na po\u0142\u0105czenie, ale ustalam twarde granice, kt\u00f3re nawet w szczytowym momencie nie stanowi\u0105 zagro\u017cenia dla swapowania.<\/p>\n\n<h2>Oddzielenie kolejek, przetwarzania obraz\u00f3w i zada\u0144 dodatkowych<\/h2>\n\n<p>Wiele problem\u00f3w zwi\u0105zanych z fragmentacj\u0105 powstaje, gdy <strong>praca dorywcza<\/strong> te same pule, co \u017c\u0105dania frontendowe. Do eksport\u00f3w, indeksowania, konwersji obraz\u00f3w lub aktualizacji indeks\u00f3w wyszukiwania u\u017cywam oddzielnych pul FPM lub zada\u0144 CLI z jasnymi <em>ulimit<\/em>Ograniczam operacje na obrazach za pomoc\u0105 GD\/Imagick dodatkowymi limitami zasob\u00f3w, aby pojedyncze ogromne konwersje nie \u201erozbija\u0142y\u201c ca\u0142ej przestrzeni adresowej. Planuj\u0119 zadania w czasie i nadaj\u0119 im w\u0142asne limity wsp\u00f3\u0142bie\u017cno\u015bci, aby nie obci\u0105\u017ca\u0142y \u015bcie\u017cki frontendu.<\/p>\n\n<h2>Kontenery i wirtualizacja: Cgroups, OOM i efekty balonu<\/h2>\n\n<p>W kontenerach obserwuj\u0119 <strong>Limity pami\u0119ci<\/strong> i OOM\u2011Killer szczeg\u00f3lnie dok\u0142adnie. Fragmentacja powoduje, \u017ce procesy uruchamiaj\u0105 si\u0119 wcze\u015bniej na granicach Cgroup, mimo \u017ce w ho\u015bcie jest jeszcze wolna pami\u0119\u0107 RAM. Ustawiam pm.max_children \u015bci\u015ble zgodnie z limitem kontenera i zachowuj\u0119 wystarczaj\u0105c\u0105 rezerw\u0119, aby z\u0142agodzi\u0107 szczyty. Unikam swappingu w kontenerach (lub na ho\u015bcie), poniewa\u017c dodatkowa po\u015brednia operacja zwi\u0119ksza szczyty op\u00f3\u017anie\u0144. W maszynach wirtualnych sprawdzam balonowanie i KSM\/UKSM; agresywna deduplikacja oszcz\u0119dza pami\u0119\u0107 RAM, ale mo\u017ce powodowa\u0107 dodatkowe op\u00f3\u017anienia i zafa\u0142szowa\u0107 obraz fragmentacji. <\/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\/2025\/12\/hosting-speicherproblem-7392.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Kr\u00f3tka lista kontrolna bez punktor\u00f3w<\/h2>\n\n<p>Najpierw ustalam realistyczny <strong>pami\u0119\u0107_limit<\/strong> na stron\u0119 i obserwuj\u0119, jak zmienia si\u0119 szczytowe wykorzystanie w ci\u0105gu dni. Nast\u0119pnie dostosowuj\u0119 PHP-FPM za pomoc\u0105 odpowiednich warto\u015bci pm i sensownego pm.max_requests, aby fragmentowane procesy dzia\u0142a\u0142y zgodnie z planem. W przypadku MySQL skupiam si\u0119 na odpowiedniej wielko\u015bci puli bufor\u00f3w i konserwatywnych buforach na po\u0142\u0105czenie zamiast na og\u00f3lnym zwi\u0119kszaniu rozmiaru. Po stronie j\u0105dra zmniejszam swappiness, sprawdzam ustawienia NUMA i utrzymuj\u0119 rezerwy dla pami\u0119ci podr\u0119cznej stron. Na koniec oceniam tabele z nietypowymi warto\u015bciami Data_free i planuj\u0119 optymalizacje poza codzienn\u0105 dzia\u0142alno\u015bci\u0105.<\/p>\n\n<h2>W skr\u00f3cie: co liczy si\u0119 w przedsi\u0119biorstwie<\/h2>\n\n<p>Najwi\u0119kszy efekt w walce z fragmentacj\u0105 pami\u0119ci osi\u0105gam dzi\u0119ki konsekwentnemu <strong>Recykling<\/strong> pracownika PHP\u2011FPM, umiarkowanych limit\u00f3w i czystych pul. MySQL korzysta z rozs\u0105dnych rozmiar\u00f3w puli bufor\u00f3w i bufor\u00f3w na po\u0142\u0105czenie, a tak\u017ce z uporz\u0105dkowanych tabel. Proaktywnie unikam swapowania, zwracaj\u0105c uwag\u0119 na swappiness i NUMA oraz rezerwuj\u0105c woln\u0105 pami\u0119\u0107 RAM dla pami\u0119ci podr\u0119cznej plik\u00f3w. Monitorowanie pozwala wykry\u0107 niepo\u017c\u0105dane wzorce, zanim u\u017cytkownicy je zauwa\u017c\u0105, i umo\u017cliwia spokojne, zaplanowane interwencje. Kto dyscyplinarnie korzysta z tych narz\u0119dzi, utrzymuje PHP i MySQL szybsze, bardziej niezawodne i ekonomiczne bez konieczno\u015bci natychmiastowej modernizacji sprz\u0119tu.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dowiedz si\u0119, jak fragmentacja pami\u0119ci spowalnia dzia\u0142anie PHP i MySQL w hostingu internetowym oraz jak ukierunkowane dostrajanie pami\u0119ci mysql trwale poprawia wydajno\u015b\u0107. W centrum uwagi: fragmentacja pami\u0119ci.<\/p>","protected":false},"author":1,"featured_media":15856,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[781],"tags":[],"class_list":["post-15863","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-datenbanken-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":"1745","_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":null,"_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":"Memory Fragmentation","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":"15856","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/15863","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=15863"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/15863\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media\/15856"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media?parent=15863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/categories?post=15863"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/tags?post=15863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}