Czy najlepszą praktyką branżową jest okresowe restartowanie serwerów sieciowych? [Zamknięte]

28

Mamy aplikację internetową (opracowaną przez firmę zewnętrzną), która działa na Tomcat. Z aplikacji mamy bardzo słabą wydajność. Twórca aplikacji twierdzi, że najlepszą praktyką branżową jest restartowanie serwerów sieciowych co noc, aby zwolnić całe użycie pamięci i zacząć od nowa.

Z perspektywy klienta, która łagodzi problem awarii strony w ciągu dnia, ale z perspektywy SysAdmin jest to okropne rozwiązanie.

Obsługujemy 20 takich aplikacji na różnych serwerach dla różnych klientów, a koordynacja zapewniania, że ​​wszystkie są restartowane każdej nocy, wydaje się po prostu błędna.

Geo
źródło
41
Powiedz im, że najlepszymi praktykami branżowymi dla twórców aplikacji jest znajdowanie i usuwanie wycieków pamięci.
Bart Silverstrim
4
@Bart Oh snap !!
mfinni
1
+1 tylko za zrobienie mojego dnia (PS: sam jestem programistą)
RN.
1
Czy powiedział serwery lub usługi? Mamy aplikację Tomcat, która co noc wymaga ponownego uruchomienia usługi. Jeśli tego nie zrobię, w pewnym momencie w przyszłości się zawiesi. Wolałbym tego nie robić, ale obsługa w ciągu dnia jest ważniejsza.
Tuby
1
Pobierz monitorowanie plików dziennika i pobierz narzędzia monitorowania JVM. Jeśli rzeczy ulegają awarii w ciągu dnia, powinieneś zobaczyć wyjątki lub coś rejestrowane - nawet jeśli są to wyjątki domyślne. To da ci wgląd w ogólną naturę błędu. Zobacz także wykorzystanie pamięci JVM. Szanse są naprawdę dobre, mają przeciek pamięci i złapiesz go, jeśli zobaczysz stertę JVM serwera. Walcz ze złym rozwojem dzięki dobrym danym sysadmin. Niszczy obronę „Po prostu nie wiesz, co robisz” i sprawia, że ​​muszą odpowiedzieć na pytanie, dlaczego coś popsuło.
FloppyDisk

Odpowiedzi:

29

Z pewnością nie jest to najlepsza praktyka. Chociaż dobrze jest okresowo restartować serwery, aby upewnić się, że wszystko działa poprawnie, konieczność ponownego uruchomienia w nocy wskazuje na bardzo poważny przeciek pamięci w aplikacji.

EEAA
źródło
1
To bardzo dobry punkt. Jeśli nigdy nie uruchomisz ponownie serwerów zgodnie z sugestią poniżej, możesz nie wiedzieć, że masz pewne usługi, które nie uruchamiają się poprawnie. Następnie w przypadku awarii zasilania / twardego restartu serwer może nie wrócić prawidłowo.
einstiien
1
+1. Miesięczny może być bardziej sensowny - nie tylko w celu ponownego uruchomienia, ale w celu normalnej procedury działania w celu zastosowania poprawek itp. Byłem kiedyś członkiem zespołu administracyjnego dla około 1500 serwerów przez całą dobę, a każdego miesiąca następowały 3 noce restart ”zaplanowane, w którym to momencie wszystkie łatki itp. zostaną również umieszczone na serwerach. Zapewnia to pewną stabilność planowania i standardową procedurę operacyjną.
TomTom
12

Istnieje różnica między „najlepszymi praktykami”, rzeczami, które wiele osób robi z dobrych powodów, a „powszechnymi praktykami”, rzeczami, które wiele osób robi, ponieważ są leniwe i / lub ignoranckie.

Aplikacje i (gorsze) serwery, które muszą być rutynowo restartowane lub ponownie uruchamiane, aby nadal działały poprawnie, dość powszechne. Ale jest to również wyraźny sygnał, że masz krytyczny błąd.

Dzięki regularnemu ponownemu uruchamianiu aplikacji przez SPO firma ukrywa poważny błąd pod dywan. Jest to niewybaczalne, błąd musi być zakryty i zgnieciony, albo wróci, by cię ugryźć później.

W idealnym przypadku Twoja firma powinna znaleźć lepszego programistę. Niestety może to spowodować sporo pracy przy przepisywaniu dużych fragmentów kodu. Fakt, że deweloper albo uważa, że ​​źle napisany kod jest akceptowalny, albo nie wie wystarczająco, aby rozpoznać objawy błędnego kodu, sugeruje niską jakość kodu. Dobry deweloper będzie konstytucyjnie niezdolny do pozostawienia go w tym stanie.

