PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : too many connections, trotz ausreichender hardware :-(



awm tom
04.06.2004, 21:46
... und deswegen wird mein problem auch an der konfiguration liegen.

es wäre prima, wenn sich hier jemand findet, der mir bei meinem problem behilflich sein könnte. immer wieder stockt der server mit grauenvollen loads und man erhält als user im browser die meldung "too many connections".

in diesem moment gibt es dann meisst rd. 400 - 500 prozesse auf dem server, davon 3/4 mysql prozesse die nciht abgearbeitet werden, bzw. nur sehr langsam. die load liegt dann meist nahe der 100er grenze oder drüber.

kennern dürfte das verhalten des servers aber ja bekannt sein :-)

ich habe nun verschiedene einstellungen der my.cnf getestet und auch im apache einiges probiert, aber geholfen hat alles nichts auf dauer. dann habe ich aufgerüstet auf 2 gig ram (vorher waren es 1 gig), das ging ne weile gut, hilft aber nun auch nicht mehr.

ich bin aber überzeugt, dass es an der konfig liegt, denn wenn alles im grünen bereich ist, habe ich loads zwischen 03. - 3,5, die htm basierenden webseiten sind sehr schnell, die foren sind in akzeptabler geschwindigkeit.

es gibt auf dem server rd. 8 foren, die allesamt eine mittlere auslastung haben. sind halt kleinere dabei, aber auch 2 -3 foren die etwas mehr traffic haben. im peak haben die grösseren foren ca. 60 -120 user online (bei einer online einstellung in der cp von 1600 :-) also, ich denke mal, gleichzeitig müssten im schnitt 50 - 150 user online sein. halt auf verschiedene foren verteilt.


der server ist ein Dual PIII 1 Gig, mit 2 gig ram, suse 7.3, confixx 1.6, mysql 3.23.xx


wenn es grad kracht, ich den sql und den apache server neu starte, und danach einen mysql ver mache, gibt es kurzzeitig rd. 100 - 120 anfragen pro sekunde. heute mittag waren es sensationelle 160 anfragen pro sekunde. pendelte sich nach 30 minuten bei 85 anfragen pro sekunde ein.

hier mal ein ver nach 4 stunden laufzeit:


Server version 3.23.44-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 4 hours 34 min 17 sec

Threads: 3 Questions: 968401 Slow queries: 9 Opens: 113947 Flush tables: 1 Open tables: 128 Queries per second avg: 58.844
www:~ #


mir ist übrigens eingefallen, dass super oft die threads nicht beendet werden und dann immer wieder schlafende sql threads die prozesse hochtreiben, starte daher den apache nun 2x die stunde neu, aber eine goldene lösung ist das nun nicht wirklich.


so schaut meine my.cnf aus :

### The MySQL server
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
set-variable = key_buffer=128M #erhöht von 64M
set-variable = max_allowed_packet=1M
set-variable = table_cache=128
set-variable = sort_buffer=2M
set-variable = net_buffer_length=16K
set-variable = myisam_sort_buffer_size=64M
set-variable = max_connections=350

### log einstellungen
# log-bin
#loggt langsame queries
log-slow-queries
#legt die long querie log zeit fest
set-variable = long_query_time=15


# Ist OFF, wenn mysqld externes Sperren benutzt:
skip-locking

# Der Wert der --server-id-Option
server-id = 1

[mysqldump]
quick
set-variable = max_allowed_packet=16M

[mysql]
no-auto-rehash

[isamchk]
set-variable = key_buffer=128M
set-variable = sort_buffer=128M
set-variable = read_buffer=2M
set-variable = write_buffer=2M

[myisamchk]
set-variable = key_buffer=128M
set-variable = sort_buffer=128M
set-variable = read_buffer=2M
set-variable = write_buffer=2M

[mysqlhotcopy]
interactive-timeout

[safe_mysqld]
open-files-limit=8192



und so die wichtigsten parameter vom Indianer:

Timeout 60
KeepAlive on
MaxKeepAliveRequests 50
KeepAliveTimeout 25
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 384
MaxRequestsPerChild 0



und hier mal die letzten 9 slow queries :

/usr/sbin/mysqld, Version: 3.23.44-log, started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 040604 17:52:42
# User@Host: web5[web5] @ localhost []
# Query_time: 24 Lock_time: 0 Rows_sent: 1 Rows_examined: 87704
use usr_web5_1;
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:49:51
# User@Host: web5[web5] @ localhost []
# Query_time: 32 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:50:07
# User@Host: web5[web5] @ localhost []
# Query_time: 36 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:52:34
# User@Host: web5[web5] @ localhost []
# Query_time: 19 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:54:12
# User@Host: web5[web5] @ localhost []
# Query_time: 23 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:54:49
# User@Host: web5[web5] @ localhost []
# Query_time: 29 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:56:05
# User@Host: web5[web5] @ localhost []
# Query_time: 20 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:57:22
# User@Host: web5[web5] @ localhost []
# Query_time: 42 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';
# Time: 040604 18:58:57
# User@Host: web5[web5] @ localhost []
# Query_time: 32 Lock_time: 0 Rows_sent: 1 Rows_examined: 87707
SELECT count(postid) AS count FROM post WHERE dateline>='1086300000';


