Zarezerwuj pamięć budżetową na pule sterty lub buforów oraz narzut pamięci natywnej, pamięci podręcznej stron, wątków i odzyskiwania; widoczna sterta nie stanowi całkowitego limitu kontenera.
Ma to znaczenie na współdzielonym serwerze domowym, gdzie aplikacja JVM i baza danych konkurują z pamięcią podręczną stron NAS. Ryzyko operacyjne polega na tym, że limit ustawiony na poziomie równym rozmiarowi sterty powoduje zabijanie procesów przez OOM, a brak limitu pozwala jednemu obciążeniu wyprzeć każdą inną usługę. Zacznij od zapisanej wartości bazowej, wprowadzaj jedną odwracalną zmianę naraz i zatrzymaj się, gdy zaobserwowana gałąź przestanie odpowiadać zamierzonej ścieżce konfiguracji.
Ustal wartości bazowe limitów pamięci kontenerów dla JVM i baz danych
Przed zmianą ustawień zapisz working set kontenera, RSS, pamięć podręczną stron, natywną pamięć JVM, bufory bazy danych, użycie swapu, zdarzenia OOM oraz opóźnienia przy szczytowym obciążeniu. Zapisz pierwotną konfigurację i jeden przebieg zbliżony do produkcyjnego, aby późniejsze usprawnienia porównywać przy takim samym obciążeniu, a nie z pamięcią lub syntetycznym stanem bezczynności.
Użyj aktualnych ograniczeń pamięci kontenera, aby potwierdzić obsługiwany mechanizm sterowania i jego znaczenie. Traktuj wartości domyślne jako znany punkt wyjścia, a nie dowód, że ustawienie pasuje do tego serwera, zestawu klientów lub celu odzyskiwania.
Zdefiniuj warunki akceptacji i zatrzymania przed edycją. Sygnał akceptacji musi być widoczny w dziennikach, stanie protokołu, danych wyjściowych aplikacji lub przywróconych danych; warunek zatrzymania musi zapobiegać szerszemu dostępowi, utracie danych, wyczerpaniu zasobów lub awarii, która zużyje następne okno odzyskiwania.
Zastosuj zmianę limitów pamięci kontenerów dla JVM i baz danych w kontrolowanych etapach
Krok 1: Zmierz kontrolowane obciążenie szczytowe bez limitu i oddziel pamięć podręczną możliwą do odzyskania od niemożliwej do odzyskania pamięci rezydentnej. Po zmianie natychmiast sprawdź oczekiwany stan; jeśli się nie pojawi, cofnij ten krok przed zastosowaniem kolejnego.
Krok 2: Ustaw wartości docelowe sterty lub buforów dostosowane do aplikacji poniżej limitu kontenera i zarezerwuj pamięć hosta na jądro oraz pamięć podręczną pamięci masowej. Po zmianie natychmiast sprawdź oczekiwany stan; jeśli się nie pojawi, cofnij ten krok przed zastosowaniem kolejnego.
Krok 3: Dodaj próg ostrzegawczy przed twardym limitem i zmniejsz współbieżność, gdy pojawi się utrzymująca się presja na pamięć. Po zmianie natychmiast sprawdź oczekiwany stan; jeśli się nie pojawi, cofnij ten krok przed zastosowaniem kolejnego.
services:
app:
mem_limit: 4g
environment:
JAVA_TOOL_OPTIONS: "-Xms1g -Xmx3g"
Interpretuj gałęzie powodzenia, niepowodzenia i wyjątku
Powodzenie oznacza, że obciążenie szczytowe pozostaje poniżej marginesu ostrzegawczego bez intensywnego użycia swapu, zabijania procesów przez OOM ani pogorszenia opóźnień pamięci masowej. Zapisz dokładne obciążenie, wersję i czas, które dały ten wynik; lżejszy test nie jest dowodem rozwiązania pierwotnego problemu.
Niepowodzenie oznacza, że jądro zabija proces, JVM nie może zarezerwować pamięci natywnej albo baza danych wielokrotnie usuwa użyteczną pamięć podręczną. Nie próbuj kompensować tego przez osłabianie każdej sąsiedniej kontroli. Wróć do ostatniej czystej wartości bazowej i ustal, czy rozbieżność dotyczy tożsamości, sieci, pamięci masowej, gotowości aplikacji czy pojemności.
W przypadku wyjątku lub niejednoznacznego wyniku przywróć ostatni stabilny limit i zmniejsz stertę, liczbę połączeń lub współbieżność procesów roboczych, zanim zwiększysz presję na hosta. Eskaluj dopiero wtedy, gdy niskoryzykowny test rozróżniający można powtórzyć, a dowody wskazują, że konieczna jest głębsza zmiana platformy lub sprzętu.
Zweryfikuj trwałość przy pierwotnym obciążeniu serwera domowego
Powtórz tę samą ścieżkę klienta, rozmiar pliku, współbieżność, zdarzenie uśpienia lub ponownego uruchomienia oraz konkurencyjne obciążenie, których użyto w wartości bazowej. Wykonaj co najmniej dwa cykle, aby sukces przy rozgrzanej pamięci podręcznej, jedno szczęśliwe ponowne połączenie lub pojedynczy prawidłowy start nie zostały pomylone z trwałością.
Potwierdź zarówno powodzenie, jak i ograniczenie: obciążenie szczytowe pozostaje poniżej marginesu ostrzegawczego bez intensywnego użycia swapu, zabijania procesów przez OOM ani pogorszenia opóźnień pamięci masowej, a niezwiązani użytkownicy, usługi, udziały i ścieżki administracyjne zachowują dotychczasowe działanie. Zapoznaj się z powiązanym przepływem pracy ZimaSpace, gdy zmiana dotyczy sąsiedniej granicy pamięci masowej, sieci lub odzyskiwania.
Zamknij zmianę dopiero wtedy, gdy sygnał akceptacji się utrzymuje, a wycofanie nadal jest możliwe. Jeśli jądro zabija proces, JVM nie może zarezerwować pamięci natywnej albo baza danych wielokrotnie usuwa użyteczną pamięć podręczną, zatrzymaj automatyzację, zachowaj dzienniki i zapisaną konfigurację oraz wróć do ostatniego zweryfikowanego stanu, zamiast nakładać kolejne zmiany.
FAQ dotyczące rozgałęzienia zapytań, decyzja końcowa i test końcowy
Te pytania dotyczące rozgałęzienia zapytań obejmują kolejne decyzje, których użytkownicy często szukają po prawidłowym działaniu głównej konfiguracji. Rozszerzają zakres bez wprowadzania niesprawdzonej ścieżki naprawczej.
Stosuj każdą odpowiedź tylko wtedy, gdy jej warunek odpowiada zmierzonemu środowisku. Różnice wersji, protokołu, systemu plików, klienta i granicy zaufania mogą zmienić właściwą gałąź.
Przechowuj odpowiedzi razem z procedurą operacyjną i aktualizuj je po uaktualnieniach lub zmianach topologii. Każdy wyjątek rozszerzający dostęp do zapisu, zasięg sieci lub uprawnienia do usuwania wymaga ponownego testu wycofania i odzyskiwania.
Czy Xmx powinno być równe limitowi pamięci Dockera?
Nie. Pozostaw miejsce na metaspace, bufory bezpośrednie, wątki, pamięć podręczną kodu, biblioteki natywne i narzut systemu operacyjnego.
Czy baza danych używa pamięci poza pulą buforów?
Tak. Połączenia, obszary robocze, konserwacja, rozszerzenia i pamięć podręczna systemu plików mogą znacznie przekroczyć skonfigurowaną pulę.
Czy swap zawsze szkodzi?
Nie zawsze, ale utrzymujące się użycie swapu podczas pracy interaktywnej jest silnym sygnałem, że plan pamięci lub współbieżność są nieprawidłowe.
Wniosek: Konfiguracja jest ukończona, gdy obciążenie szczytowe pozostaje poniżej marginesu ostrzegawczego bez intensywnego użycia swapu, zabijania procesów przez OOM ani pogorszenia opóźnień pamięci masowej, gałąź niepowodzenia jest zrozumiana, a udokumentowane wycofanie nie zależy od zmienianego komponentu.
Końcowa procedura testowa: Przywróć zapisaną wartość bazową, zastosuj zatwierdzoną zmianę jednokrotnie, powtórz pierwotne obciążenie zbliżone do produkcyjnego, zweryfikuj sygnał powodzenia i granicę ograniczenia, a następnie przećwicz wycofanie na danych jednorazowych. Zachowaj zmianę tylko wtedy, gdy wszystkie pięć obserwacji jest zgodnych.
Wsparcie i wskazówki
Więcej do przeczytania

Przewodnik po pamięci masowej nagrywania telewizji na żywo: pojemność, przechowywanie i czyszczenie
Zmierz rzeczywiste nagrania, zarezerwuj zapas, połącz limity wieku i pojemności oraz potwierdź, że najstarszy kwalifikujący się program zostanie usunięty, zanim pamięć się zapełni.

Proces odzyskiwania metadanych multimediów domowych po przywróceniu bazy danych
Zabezpiecz przywrócony stan, zweryfikuj tożsamość multimediów i ścieżki, a następnie napraw brakujące grafiki lub dopasowania w pilotażowej bibliotece przed wprowadzeniem szeroko zakrojonych zmian metadanych.

Lista zgodności klientów Jellyfin z dźwiękiem, obrazem i napisami
Testuj reprezentatywne pliki, zmieniając jedną zmienną naraz, i rejestruj dla każdego klienta: bezpośrednie odtwarzanie, remultipleksowanie, konwersję dźwięku, transkodowanie wideo lub niepowodzenie.

