Kiepsko napisane algorytmy zawieszają serwer jak ubijać

0

Witam,
mam aplikację na produkcji i teraz co jakiś czas zdarza, że CPU i mem skacze na bardzo wysoki pułap przez jakieś kiepsko napisane algorytmy.

Jak się przed tym ustrzec tzn 90% jest napisana dobrze, ale teraz jak użytkownik uruchomi niefortunną funkcję to zamula ona cały serwer i wszystko pozostałe. Idealnie było by aby ta kiepska funkcja dostała np timeout po 1min z komunikatem błędu niż aby zjadała zasoby przez długie godziny.

Chodzi mi po głowie Thread.stop który jest depreceted i co w ogóle na to baza danych(transakcja, XA) jak tak ubije wątek.

A może jest inny sposób....

Sytuacja o tyle kiepska, że jak już dojdzie do owej sytuacji to pozostaje tylko restart :-/

0

Może jestem jakiś staroświecki, ale jeśli dana funkcjonalność >nigdy nie dochodzi do skutku<,
to czy nie lepiej ją hmm... wywalić?

0

To nie takie proste bo nie wiem które funkcje są źle napisane to po prostu wychodzi co jakiś czas coś innego

0

Inspekcja

2

Jedyne rozsądne rozwiązanie to zdiagnozować gdzie jest problem i zgłosić do dostawcy by naprawił. Z tego co napisałeś, to nie wiesz gdzie leży problem i snujesz domysły, że to "kiepsko napisane algorytmy".

Trzeba zaprząc do roboty odpowiednie narzędzia i zobaczyć w czym rzecz. Pod jakim systemem operacyjnym dzieje się to coś dziwnego?
Chętnie pomogę jeśli to będzie jakiś unixopodobny system i dostarczysz jakieś dane dodatkowe.

  1. Duże użycie pamięci
    Narzędzia typu "ps" - który z procesów wykazuje rosnące/duże użycie RSS. Który wykazuje duże użycie virtual memory?

  2. Duże użycie CPU
    top / topas i masz PID(y)

  3. Jeśli zidentyfikowane PIDy odnoszą się do procesów JVM, to robisz thread dumpa z JVM i matchuejsz PIDa zjadającego dużo CPU z TID z thread dumpa
    W ten sposób masz namierzoną część JVM, która powoduje problem. Teraz w zależności co robi ta część, trzeba drążyć dalej.

  • może to być wątek, który próbuje aktywnie dostać locka, a nie dostaje, bo inny wątek trzyma locka, a jest zajęty pracą wynikającą z niekończącego się zapytania na bazie danych
  • może to być kwestia wątku, który nie zwraca zasobów do puli i nowe wątki aktywnie czeakają na zasób z puli
  • ...
  1. Jeśli PIDy nie są JVM, to trzeba zobaczyć co robi ten proces (narzędzia typu strace / truss / dtrace / ... ) w kontekście wywołań systemowych.

Można też analizować stosy wywołań: procstack / pstack i namierzać funkcjonalność, które "wisi".

Tyle ogólnie. Jak dostarczysz jakieś dane do analizy, to może uda się wyciągnąć konkretne wnioski.

0

Jeśli chodzi o analizę tego co się stało to nie problem radze sobie. Tylko problemem jest fakt, że jak już to się stanie to jedynym wyjściem jest restart + zgłoszenie do dostawcy. Jednak to jest bezsensu wolałbym aby wadliwy wątek został automatycznie ubity + zgłoszenie do dostawcy a system dalej działa.

Innymi słowy wyobraźcie sobie panowie, że macie 100% CPU w waszym systemie. System ledwo chodzi z analizy wyszło, że jest wątek który robi coś strasznie kiepsko i to zabija cały serwer...co robicie? restart nie wchodzi w gre.....

1

@Szczery, mam wrażenie że błądzisz po omacku.
Zatrudnij jakiegoś administratora JVM do tej roboty (jeśli to projekt Javovy) - może na zlecenie.
Masz chociaż pewność że to JVM a nie baza lub podsystem plików (które są w pamięci - cache)?

Pomierz wszystko, jak napisał yarel.

Oprócz analizy:
a) możesz ograniczyć zużycie CPU per proces:
http://stackoverflow.com/questions/8882885/is-it-possible-to-force-an-existing-java-application-to-use-no-more-than-x-cores
http://www.cyberciti.biz/faq/cpu-usage-limiter-for-linux/
https://github.com/haosdent/jcgroup

b) możesz monitorować zużycie zasobów:
http://jvmmonitor.org/
http://www.javaworld.com/article/2077361/learn-java/profiling-cpu-usage-from-within-a-java-application.html

Napisz co to za OS, serwer aplikacyjny (wersja).

0

Ehhh widzę, że się nie rozumiemy. Każdy problem umiemy znaleźć ale chodzi mi o domyślne zachowanie systemu, że jedna spierdzielona funkcja zabija całą resztę dobrze napisanego softu.....Jeden wątek z 200 działających zjada 99,99% zasobów. Jak go z automatu znaleźć i ubić

0

Spróbuj tego: https://github.com/haosdent/jcgroup
Polecone na SO.

1

Prosty automacik:

 
#!/bin/bash

# odstep miedzy sprawdzeniem 
SLEEP_INTERVAL_IN_SEC=10

# petla do wyszukiwania procesow o utylizacji 99.9 

while [ 1 ]; do 
   # listuj procesy javowe o utylizacji cpu 99.9,  bierz pierwszy namierzony proces
   PROC_TO_KILL=`ps -Teo pid,tid,pcpu,comm |  awk '$3 ~ /99.9/ {print $0;}' | grep java | head -1`
   
   if [ ! -z "${PROC_TO_KILL}" ]; then
      echo "Namierzylem proces do ubicia (PID,TID,CPU,command): $PROC_TO_KILL"
	  PID_TO_KILL=`echo ${PROC_TO_KILL} | awk '{print $1}'`
	  kill -9 ${PID_TO_KILL}
   fi
   sleep ${SLEEP_INTERVAL_IN_SEC}
done
0

Skrypt fajny ale u mnie JBOSS to jeden PID :-)/proces. Chodzi mi o namierzenie wątków w JVM i co z nimi zrobić

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