ich wollte gerade schreiben, dass es zufall ist, dass immer das web5 hier drin steht, aber ... heute gab es mehrmals am tag probleme (3 oder 4 mal) und wenn ich das gesamte log ansehe, ist immer der gleiche eintrag, wie die obigen 9 einträge, zu finden. kann mir einer btw. sagen, was genau dahinter steckt? hier wird doch ein counter geuppt, oder? ich habe (als einziger admin des web 5) aber heute nichts geuppt...



wie gesagt, es wäre super, wenn einer von euch mir bei den richtigen einstellungen des apache und mysql servers helfen könnte.

ach ja, die foren sind allesamt 2.2.x - 2.3.0.

vielen dank!
tom

s.molinari
06.06.2004, 15:55
Hi Tom,

Sorry, aber kannst du bitte deine hier im Forum registrierte E-Mail-Adresse hier (http://www.vbulletin-germany.com/members/forums.php) eintragen?
Danke.

Scott

awm tom
06.06.2004, 16:32
mit meinen zugangsdaten komme ich aber dort nicht rein. ich habe die hier registrierte adresse doch schon bereits dort : http://www.vbulletin.com/members/membersupport_priority.php eingetragen.

habe meine lizenz seinerzeit bei .com gekauft.



das serverproblem ist übrigens zum glück heute noch nicht aufgetreten. wird sicher am traffic liegen. morgen wirds dann wieder losgehen, freitags und montags ist der traffic am höchsten. ... wäre echt super, wenn jemand helfen könnte.

ach ja, auf mysql 4.x umsteigen würde sicher helfen, aber das geht aus verschiedenen gründen noch nicht. also bleibt mir derzeit nur, das zu optimieren, was da ist :-)


sonntägliche grüsse
tom

Odysseus
06.06.2004, 18:19
Ohne dem Update auf MySQL 4 wirst du das Problem keinesfalls lösen können.
Im vBulletin.com Forum kann dir aber vielleicht eva2000 weiterhelfen. Der wird dir aber in bezug auf MySQL 4 dasselbe sagen ...

Holger
09.06.2004, 22:43
Ohne dem Update auf MySQL 4 wirst du das Problem keinesfalls lösen können.
..
auch mit einer 4er version wird sich das nicht lösen
ich kenne diese probleme nur zu gut und es ist nicht so einfach das in den griff zu bekommen
ich habe mich an meinem server auch schon tot optimiert
irgendwann is einfach ende

das haupt problem ist hier mit sicherheit als erstes die festplatte
ich würde mal sagen der server hat nur 1 platte und das noch ide!
oder wenn er 2 hat ist sql nicht von apache getrennt (die server sterben an platten io)

ich könnte hier 2 seiten schreiben was mann alles machen kann und sollte was sinn bringt aber das ist in erster linie hardware abhängig

was ich auch mal los werden muss ist das es mit sicherheit hier einige leute gibt die einem bei solch einem prob helfen könnten
aber jeder macht da ein staatsgeheimniss draus (kommt mir mal so vor)

mfg
Holger

Odysseus
15.06.2004, 11:45
Also, schauen wir uns das einmal genauer an:

Du hast benutzt MySQL 3.23, hast keine Tiemouts definiert, der Server hat vermutlich) eine einzelne IDE Platte, 2 GB RAM und in Spitzenzeiten sind gut und gerne 400 User in allen vB2 Foren.

Es gibt drei Bereiche, bei denen tu tunen kannst und solltest: MySQL server, Hardware, vBulletin

MySQL Server
Egal welche Gründe du hast, um bei MySQL 3 bleiben zu wollen - beseitige sie. :) MySQL ist durch den Query Cache aus der 4er Version um den Faktor 3 zu beschleunigen, wenn man alles richtig macht.
Richte in der my.cnf ein connection_timeout von 30 Sekunden und ein interactive_wait_timeout von maximal 180 Sekunden ein. 10 / 100 Sekunden wären auch einen Versuch wert.
Sobald du MySQL 4.0.20 installiert hast, aktiviere den Query Cache und gib ihm 128 MB oder sogar 256 MB Größe.

