Do praktyków - jak radzić sobie z problemami w systemie

2

Witam,
główne problemy:

  • Wycieki pamięci

  • mało wydajne algorytmy

  • Zakleszenia brak timeoutów na IO

Oczywiście każdy z tych problemów da się rozwiązać ale to jest cały czas łatanie dziur w systemie. Czy znacie może jakieś rozwiązania, inne jezyki/platformy które potrafiły by określić np:

  • Maksymalna ilość pamięci dla żądania, po przekroczeniu np 20MB rzucany jest wyjątek ze więcej nie da się zaalokować rollback, cleanup itp
  • Timeout dla żądania, to samo, jeżeli operacja zaczyna przekraczać timeout to leci wyjątek

Te parametry urchroniły by przed wszystkimi powyższymi problemami

0

Od biedy mógłbyś skorzystać z jakiegoś AspectJ

1
Szczery napisał(a):

Oczywiście każdy z tych problemów da się rozwiązać ale to jest cały czas łatanie dziur w systemie. Czy znacie może jakieś rozwiązania, inne jezyki/platformy które potrafiły by określić np:

  • Maksymalna ilość pamięci dla żądania, po przekroczeniu np 20MB rzucany jest wyjątek ze więcej nie da się zaalokować rollback, cleanup itp.
    na JVM?

To w zasadzie nie do wykonania. Samą zajętość pamięci możesz ale w przybliżeniu możesz skorzystać z ThreadMXBean.getThreadAllocatedBytes(long id).
Potem to podpiąć na jakimś filtrze (jeśli korzystasz z java servlet) i sprawdzać jakiś "watchdogiem"...
Ale nie zablokujesz allokacji ani nie przerwiesz wątku.

  • Timeout dla żądania, to samo, jeżeli operacja zaczyna przekraczać timeout to leci wyjątek

http://stackoverflow.com/questions/7145131/tomcat-request-timeout

I pies jest pogrzebany w:
" there is no reliable way of stopping a thread in Java without the cooperation of that thread..."

Te parametry urchroniły by przed wszystkimi powyższymi problemami

Jak widać niestety nie.

To co można to ubijanie całych procesów/ serwerów i tu
rozwiązaniem w ogołnosci jest np. odpowiedni cluster. Startujesz sobie instancje na żadanie, zakleszczone ubijasz, masz pingi itp. Tu jest pytanie na ile twoja aplikacja da się pod coś takiego podpiąć. (Czy tez wszystko czy trzeba przepisac od nowa).
Możesz zobaczyć jak działa akka-cluster: https://vimeo.com/185781733

0

Co do timeoutowania - hystrix?

0

@jarekr000000: dzięki za ThreadMXBean.getThreadAllocatedBytes potestuje czy da rady. Jeśli chodzi o klaster i detekcje zakleszczeń to nie jest to takie proste bo pingi chodzą szybko ale, że ktoś zawiesił się na czytaniu pliku to to nie wpływa na responseTime

@hcubyc: to niby rozwiązuje problem, bo aplikacja się teoretycznie nie zapcha ale trzeb pamięta, że ta zakleszczone wątki podspodem dalej działąją i teraz niech taki wątek zatnie się w transakcji bazodanowej Hystrix rzuci wyjątkiem spoko ale wątek wykonawczy/pod spodem dalej wisi

Aktualnie znalazłem:

*W NodeJS może skorzystać z PM2 z process managera który obserwuje procesy i samoczynnie jest restartuje to załatwi outofmemory + super jakby podczas problemu robił heapDump.

  • Erlang/Elixir i koncepcja procesów, że każdy element systemu może być osobnym procesem (własna pamięć) i teraz jak proces ma problem to można też go ubić tylko nie wiem jak powinna wyglądać odpowiednia granulacja procesów tutaj wzywam @Koziołek
    Czy np jak mam
    SaleDocumentService -> ProductService -> WareHousservice -> WMSService to każdy z takich serisów aka SPring/EJB może być procesem jak tak to ile takich procesów per serwis pule po 10?
1
Szczery napisał(a):

@jarekr000000: dzięki za ThreadMXBean.getThreadAllocatedBytes potestuje czy da rady. Jeśli chodzi o klaster i detekcje zakleszczeń to nie jest to takie proste bo pingi chodzą szybko ale, że ktoś zawiesił się na czytaniu pliku to to nie wpływa na responseTime

Nie liczyłbym wiele na ThreadMXBean.getThreadAllocatedBytes.
natomiast jeśli aplikacja wisi na czytaniu pliku to ... bardzo ciekawe. Naprawdę jstack tak pokazuje ?

Myślałem , że raczej jest tak że puchnie Ci w aplikacji heap i potem wisi już na czymkolwiek losowym - wtedy można zbudować pinga który to w miarę wykrywa.

Pod hasłem PING mam na myśly prosty (lub nie) healthCheck, który sprawdza kilka podstawowych operacji dla aplikacji (czytam z bazy? mam dostepd do ldap? jest wolna pamięć?
... etc. i daje jakiś rezultat ) na tej podstawie potem są instancje ubijane. Mam jakieś porypane aplikacje (związane z masowym drukiem) - gdzie ten ping jest zaimplementowany w kilkuset liniach kodu i już go nie ogarniamy (no bo kto testował i specyfikował pinga...) - natomiast działa nieźle ).

0

@Szczery, w Erlangu/Elixirze jest zasada proces per funkcja. Zatem jak sobie napiszesz rozwlekłą funkcję to umrzesz. Rozwiązaniem jest GenStage, który pozwala na kompozycję procesów wychodząc z założenia, że zawsze działasz w modelu producent(ci)-konsument(ci). Z własnych zabaw z tym rozwiązaniem - najlepiej sprawdza się narysowanie sobie flow na karteczce i każdy klocek w osobny moduł, a strzałki między nimi jako komunikacja GenStage.

0

Przepis jak zawisną na czytaniu plików: W linuxie jest podmonotawa partycja ale jako zasób zdalny spoza naszej sieci. Na tym zasobie co jakiś czas pojawiają się zamówienia i teraz zdarza się ze podczas czytania tych badziewiastych plików po 200mb tamta lokalizacja co jakiś czas zanika ma problemy z internetem i wtedy czytanie takiego pliku wisi na UNIXSystem.readFile (THreadDump)

1 użytkowników online, w tym zalogowanych: 0, gości: 1