Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Mysql] Communications link failure

1 view
Skip to first unread message

krzysiek

unread,
Jan 3, 2008, 6:00:05 PM1/3/08
to
Witam

Problem dosc dziwny. Otóż program na windowsie gdzie wszystko napisalem
dziala swietnie, pod linuchem CentOS niestety zaczyna mi sypac takim
errorem:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications
link failure

Last packet sent to the server was 1 ms ago.
at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2873)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2763)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3299)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2537)
at
com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
at
com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
at BazaDanych.inser(BazaDanych.java:35)


Aplikacja dziala tak, ze najpierw dodaje duzo danych okolo 90 i nagle
wysypuje taki blad. Zaznaczam, ze pod windowsowym mysqlem to dzialalo,
pod linuchem przez pewien czas dziala a pozniej kleska.

Stawiam, ze wina tkwi w mysql'u a nie w aplikacji, ale nie moge znalezc
nic sensownego w googlach. Probowalem juz zmieniac connectora do mysqla
nadal nic. Lacze sue w taki oto sposob: jdbc:mysql://localhost/baza

Config mysql'a wyglada tak:

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

key_buffer = 192M
sort_buffer_size = 12M
record_buffer = 16M
table_cache = 2640
thread_cache_size = 128
connect_timeout = 15
wait_timeout = 30
max_allowed_packet = 32M
query_cache_limit = 16M
query_cache_size = 80M
query_cache_type = 1
thread_concurrency = 2

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

jolz

unread,
Jan 4, 2008, 11:35:11 AM1/4/08
to
Zgaduje ze w czasie rzucenia wyjatkiem top pokazuje 100% zajetosci
procesora. Jesli tak to bardzo mozliwe ze masz system tak mocno
obciazony ze socket umiera. Sproboj zmienic zmienic priorytet wlasnej
aplikacji lub mysqla. Nie kojarze zadnej takiej opcji w mysqlu (co nie
znaczy ze jej nie ma), ale nice powinien zadzialac. Czy pod windowsem
jak wszystko dziala i mysql pracuje to okienka przestaja odpowiadac? A
pod linuxem gui zachowuje sie jak trzeba? Jesli tak to sugeruje dac
mysqlowi mozliwie wysoki priorytet. Mozesz tez sprobowac zmienic silnik
mysqla. Wlasciwie jesli rzeczywiscie to problem z obciazeniem systemu to
zmiana dowolnej opcji w konfigu mysqla moze pomoc. np zmniejszenie
ktoregos cache moze spowodowac czestrze odwolywanie sie do dysku - mysql
bedzie wolniej dzialac, ale dzieki temu bedzie mniej obciazal procesor.

krzysiek

unread,
Jan 5, 2008, 7:54:22 PM1/5/08
to
jolz pisze:

Nie do konca serwer ma sie dobrze, Mysql rusz procek na 6-7% max juz
predzej PHP, ktory dziala na serwerze wiecej zajmuje zasobow. Czy dalej
szukac w tym temacie obciazenia ? Bo dla mnie to jednak to nie to, no
ale zawwsze moge sie mylic.

Najgorsze ze jak odpale dla jednego watka to zawsze doda szybko 17
rekordow i po 17stu juz pada. Wyrzuca errorem takim jak wyzej opisany.

jolz

unread,
Jan 6, 2008, 6:25:26 AM1/6/08
to
> Czy dalej szukac w tym temacie obciazenia ?

Raczej nie ma sensu szukac problemu po stronie javy. Ewentualnie mozliwe
ze opcja autoReconnect sterownika pomoze, ale ona nie powinna byc
potrzebna, i zanim uzyjesz przeczytaj dokladnie co robi i dlaczego nie
jest domyslnie wlaczona. Mozliwe tez ze nie pokazales calego wyjatku i
polaczenie sie zerwalo np z powodu OutOfMemory lub np za duzego pakietu
(chociaz widze ze masz ustawiona spora wartosc maksymalna). Ale przy w
miare standartowych insertach nie powinno byc takiego wyjatku.
Oczywiscie korzystasz z PreparedStatement a nie Statement? (uzycie
Statement nie powinno powodowac takiego wyjatku, ale bedzie wymagalo od
mysqla wiecej pracy jesli wszystkie insetry sa podobne i roznia sie
tylko wartosciami wpisywanymi do bazy)