Hardware
Dein Flaschenhals ist zweifelsohne die Festplatte und sonst nichts, zumal der RAM ja sehr großzügig bemessen ist. Die Datenbank erzeugt immens viele Festplattenoperationen, aber gleichzeitig muss ja auch noch das Betriebssystem laufen, der Apache HTML/PHP-Quellen einlesen und der Log Demon die Logfiles schreiben.
Der einzig sinnvolle Hardware-Ausbau (abgesehen von SCSI-Geräten) wäre also eine zusätzliche Festplatte, auf der dann ausschließlich die Datenbank-Speicherung geschieht. Dazu muss das Verzeichnis /var/lib/mysql per SymLink auf die zweite Platte umleiten.
RAID-0 bringt denke ich nichts; eine WD Raptor IDE-Festplatte mit 10.000 upm sollte hier ganz gute Dienste leisten. Gibt es für ca. 190€ mit 75 GB.

vBulletin
Rüste alle Foren (oder zumindest die größeren) auf vB3 auf. Die neue Version geht sehr viel Ressourcensparender um.
Falls das einfach nicht geht, dann gibt es zwei Maßnahmen, um einem lahmen vB2 Dampf unterm Hintern zu machen:

1) Installier den "deferred thread views" Hack von vBulletin.org, oder bau die komplette Funktionalität zum loggen der Thread Views aus. Diese Counter sind eigentlich total belanglos, verursachen aber sehr leicht Deadlocks, welche die Datenbank sperren und die Festplatte außerordentlich stark belasten.

2) Deaktiviere die Attachment-Funktion. vB2 speichert die Dateianhänge unsinnigerweise in der Datenbank, anstatt im Dateisystem. Dadurch entsteht ein immenser Verwaltungs-Overhead, der die Datenbank ausbremst. In vB3 kann man die Anhänge auch als normale Dateien speichern, was auf jeden Fall effezienter ist.


Kümmere dich um diese drei Punkte und der Server wird mit seinen aktuellen Aufgaben spielend fertig werden.
Für weiteres Wachstum jenseits der 400 gleichzeitigen User bei einem 900-Sekunden-Timeout wirst du aber um einen Dual Xeon oder Opteron mit SCSI Platten keinesfalls herumkommen.





PS: Thema "lizensiertes Auftreten" - Da man als normaler Benutzer nicht sehen kann, ob jemand lizensiert ist oder nicht, scheue ich mich auch nicht, hier jedem zu helfen, der danach fragt, sofern ich die Antwort weiß. Bei Woltlab kann man auch als normaler Benutzer sehen, ob jemand eine gültige wbb2 Lizenz hat. Vieleicht wäre das hier mal eine Maßnahme. :)

Chriss
16.06.2004, 13:21
Hallo @awm tom!

Aus Erfahrung sprechend kann ich mich nur @Odysseus anschliessen: Update auf MySQL 4 ist dringend anzuraten!

Ich habe einen im Vergleich sehr schwachen Server (1 GHZ, 256 MB RAM), habe aber auch nur ein Forum darauf laufen mit max. ca. 100 Besuchern gleichzeitig online und im Schnitt ca. 50 Besuchern.

Auch ich bekam ständig "too many connections" und das Forum lief insgesamt sehr langsam. Nach Update von MySQL 3 auf 4 lief das Forum plötzlich vergleichsweise rasend schnell! Das Problem der "too many connections" war aber noch nicht ganz vom Tisch. Dazu musste noch die my.cnf angepasst werden.

Auf den ersten Blick auf Deine my.cnf mein Tipp:
set-variable = max_connections=350

ändern in

set-variable = max_connections=1000

Dann sollte es ggf. auch schon unter MySQL 3 funktionieren. Mit 1000 Verbindungen sollte Deine Hardware spielend zurecht kommen. Mein schwacher Server kommt jedenfalls mit 500 ganz gut klar, auch wenn es schon mal etwas langsam wird.

Gruß,
Chriss

Odysseus
16.06.2004, 15:10
Wenn die Datenbank erst mal alle Anfragen bewältigt und in keine Deadlocks und Timeouts mehr rennt, wären 350 sogar noch überdimensioniert.
Ich halte einen zu großen wert hier für keine gute Idee.

Chriss
16.06.2004, 16:11
Wenn die Datenbank erst mal alle Anfragen bewältigt und in keine Deadlocks und Timeouts mehr rennt, wären 350 sogar noch überdimensioniert.
Ich halte einen zu großen wert hier für keine gute Idee.

Du magst Recht haben. Bei meinem überforderten Server ist es so: niedriger Wert (100): Forum sehr schnell, aber es kommt häufig die Meldung "too many connections"; hoher Wert (500): Form läuft insgesamt langsamer, aber keine DB-Fehler mehr.

Gruß,
Chriss