Biorąc pod uwagę, że możesz nie być w stanie zastąpić programisty, kilka sugestii:

  • Sprawdź, czy możesz poprosić lepszego programistę o sprawdzenie kodu i zgłoszenie jego oceny komuś, kto może coś z tym zrobić,
  • Zobacz narzędzia do profilowania. Jeśli masz umiejętności i / lub skłonność, spróbuj samodzielnie profilować kod, aby znaleźć wyciek i zgłosić go.

Nawet bez wchodzenia w narzędzia profilujące zorientowane na programistę, istnieje wiele narzędzi zorientowanych na sysadmin do profilowania i monitorowania wykorzystania pamięci w aplikacjach Java. W każdym razie powinieneś naprawdę skonfigurować monitorowanie pamięci (szczególnie sterty) na serwerach produkcyjnych. Polecam to, nawet jeśli korzystasz z kodu jakości. Może to dać ostrzeżenie z wyprzedzeniem, gdy Twoje błędne aplikacje wkrótce się przewrócą.

Ale jeszcze lepiej, powinny one pomóc w zebraniu dowodu na wyciek, a nawet mogą wskazywać, gdzie jest problem w aplikacji. To da ci lepszą amunicję do lobbowania za jej naprawieniem.

Kief
źródło
2
W rzeczywistości wiele razy błąd dotyczy infrastruktury, a nie kodu programisty. Nie mieliśmy żadnych problemów z aplikacjami J2EE, które okresowo przechodzą do piekła do śmiecia na JBoss, ale działają dobrze na innych serwerach aplikacji handlowych. Może to nie być wina programisty, ale środowisko wdrażania.
rmalayter
6

Deweloper aplikacji prawdopodobnie twierdzi, że w jego najlepszym interesie jest objęcie jego tyłka przez obejście nieprofesjonalnej pracy, którą wykonał. Być może przestał przyznawać, że napisał coś z ogromnym wyciekiem pamięci, ale niezbyt daleko.

Maximus Minimus
źródło
3

Wydaje się, że wiele odpowiedzi tutaj nie pasuje do praktycznych rozwiązań. Wydaje się, że unikają dogmatów - serwerów nigdy nie należy restartować - dlaczego mamy 5 dziewiątek? tolerancja na awarie? Cóż, więc kiedy mają wstać, nie ruszają się.

Ponadto stwierdzenie, że jest to przyczyną złych programistów lub złych praktyk programistycznych, nie prowadzi do sedna problemu. Może to być, ale najczęściej niezły kod aplikacji. Te problemy są już wbudowane w znaczną część kodu systemowego. Małe wycieki pamięci, sterty Java i problemy z permgenem, jeśli korzystasz z wielu małych aplikacji. Nowoczesne serwery i uruchamiane przez nich oprogramowanie są bardzo złożone. Kiedy myślisz o tym, co musi zrobić serwer taki jak tomcat - obsługuje pliki, przetwarza żądania sieciowe, komunikację sieciową, komunikację z bazą danych itp. - robi to dużo. Na tym stosie jest mnóstwo ruchomych części.

Proaktywne ponowne uruchamianie serwerów pozwala powiedzieć, że raz w tygodniu lub miesiącu jest moim zdaniem inteligentny i wydajny. Jeśli masz klaster i obracasz serwery, nie powinieneś wpływać na klientów ani trochę. Klienci będą znacznie bardziej zadowoleni z wydajności twoich serwerów.

Claude
źródło
2

Serwery IMO powinny być zamykane jak najmniej. Bardziej prawdopodobne jest, że twórca aplikacji zbudował tandetną aplikację z wyciekiem pamięci.

matpie
źródło
Oczywiście - myślę, że OP musi powiedzieć komuś, że musi znaleźć lepszego programistę.
Helvick
2
Istnieje powód, dla którego duże firmy płacą duże pieniądze za wiele dziewiątek za pracę i dlaczego firmy wydają tysiące na nadmiarowe zasilacze, macierze RAID, klatki Hot Swap itp., A na pewno nie jest tak, że trzeba je restartować tylko raz dziennie.
Bart Silverstrim
1

