Thomas Barth <
txb...@web.de> wrote:
>
> Gerade habe ich gesehen, dass zwei Replikatoren eines Kunden von mir 62
> aktive Verbindungen hielten, dadurch kamen �ber 5600 TCP-Verbindungen
> zustande.
Glaube ich nicht. Zeigen!
Au�erdem: was sind "Replikatoren"? MySQL-Replikation offensichtlich
nicht, denn da hat ein Slave genau eine Verbindung zum Master.
> Warum wird in jedem LISTEN-Node (also mit eigener PID) jede
> genehmigte Verbindung wiederholt mit dem selben Zielport?
Was nennst du "LISTEN-Node"?
Ein Socket im Status LISTEN ist nicht verbunden. Das ist ein Endpunkt,
der eine neue Verbindung akzeptiert.
Allerdings haben alle Verbindungen, die vom Client initiiert werden
(bei MySQL immer) zwangsweise alle die gleiche Portnummer und meist
auch die gleiche IP-Adresse am serverseitigen Ende. Und es gibt immer
auch einen Endpunkt mit dieser Adresse+Portnummer im LISTEN Modus.
Technisch sind alle diese Endpunkte Sockets (vergleichbar Filehandles)
- und sie sind vollkommen unabh�ngig voneinander.
Eine Verbindung hat man erst durch die Angabe des anderen Endpunkts
(auf der Client-Seite). [server:3306 - client:50000] w�re z.B. eine
TCP-Verbindung. [client:50000 - server:3306] ist die gleiche
Verbindung, nur in der Gegenrichtung. Es gibt bei TCP *immer* beide
Richtungen, zumindest wenn die Verbindung erstmal aufgebaut ist.
Deswegen sind beide Varianten gleichwertig und meinen die gleiche
Verbindung. Typischerweise zeigen die Tools immer das lokale Ende
als erstes. Z.B. netstat w�rde die gleiche Verbindung auf dem Server
genau anders herum anzeigen als auf dem Client.
Es kann schon rein technisch keine zweite TCP-Verbindung geben, die
auch [server:3306 - client:50000] oder [client:50000 - server:3306]
hei�t. Bzw. wenn das Tupel ein weiteres Mal auftaucht - z.B. in der
Ausgabe von lsof - dann meint es die *gleiche* Verbindung.
> Fakt ist, dass ich bei SSH-Verbindungen immer nur zwei
> TCP-Verbindungen sehe mit zwei unterschiedlichen Zielports. DAS finde
> ich noch verst�ndlich!
Ich verstehe nicht, was du meinst. *Ich* sehe in der Ausgabe von lsof
die *gleiche* SSH Verbindung zweimal:
zeta2:~# netstat -at | grep ssh
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 zeta2.xl.local:ssh beta.xl.local:53450 ESTABLISHED
tcp6 0 0 [::]:ssh [::]:* LISTEN
Das ist genau eine Verbindung. Plus zwei Sockets (einer IPv4,
einer IPv6), die weitere Verbindungen akzeptieren.
zeta2:~# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 3566 root 3u IPv6 5832 TCP *:ssh (LISTEN)
sshd 3566 root 4u IPv4 5834 TCP *:ssh (LISTEN)
sshd 9717 root 3u IPv4 11707115 TCP zeta2.xl.local:ssh->beta.xl.local:53450 (ESTABLISHED)
sshd 9719 schwenke 3u IPv4 11707115 TCP zeta2.xl.local:ssh->beta.xl.local:53450 (ESTABLISHED)
Beta ist meine Workstation, von der aus ich die SSH-Verbindung zu
Zeta2 (meinem Server) aufgebaut habe. Der Socket wird serverseitig
von zwei(!) sshd Prozessen aufgehalten. Einer (9717) l�uft als root.
Das ist der sshd Proze�, der die neu aufgemachte Verbindung vom sshd
Master (3566) bekommen hat. Aus Sicherheitsg�nden (Privilege Separation)
forkt der ein Kind (9719) das dann meine user-id annimmt:
zeta2:~# ps -fax
PID TTY STAT TIME COMMAND
...
3566 ? Ss 0:28 /usr/sbin/sshd
9917 ? Ss 0:00 \_ sshd: schwenke [priv]
9919 ? S 0:00 \_ sshd: schwenke@pts/2
9920 pts/2 Ss 0:00 \_ -bash
...
lsof kann also Verbindungen mehrfach anzeigen, aber nur dann, wenn
sie von mehreren Prozessen gleichzeitig offen gehalten werden.
Bei MySQL kann das aber nicht passieren. Denn der MySQL-Server ist
genau 1 (ein) Proze�.
Mein Fazit: was immer du siehst, sind *nicht* 5600 TCP-Verbindungen
f�r 62 offene MySQL-Verbindungen.
XL
PS: <seufz> im n�chsten Leben werde ich dann wohl doch Professor
und halte Vorlesungen "UNIX und Netzwerke"
PPS: kanonische Leseempfehlung:
W. Richard Stevens: "Unix Network Programming"