{"id":1964,"date":"2026-06-03T02:00:49","date_gmt":"2026-06-03T02:00:49","guid":{"rendered":"https:\/\/news.jurskitech.pl\/blog\/uncategorized\/wydajnosc-aplikacji-webowych-3-martwe-procesy-ktore-rujnuja-ux\/"},"modified":"2026-06-03T02:00:49","modified_gmt":"2026-06-03T02:00:49","slug":"wydajnosc-aplikacji-webowych-3-martwe-procesy-ktore-rujnuja-ux","status":"publish","type":"post","link":"https:\/\/news.jurskitech.pl\/blog\/warto-wiedziec\/wydajnosc-aplikacji-webowych-3-martwe-procesy-ktore-rujnuja-ux\/","title":{"rendered":"Wydajno\u015b\u0107 aplikacji webowych: 3 martwe procesy, kt\u00f3re rujnuj\u0105 UX"},"content":{"rendered":"<h2 id=\"wydajnoaplikacjiwebowych3martweprocesyktrerujnujux\">Wydajno\u015b\u0107 aplikacji webowych: 3 martwe procesy, kt\u00f3re rujnuj\u0105 UX<\/h2>\n<p>Pracuj\u0105c z wieloma firmami e-commerce i SaaS, regularnie widz\u0119 ten sam scenariusz: zesp\u00f3\u0142 narzeka na wolno dzia\u0142aj\u0105c\u0105 aplikacj\u0119, ale po szybkim audycie okazuje si\u0119, \u017ce g\u0142\u00f3wnym winowajc\u0105 nie jest zbyt du\u017cy ruch czy s\u0142aby hosting, tylko procesy, kt\u00f3re dawno powinny umrze\u0107. Martwe procesy \u2013 czyli zadania, kt\u00f3re rozpocz\u0119\u0142y si\u0119, ale nigdy nie zako\u0144czy\u0142y lub dzia\u0142aj\u0105 bez celu \u2013 to cichy zab\u00f3jca wydajno\u015bci i UX. W tym artykule poka\u017c\u0119, jak je rozpozna\u0107, jakie generuj\u0105 koszty i co z nimi zrobi\u0107.<\/p>\n<h3 id=\"1niezakoczonesesjeuytkownikw\">1. Niezako\u0144czone sesje u\u017cytkownik\u00f3w<\/h3>\n<p>Wyobra\u017a sobie sytuacj\u0119: klient wchodzi do sklepu, dodaje produkt do koszyka, ale zanim finalizuje zakup, rozprasza go telefon. Zostawia otwart\u0105 kart\u0119 przegl\u0105darki i wraca po godzinie. W mi\u0119dzyczasie serwer trzyma otwart\u0105 sesj\u0119, alokuje pami\u0119\u0107 RAM, utrzymuje stan koszyka. Je\u015bli Tw\u00f3j system nie ma mechanizmu wygaszania nieaktywnych sesji, z czasem te wisz\u0105ce procesy zaczynaj\u0105 si\u0119 kumulowa\u0107.<\/p>\n<p><strong>Realny przyk\u0142ad z \u017cycia:<\/strong><br \/>\nKlient z bran\u017cy e-commerce odzie\u017cowego narzeka\u0142, \u017ce jego aplikacja po 3 godzinach od uruchomienia dzia\u0142a\u0142a jak w smole. Okaza\u0142o si\u0119, \u017ce sesje u\u017cytkownik\u00f3w by\u0142y utrzymywane przez 24 godziny bez limitu nieaktywno\u015bci. Wystarczy\u0142o wdro\u017cy\u0107 limity czasowe (np. 30 minut) oraz zautomatyzowane czyszczenie sesji, aby obci\u0105\u017cenie serwera spad\u0142o o 40%, a czas \u0142adowania strony skr\u00f3ci\u0142 si\u0119 o po\u0142ow\u0119.<\/p>\n<p><strong>Biznesowy koszt:<\/strong><\/p>\n<ul>\n<li>Zmarnowane zasoby serwera \u2013 p\u0142acisz za moc, kt\u00f3ra nie przynosi warto\u015bci.<\/li>\n<li>Gorsze do\u015bwiadczenie dla aktywnych u\u017cytkownik\u00f3w \u2013 przy du\u017cej liczbie wisz\u0105cych sesji strona dzia\u0142a wolno dla wszystkich.<\/li>\n<li>Ryzyko b\u0142\u0119d\u00f3w \u2013 przepe\u0142nienie pami\u0119ci mo\u017ce powodowa\u0107 losowe awarie.<\/li>\n<\/ul>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Wprowad\u017a limit czasu trwania sesji (np. 30 minut od ostatniej aktywno\u015bci).<\/li>\n<li>Regularnie czy\u015b\u0107 sesje za pomoc\u0105 cron job lub dedykowanego skryptu.<\/li>\n<li>Rozwa\u017c u\u017cycie zewn\u0119trznego magazynu sesji (np. Redis z TTL), kt\u00f3ry automatycznie usuwa przeterminowane dane.<\/li>\n<\/ul>\n<h3 id=\"2zombieprocessywkolejcezada\">2. Zombie processy w kolejce zada\u0144<\/h3>\n<p>W nowoczesnych aplikacjach cz\u0119sto korzystamy z kolejek zada\u0144 (RabbitMQ, AWS SQS, Redis Queue) do obs\u0142ugi zada\u0144 asynchronicznych: wysy\u0142ka maili, generowanie raport\u00f3w, przetwarzanie obraz\u00f3w. Problem pojawia si\u0119, gdy zadanie trafia do kolejki, ale proces wykonawczy (worker) pada z powodu b\u0142\u0119du lub restartu. Zadanie zostaje w kolejce, ale nikt go nie odbiera \u2013 to w\u0142a\u015bnie zombie process.<\/p>\n<p><strong>Realny przyk\u0142ad:<\/strong><br \/>\nFirma SaaS oferuj\u0105ca narz\u0119dzie do fakturowania mia\u0142a skarg\u0119 od klienta: faktura nie zosta\u0142a wys\u0142ana od 3 dni. Po debugowaniu okaza\u0142o si\u0119, \u017ce worker odpowiedzialny za wysy\u0142k\u0119 maili ulega\u0142 awarii co 50. zadaniu z powodu b\u0142\u0119du w szablonie HTML. Ka\u017cde kolejne zadanie trafia\u0142o na nowego workera, ale ten crashowa\u0142 si\u0119 przy pr\u00f3bie wysy\u0142ki. W kolejce utkn\u0119\u0142o 10 000 zada\u0144, a serwer bezskutecznie pr\u00f3bowa\u0142 je przetworzy\u0107, marnuj\u0105c CPU i I\/O.<\/p>\n<p><strong>Biznesowy koszt:<\/strong><\/p>\n<ul>\n<li>Op\u00f3\u017anienia w dostarczaniu us\u0142ug \u2013 klienci nie dostaj\u0105 maili, faktur, powiadomie\u0144.<\/li>\n<li>Zwi\u0119kszone zu\u017cycie zasob\u00f3w \u2013 ci\u0105g\u0142e pr\u00f3by przetworzenia tego samego zadania.<\/li>\n<li>Spadek zaufania \u2013 je\u015bli klient nie otrzyma zam\u00f3wienia na czas, p\u00f3jdzie do konkurencji.<\/li>\n<\/ul>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Wdr\u00f3\u017c mechanizm dead letter queue (DLQ) \u2013 zadania, kt\u00f3re nie mog\u0105 zosta\u0107 przetworzone po X pr\u00f3bach, trafiaj\u0105 do osobnej kolejki do r\u0119cznej analizy.<\/li>\n<li>Ustaw limit ponownych pr\u00f3b (retry policy) i timeout dla ka\u017cdego zadania.<\/li>\n<li>Monitoruj liczby zada\u0144 w DLQ i konfiguruj alarmy.<\/li>\n<\/ul>\n<h3 id=\"3zablokowanezapytaniadobazydanych\">3. Zablokowane zapytania do bazy danych<\/h3>\n<p>To najcz\u0119stszy i najbardziej zgubny typ martwego procesu. Zapytanie SQL, kt\u00f3re d\u0142ugo si\u0119 wykonuje, blokuje inne zapytania, powoduj\u0105c efekt kaskady. W \u015brodowisku produkcyjnym mo\u017ce to oznacza\u0107, \u017ce kilka wolnych zapyta\u0144 unieruchamia ca\u0142\u0105 baz\u0119, a z ni\u0105 ca\u0142\u0105 aplikacj\u0119.<\/p>\n<p><strong>Realny przyk\u0142ad:<\/strong><br \/>\nW sklepie internetowym z du\u017c\u0105 baz\u0105 produkt\u00f3w, podczas codziennej aktualizacji cen, uruchamiano zapytanie aktualizuj\u0105ce milion rekord\u00f3w. Zapytanie to blokowa\u0142o tabel\u0119 produkt\u00f3w na 5 minut, co powodowa\u0142o, \u017ce ka\u017cdy inny odczyt (np. wy\u015bwietlenie kategorii) musia\u0142 czeka\u0107. Sklep stawa\u0142 si\u0119 niedost\u0119pny na 5 minut ka\u017cdego dnia, co przy 1000 odwiedzaj\u0105cych w tym czasie oznacza\u0142o utrat\u0119 potencjalnych 200 zam\u00f3wie\u0144 dziennie.<\/p>\n<p><strong>Biznesowy koszt:<\/strong><\/p>\n<ul>\n<li>Bezpo\u015brednia utrata przychod\u00f3w \u2013 je\u015bli sklep nie odpowiada, klient idzie dalej.<\/li>\n<li>Frustracja u\u017cytkownik\u00f3w \u2013 nawet je\u015bli strona \u0142aduje si\u0119 wolno przez 30 sekund, wielu klient\u00f3w rezygnuje.<\/li>\n<li>Dodatkowe obci\u0105\u017cenie zespo\u0142u IT \u2013 interwencje awaryjne odci\u0105gaj\u0105 od rozwoju.<\/li>\n<\/ul>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Wprowad\u017a timeout na zapytania (np. 30 sekund) \u2013 zapytanie, kt\u00f3re trwa d\u0142u\u017cej, powinno by\u0107 automatycznie zabijane.<\/li>\n<li>U\u017cywaj indeks\u00f3w i optymalizuj zapytania (profiluj z EXPLAIN).<\/li>\n<li>W przypadku du\u017cych aktualizacji, rozbijaj je na batch\u2019e (np. 1000 rekord\u00f3w na transakcj\u0119).<\/li>\n<li>Monitoruj zapytania z pomoc\u0105 narz\u0119dzi takich jak pg<em>stat<\/em>activity (PostgreSQL) lub sys.dm<em>exec<\/em>requests (MSSQL).<\/li>\n<\/ul>\n<h3 id=\"podsumowanie\">Podsumowanie<\/h3>\n<p>Martwe procesy to nie tylko problem techniczny \u2013 to realny koszt biznesowy. Ka\u017cdy z trzech opisanych przypadk\u00f3w kosztowa\u0142 firmy, z kt\u00f3rymi pracowa\u0142em, dziesi\u0105tki tysi\u0119cy z\u0142otych w postaci utraconych przychod\u00f3w i zmarnowanych zasob\u00f3w. Dobr\u0105 wiadomo\u015bci\u0105 jest to, \u017ce diagnostyka i naprawa s\u0105 stosunkowo proste, je\u015bli wiesz, czego szuka\u0107.<\/p>\n<p><strong>Kluczowe wnioski:<\/strong><\/p>\n<ol>\n<li>Regularnie audytuj swoje \u015brodowisko produkcyjne pod k\u0105tem wisz\u0105cych sesji i zombie process\u00f3w.<\/li>\n<li>Wdr\u00f3\u017c monitoring i alarmy na d\u0142ugie zapytania oraz kolejki zada\u0144.<\/li>\n<li>Automatyzuj czyszczenie i retry\u2019e, ale z g\u0142ow\u0105 \u2013 nie bez ko\u0144ca.<\/li>\n<\/ol>\n<p>Je\u015bli masz wra\u017cenie, \u017ce Twoja aplikacja dzia\u0142a wolniej ni\u017c powinna, a nie wiesz dlaczego \u2013 by\u0107 mo\u017ce to w\u0142a\u015bnie martwe procesy wysysaj\u0105 energi\u0119 z Twojego systemu. A skoro ju\u017c jeste\u015b \u015bwiadomy problemu, mo\u017cesz z nim walczy\u0107. W JurskiTech specjalizujemy si\u0119 w tego typu optymalizacjach \u2013 pomagamy firmom wycisn\u0105\u0107 maksimum z posiadanej infrastruktury.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wydajno\u015b\u0107 aplikacji webowych: 3 martwe procesy, kt\u00f3re rujnuj\u0105 UX Pracuj\u0105c z wieloma firmami e-commerce i SaaS, regularnie widz\u0119 ten sam scenariusz: zesp\u00f3\u0142 narzeka na wolno dzia\u0142aj\u0105c\u0105 aplikacj\u0119, ale po szybkim audycie okazuje si\u0119, \u017ce g\u0142\u00f3wnym winowajc\u0105 nie jest zbyt du\u017cy ruch czy s\u0142aby hosting, tylko procesy, kt\u00f3re dawno powinny umrze\u0107. Martwe procesy \u2013 czyli zadania,<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[10,691,501,539,431],"class_list":["post-1964","post","type-post","status-publish","format-standard","hentry","category-warto-wiedziec","tag-ai-w-e-commerce","tag-backlog","tag-bledy-ux","tag-optymalizacja-aplikacji","tag-optymalizacja-wydajnosci"],"_links":{"self":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/1964","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/comments?post=1964"}],"version-history":[{"count":0,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/1964\/revisions"}],"wp:attachment":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/media?parent=1964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/categories?post=1964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/tags?post=1964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}