Gibt es eine schnellere Schnittstelle für Informationen aus / proc / net / tcp?

7

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 straceTyp 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.

ntnt
quelle
Ich glaube, dass dies für StackOverflow besser geeignet ist, obwohl es sehr Linux-spezifisch ist. Wie auch immer, es gibt ein schönes Programm namens 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.
Omnifarious

Antworten:

3

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 iptstateProgramm verwendet, um seine Aufgabe zu erfüllen.

Allgegenwärtig
quelle
1
Vielen Dank. Ich werde es überprüfen, obwohl auf den ersten Blick die Schnittstelle zu dieser Bibliothek in keiner Weise klar ist und die Dokumentation im Wesentlichen aus einer Handvoll kryptischer Beispielprogramme besteht, die nicht einmal angeben, was sie tun, und sich auf ein Verständnis von verlassen libmnl, was selbst nicht zu klar ist. Ich bezweifle nicht, dass die Funktionalität, die ich suche, hier ist, aber bis jetzt ist es ein bisschen wie ein Loch.
ntnt
1
@ntnt: seufze ich nicht auf der Qualität aussehen , bevor ich Sie darauf hingewiesen. Ich weiß, dass es Informationen über alle aktuell verfolgten Verbindungen gibt, also müssen Ihre irgendwo drin sein. Aber ja, ich weiß nicht, dass es Ihnen Informationen geben wird, die auf einer Socket-ID jeglicher Art basieren. :-(
Omnifarious
1
Beachten Sie, dass es sich um den Netfilter-Verbindungs-Tracker handelt, der wenig mit den Kernel-Sockets zu tun hat.
Stéphane Chazelas
@ StéphaneChazelas - Ja ... es ist komisch für mich, wie netlink mit netfilter nichts anfangen kann. netfilter selbst ist eine seltsame Schnittstelle, die die Systemaufrufe von [sg] etsockopt garbage pail verwendet. Ich musste für einige Arbeiten, die ich kürzlich durchgeführt habe, viel mehr darüber lernen. Ich vermute, Netlink ist eine viel bessere Wahl für die Informationen, die das OP wollte.
Omnifarious
3

Netlink. Schauen Sie sich den ssBefehl aus der iproute2Sammlung an.

Hier ist die Codebasis für iproute2und sswird hier beschrieben .

Esa Turtiainen
quelle