Wie lautet die Formel, um zu bestimmen, wie viel Speicher ein Socket unter Linux verbraucht?

11

Ich mache eine Kapazitätsplanung und habe mich gefragt, ob es eine Formel gibt, mit der ich (vom Standpunkt des Speichers aus) vorhersagen kann, wie viele TCP-Verbindungen ich auf meinem Server verarbeiten kann. Im Moment mache ich mir nur Sorgen um den Speicherbedarf.

Einige Variablen, von denen ich denke, dass sie in der Formel angezeigt werden, sind:

  • sysctl's net.ipv4.tcp_wmem(min oder Standardwert)
  • sysctl's net.ipv4.tcp_rmem(min oder Standardwert)
  • die Größe der Datenstrukturen sock, sock_common, proto und anderer Datenstrukturen pro Socket.

Ich bin nicht sicher, wie viel von tcp_wmem und tcp_rmem tatsächlich zugewiesen ist und wann dieser Speicher zugewiesen wird. Zur Zeit der Socket-Erstellung? Auf Nachfrage?

Tim Stewart
quelle

Antworten:

2

Wenn Sie den Quellcode ändern können, verwenden Sie Rusus-Daten, um das RSS zu messen und aufzuzeichnen, wie viele TCP-Verbindungen zum Zeitpunkt der Messung im Spiel sind.

Wenn der Quellcode nicht geändert werden kann, verwenden Sie das RSS der Netzwerk-App, wie von top oder ps gemeldet, und ermitteln Sie die Anzahl der Netzwerkverbindungen zum Zeitpunkt der Messung von lsof -i.

Sammeln Sie diese Daten jede Minute, während sich Ihre Anwendung durch die Spitzenlast bewegt, und aus diesen Daten können Sie eine Formel erstellen, die die Anzahl der Verbindungen mit der RAM-Nutzung in Beziehung setzt.

Natürlich gibt es noch viel mehr Dinge, die Sie messen können, insbesondere möchten Sie möglicherweise die RAM-Auslastung des Kernels messen, obwohl TCP-Datenstrukturen im Voraus vorhersehbar und berechenbar sein sollten. In jedem Fall werfen Sie einen Blick auf diese Frage /server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server, um weitere Informationen zur TCP-Optimierung und zu erhalten So erhalten Sie eine klare Übersicht über die Vorgänge im Netzwerkstapel.

Michael Dillon
quelle
Vielen Dank, dass Sie die Messung betont und mich auf Links verwiesen haben, die zeigen, wie diese Metriken erfasst werden!
Tim Stewart
8

tcp_mem ist wichtiger, da es definiert, wie sich der TCP-Stack bei der Speichernutzung verhalten soll. Der IMO-Sende- und Empfangspuffer sollte ein Vielfaches von tcp_mem sein. Hier ist ein Link zu einer Formel für den Empfangspuffer: http://www.acc.umu.se/~maswan/linux-netperf.txt . Zusamenfassend:

Der Overhead ist: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale Standard ist 2) Also für Linux-Standardparameter für das Empfangsfenster (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536. Bei einer transatlantischen Verbindung (150 ms RTT), Die maximale Leistung liegt bei: 65536 / 0.150 = 436906 Bytes / s oder ungefähr 400 kbyte / s, was heute sehr langsam ist. Mit der erhöhten Standardgröße: (873800 - 873800/2 ^ 2) /0.150 = 4369000 Bytes / s oder ungefähr 4Mbytes / s, was für ein modernes Netzwerk vernünftig ist. Beachten Sie, dass dies die Standardeinstellung ist. Wenn der Absender mit einem größeren Fenster konfiguriert ist, lässt er sich problemlos auf das Zehnfache skalieren (8738000 * 0,75 / 0,150 = ~ 40 MB / s), was für ein modernes Netzwerk ziemlich gut ist.

Folgendes sagt der Artikel über tcp_mem:

Was Sie entfernen, ist eine künstliche Begrenzung der TCP-Leistung. Ohne diese Begrenzung sind Sie an die verfügbare End-to-End-Bandbreite und den Verlust gebunden. Sie könnten also Ihren Uplink effektiver sättigen, aber tcp ist gut darin, damit umzugehen.

IMO beschleunigt ein größerer mittlerer tcp_mem-Wert die Verbindung bei geringerem Sicherheitsverlust und erhöht die Speichernutzung geringfügig.

Sie können den Netzwerkstapel überwachen mit:

grep skbuff /proc/slabinfo
Gigamegs
quelle
1
Vielen Dank für die informative Antwort. Es zeigt, wie viel ich über das Networking lernen muss.
Tim Stewart
1

David hat eine sehr gute Antwort auf die gestellte Frage gegeben. Wenn Sie jedoch nicht ausschließlich LFNs verwenden, sind die TCP-Puffer selbst auf einem ereignisbasierten Server wahrscheinlich nur ein kleiner Teil des Footprints pro Verbindung.

Für die Kapazitätsplanung gibt es keinen Ersatz dafür, den Server zu testen und die Regression der Speichernutzung nach Last zu berechnen.

symcbean
quelle
Danke, es ist großartig, wenn eine einfache Formel ausreicht, aber es gibt Zeiten, in denen Sie nur messen müssen.
Tim Stewart