Co wieczór mam skrypt uruchamiający jeden z naszych serwerów WWW, ale to więcej z powodu źle napisanej aplikacji Java niż standardu branżowego. Powiedziałbym jednak, że ponowne uruchomienie usług sieciowych nie jest rzadkością. Może to zrobić czyszczenie pamięci, którego szukasz, i mniej obciążać serwer w porównaniu do pełnego ponownego uruchomienia.

einstiien
źródło
1

Serwer najlepiej nigdy nie uruchamiać ponownie. To jeden z powodów, dla których mamy tolerancję na awarie . Jeśli musisz zrestartować serwer z powodu aplikacji, oznacza to, że aplikacje wyciekają z pamięci i są źle zbudowane.

Pracowałem wcześniej z Tomcat i miałem ten sam problem, następnym razem, gdy będę pracować z kontenerem Java, szukam innego, może JBoss lub GlassFish.

Edycja: Jeśli musisz teraz uruchamiać go co noc, prawdopodobnie będziesz musiał go uruchamiać częściej, jeśli / kiedy obciążenie wzrośnie. Pamiętaj, aby mieć solidne aplikacje, to najlepsze rozwiązanie.

Jonas
źródło
4
Nie sądzę, że zgadzam się, kiedy mówisz, że serwer nigdy nie powinien być restartowany. Serwery należy zrestartować, aby zastosować poprawki bezpieczeństwa. Nie powinny jednak wymagać ponownego uruchomienia w przypadku czynności innych niż planowana konserwacja.
Zoredache
Prawdą jest, że niektóre serwery muszą zostać zrestartowane, aby zastosować poprawki bezpieczeństwa. Ale jeśli masz wystarczająco dobry system, nie musisz go ponownie uruchamiać. Istnieją systemy działające rok po roku. Powinieneś dążyć do wysokiej dostępności, jeśli obsługujesz usługę w Internecie. Jeśli masz system odporny na uszkodzenia, taki jak klaster, możesz zdejmować węzły jeden po drugim i aktualizować je, gdy usługa jest nadal uruchomiona.
Jonas
1
Jeśli masz tylko jeden serwer i / lub sprzęt, nie ma czegoś takiego jak Wysoka dostępność. Robisz to źle, jeśli dałeś tylko jeden serwer, a twoja usługa jest tak krytyczna, że ​​od czasu do czasu nie może tolerować 15 minut przestoju w celu ponownego uruchomienia serwera. Jeśli masz aplikację „zero przestojów”, będziesz mieć prawdziwy system HA z wieloma węzłami. W takim przypadku okresowe ponowne uruchamianie łatek itp. Jest dość łatwe, jak wskazałeś.
EEAA
1
„Następnym razem ... będę szukał innego [kontenera Java innego niż Tomcat]”. Nie obwiniłbym Tomcat. Prowadzę na nim usługi produkcyjne od lat i za każdym razem, gdy mam ten problem, okazuje się, że jest to problem z aplikacją. „Pamiętaj, aby mieć solidne aplikacje, to najlepsze rozwiązanie” Dokładnie. Co zabawne, każdy inny serwer aplikacji Java, z którego korzystałem do tej pory, ma podobne problemy, kiedy uruchamiam na nim nieszczelny kod. To powiedziawszy, Tomcat 7 powinien mieć jakieś aktywne wykrywanie wycieków pamięci.
Kief
0

Najczęstsze, jakie kiedykolwiek widziałem, to cotygodniowe. Gdzie jestem teraz, jesteśmy sklepem z oknami i robimy to co miesiąc w weekend po wtorkowym patchu.

Joel Coel
źródło
Kiedy zacząłem pracować w jednym miejscu, okazało się, że miały one nocne restarty na miejscu ... To było okropne, zwłaszcza, że ​​serwer miał około 1-2% szansy, że nie wróci do normy (błąd synchronizacji w sterowniku dysku twardego) ). Trwało trochę czasu, aby naprawić „przyczyny” restartów. Dobrze spędzony czas.
Brian Knoblauch
0

Chociaż zgadzam się, że ciągłe ponowne uruchamianie serwera nie jest idealne, ale są sytuacje, w których nie jest to wina programisty ani niewłaściwa czynność. Mamy dobrze działającą aplikację, która przecieka pamięć z powodu problemów w bibliotece Python Popen. To stara aplikacja, która wkrótce zostanie wycofana, ale ma kluczowe znaczenie dla biznesu. Musimy utrzymywać go przy minimalnym wysiłku dla naszych klientów. Właśnie postanowiliśmy zrestartować serwer co noc.

Nick Mellor
źródło