Toon posts:

[mysql] Hangende connecties zorgen voor trage server

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op mijn server is het volgende aan de hand. Van tijd tot tijd krijg ik door drukte op de website last van hangende connecties. Deze sluiten niet meer uit zichzelf en zorgen ervoor dat de server erg traag wordt aangezien deze alle cpuresources opeten.

Even een voorbeeld van de processen op de server:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 12:56:15  up 15 days, 47 min,  1 user,  load average: 1.40, 0.94, 0.66
111 processes: 103 sleeping, 3 running, 0 zombie, 5 stopped
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
           total   90.0%    0.0%    8.6%   0.2%     0.2%    0.0%    1.0%
Mem:  2049724k av, 2025336k used,   24388k free,       0k shrd,  111792k buff
                    334116k actv, 1258936k in_d,   41728k in_c
Swap: 2040244k av,       4k used, 2040240k free                 1836124k cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
 4222 mysql     25   0 12296  12M  2376 R    90.8  0.5   3:07   0 mysqld
 4245 mysql     15   0 12296  12M  2376 S     5.4  0.5   0:04   0 mysqld
 4223 mysql     16   0 12296  12M  2376 S     2.2  0.5   0:02   0 mysqld
 4135 mysql     15   0 12296  12M  2376 S     0.2  0.5   0:00   0 mysqld


Zoals je ziet is proces 4222 al 3:07 bezig. Deze blijft net zolang hangen totdat ik hem kill.
Ik heb nu al een load van 1.40 met een zeer lage idle, maar dit wordt alleen maar erger naar mate dit proces blijft bestaan.

Wat zo vreemd is is dat deze mysqlconnectie niet ergens verder voor wordt gebruikt. Als ik een mysqlreset doe, draait de server weer gedurende onbepaalde tijd prima.

Mijn vraag is dus hoe kan ik ervoor zorgen dat ik geen mysqlprocessen meer heb die langer dan zeg 1 minuut blijven bestaan. Ik heb my.cnf al zoveel mogelijk proberen te optimizen. Deze kan ik indien nodig ook nog wel even posten, maar heb zelf geen idee welke settings te maken hebben de met tijdsduur van queries/connecties e.d Vooralsnog los ik het op door mysql om het uur te restarten :S Maar dat is natuurlijk niet echt een oplossing. Alvast dank voor de antwoorden!

Verwijderd

Een cronjob draaien die checkt hoe lang een process al loopt en killt als ie langer dan een minuut loopt is een optie...

Verwijderd

Heb je ook al een 'wait_timeout' in my.cnf staan?
code:
1
wait_timeout = 60 # inactieve connectie max 60sec.


Nu zal de verbinding gesloten worden als het meer dan 60 seconden niets gedaan heeft, ik weet niet zeker of dit iets helpt voor je maar het is et proberen waard.

Verwijderd

Topicstarter
Dat lijkt inderdaad een stuk te helpen! Echter zie ik wel dat die tijden wel regelmatig overschreden worden voordat ze wegvallen, dat is wel vreemd. Het lijkt dus nog niet in alle gevallen te werken.

Verwijderd

D'r staat ook dat het gaat on inactive connecties.

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Voor dit soort dingen heeft mysql een 'show processlist', zodat je kan zien wie wat uitvoert.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op donderdag 29 september 2005 @ 13:27:
Een cronjob draaien die checkt hoe lang een process al loopt en killt als ie langer dan een minuut loopt is een optie...
MySQL threads (hard) killen? Dat lijkt op russisch roulette spelen met de data betrouwbaarheid.

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

hij zei toch niet dat een een goede optie was :P

Verwijderd