> Mysql rusz procek na 6-7% max juz
> predzej PHP, ktory dziala na serwerze wiecej zajmuje zasobow

To znaczy ze w czasie rzucania wyjatkiem procesor jest wolny, czy jest
100% zajety a mysql zajmuje z tego 6%? Jesli procesor jest zajety to
zwiekszenie priorytetu powino pomoc. Jesli jest wolny to lepiej szukac w
konfiguracji mysqla - np przepisac z dzialajacej wersji windowsowej.

> Najgorsze ze jak odpale dla jednego watka to zawsze doda szybko 17
> rekordow i po 17stu juz pada. Wyrzuca errorem takim jak wyzej opisany.

Dodaj krotkiego sleepa przed wrzuceniem rekordu do bazy - tylko w zadym
wypadku nie zostawiaj tego na dlugo. Bedziesz wiedzial czy mysql nie
radzi sobie z przetwarzaniem szybkich zapytan, czy po prostu zupelnie
nie radzi z sobie z tym co mu chcesz wrzucic do bazy. Sproboj stworzyc
naprostrza mozliwa sytuacje dla ktorej nie dziala - np zrob tableke z 1
kolumna i wrzucaj tam dane. Jesli korzystasz z InnoDB spawdz jak sie
zachowuje z transakcja a jak bez. Zmien silnik bazy (mozna podac
odpowiedni przy definicji tabeli) i zabacz czy z innym bedzie taki sam
problem. Jak caly czas nawet najprostrza sytuacja nie bedzie dzialala
sprawdz jak sie zachowuje z inna baza - dla javy to nie ma zadnego
znaczenia jaka to baza, a bedziesz wiedzial czy szukac po sronie linuxa
czy bazy.

Korzystasz z javy sunowskiej? - linuxy lubia ustawiac domyslnie gcj i
wtedy rzadko co dziala.

Kudlacz

unread,
Jan 6, 2008, 9:00:32 AM1/6/08
to
Zegar atomowy wskazał: 2008-01-04 00:00:05, gdy krzysiek napisał(a):

> Problem dosc dziwny. Otóż program na windowsie gdzie wszystko napisalem
> dziala swietnie, pod linuchem CentOS niestety zaczyna mi sypac takim
> errorem:
>
> com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications
> link failure
>

Niestety nie podam ci konkretnego rozwiazania ani przyczyny, ale nie zgodze
sie, jak sugeruje ktos inny, ze winne jest obciazenie maszyny. Jezeli
procek bylby zajety nawet w 200% to powinno dzialac - wolniej ale dzialac.
Piszesz, ze kilkadziesiat rekordow 'przechodzi' i wysypuje sie dopiero
potem - dodac jakis Thread.sleep przed kazdym 'update' i zobacz czy bedzie
dzialac jak 'zwolnisz tempo'. Moze masz jakis limit na ilosc pakietow na
sekunde (patrz firewall) i dlatego ci sie to wszystko sypie. Jezeli masz
duza powtarzalnosc po ilu rekordach ci sie sypie to moze to jest przyczyna.
Mozesz tez miec jakis limit na ilosc czasu jaki moze zabrac jeden proces -
nie napisales czy maszyna jest pod twoja kontrola czy jest to jakis shared
hosting (jezeli to drugie to rozne dziwne limity moga cie 'ubijac').
Reasumujac - musisz wyizolowac problem - najlepiej jakbys byl stanie
wszystkie polecenia SQL'owe zapisac np do pliku i wykonac nie z poziomu
swojej aplikacji a innej - bedziesz wiedzial czy to cos u ciebie czy w
bazie/systemie.
Zrob tcpdump na to polaczenie i zobacz ktora strona robi 'reset' (czyli
konczy polaczenie).

Pozdrawiam.
--
Kudlacz
pies_kudlacz_kot@chomik_hot.pl
usun zwierzyniec zanim napiszesz ...

0 new messages