Gibt es angesichts des Inodes eines Linux-TCP-Sockets (erhalten über /proc/<pid>/fd
) eine schnellere Möglichkeit, die Informationen nachzuschlagen, die ich /proc/net/tcp
über diesen Socket erhalten kann?
Ich habe ein Tool zur Fehlerbehebung geschrieben, das Prozesse überwacht und Echtzeitinformationen zu E / A-Vorgängen druckt (Informationen vom strace
Typ Typ, die in übergeordneten Abstraktionen gesammelt und weniger grob dargestellt werden), aber auf einem stark ausgelasteten Netzwerkserver stelle ich fest, dass die Zeit dafür benötigt wird Das Nachschlagen von Socket-Informationen (z. B. die fremde Adresse / der fremde Port) ist einfach aufgrund der sehr großen Größe von /proc/net/tcp
(ca. 2 MB auf dem Server, den ich gerade betrachte) unerschwinglich .
Ich kann dies etwas mit Caching verwalten, aber dies führt zwangsläufig zu Latenz und lässt mich über die Absurdität einer "API" nachdenken, die das Lesen und Parsen von ASCII-Text im Wert von 2 MB erfordert, um Informationen zu einem Socket zu finden.
quelle
iptstate
, das ähnliche Bedürfnisse hat. Sie könnten sich ansehen, wie dieses Programm es macht. Ich glaube nicht, dass es verwendet/proc/net/tcp
.Antworten:
Hier ist ein Link zu libnetfilter_conntrack . Sie müssten Ihr Programm in einer Sprache neu schreiben, die das direkte Aufrufen von C-Funktionen aus einer Bibliothek unterstützt. Aber ich denke, diese Bibliothek wird die Hooks haben, die Sie benötigen, um die gewünschten Daten viel schneller zu erhalten als das Parsen durch diese Textdatei.
Dies ist, was das
iptstate
Programm verwendet, um seine Aufgabe zu erfüllen.quelle
Netlink. Schauen Sie sich den
ss
Befehl aus deriproute2
Sammlung an.Hier ist die Codebasis für
iproute2
undss
wird hier beschrieben .quelle