Topicstarter
Wel, het is me nog steeds onduidelijk hoe deze connecties af te breken. De timeouts werken eigenlijk gewoon niet. Ik ben er van overtuigd dat deze connecties verder niets meer doen, en dat ze dus echt onnodig blijven hangen. Je zou toch vermoeden dat er een manier zou zijn om deze persistant connecties na een bepaalde tijd uit te schakelen. Ik heb soms connecties die oneindig lang blijven bestaan, dus meerdere uren lang, net zo lang tot de server onderuit gaat of dat wanneer ik zelf deze connecties afsluit of anders gezegd hard kill....en dat is geen bevredigende oplossing.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op vrijdag 30 september 2005 @ 20:39:
Wel, het is me nog steeds onduidelijk hoe deze connecties af te breken. De timeouts werken eigenlijk gewoon niet. Ik ben er van overtuigd dat deze connecties verder niets meer doen, en dat ze dus echt onnodig blijven hangen. Je zou toch vermoeden dat er een manier zou zijn om deze persistant connecties na een bepaalde tijd uit te schakelen. Ik heb soms connecties die oneindig lang blijven bestaan, dus meerdere uren lang, net zo lang tot de server onderuit gaat of dat wanneer ik zelf deze connecties afsluit of anders gezegd hard kill....en dat is geen bevredigende oplossing.
Ik denk trouwens dat je met kill heel de server killed en MySQL daarna auto-restart.
Maar heb je al met show processlist gekeken wat er nu echt aan de hand is?

Verwijderd

Topicstarter
Ja. Ik krijg dan een aantal (stuk of 20-30) slapende connecties te zien, met een vrij hoge timevalue.
Verder een aantal actieve connecties die steeds een andere query bevatten. Echter weet ik niet hoe ik kan zien aan welke mysql connectie verband houdt met de individuele processen. Dus als bij de serverprocessen zie ik wel een PID nummer van de mysql connectie, maar bij de processlist van mysql weet ik niet welke connectie waarbij hoort? Ik vermoed dat die hangende connecties dus iets met dat aantal sleeps te maken heeft..

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 29-04 14:36

pistole

Frutter

Weet je zeker dat deze connectie's 'hangen'? Wordt er misschien gebruik gemaakt van een connection pool? Worden connecties netjes afgesloten in je code?

Ik frut, dus ik epibreer


Verwijderd

Topicstarter
het gaat om persistant connecties, dus in principe blijven deze open...tenminste ik wil dat dus limiteren. Er zijn wel timeout settings, maar die werken dus niet (wait_timeout en interactive_timeout). Sja of ze blijven hangen weet ik niet, wellicht dat ze in slaapstand blijven....maar dan ga ik er toch ook vanuit dat ik slapende processen/connecties moet kunnen stoppen....

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Weer je 100% zeker dat de connecties niks meer doen, want in jouw voorbeeld gebruikt de betreffende ( die van 3:07) wel meer dan 90% van je cpu.

Doe idd eens in de mysql console iets van : show processlist.
Of kijk eens in je log, of zet je slow_query_log aan.

Want volgens mij heb je of gewoon 1 query die iets fouts doet of je hebt ergens iets staan wat leuke table locks veroorzaakt op de meest gebruikte tabel.

Ik vermoed meer dat het aan je scripting / sql ligt dan dat de server niet goed reageert. Een mysql die 90% cpu veroorzaakt (!= slaapstand ) zal mysql namelijk nooit afsluiten omdat hij niet idle is.

Verwijderd

Topicstarter
Okay, de processlist geeft wel een aantal wisselende queries weer maar ik weet niet welke hoort bij welke connectie. Dat slow_query_log heb ik nog niet geprobeerd. Ik denk wel inmiddels dat je gelijk hebt dat het aan de query (php/mysql) zal liggen, maar het blijft lastig te achterhalen welke query nu voor deze moeilijkheden zorgt.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Daar is die slow query log juist voor, die geeft van trage queries aan hoe lang ze duurden.

Overigens laat de show processlist ook het process id zien van de query en die kan je vergelijken met wat je in top ziet, zodat je wel degelijk kan zien welk process er nou zoveel tijd vraagt.
Een idle connection neemt overigens hooguit geheugen en "een connectionslot" in beslag, maar zal in de regel geen of heel weinig processingpower kosten. Zeker geen 90%.

Verwijderd

Topicstarter
Ik heb de log_slow_queries aangezet, echter schrijft hij niks weg in het logbestand...
Pagina: 1