Bei der Relay-Suche zeigen wir einen gelben Punkt neben dem Relay-Spitznamen an, wenn dieser überlastet ist. Dies bedeutet, dass eine oder mehrere der folgenden Lastkennzahlen ausgelöst wurden:

Wenn ein Relay einen überlasteten Zustand erreicht, zeigen wir dies 72 Stunden lang an, nachdem sich das Relay erholt hat.

Wenn du feststellst, dass dein Relay überlastet ist, bitte:

  1. Überprüfe https://status.torproject.org/ auf alle bekannten Probleme in der Kategorie "Tor-Netzwerk".

  2. Erwäge Tuning sysctl für dein System für Netzwerk, Speicher und CPU-Last.

  3. Ziehe in Erwägung, MetricsPort zu aktivieren, um zu verstehen, was vor sich geht.

sysctl für dein System auf Netzwerk-, Speicher- und CPU-Last einstellen

TCP Port-Ausschöpfung

Wenn die TCP-Ports ausgeschöpft sind, solltest du deinen lokalen Portbereich erweitern Das kannst du tun mit

# sysctl -w net.ipv4.ip_local_port_range="15000 64000"

oder

# echo 15000 64000 > /proc/sys/net/ipv4/ip_local_port_range

Denk dran, dass die Einstellung von sysctl wie beschrieben nicht dauerhaft ist und bei einem Neustart verloren geht. Du musst die Konfiguration zu /etc/sysctl.conf oder zu einer Datei in /etc/sysctl.d/ hinzufügen, um sie dauerhaft zu machen.

MetricsPort

Um das Wohlergehen der Tor-Relays und des Tor-Netzwerks zu verstehen, ist es wichtig, Metriken der Relays bereitzustellen und Zugriff darauf zu haben. Relay-Überlastungsinformationen wurden seit 0.4.6+ zu den Deskriptoren hinzugefügt, aber erst ab Tor >= 0.4.7.1-alpha war eine Schnittstelle zu den zugrundeliegenden Relay-Metriken verfügbar: der Metrik-Port.

Aktivieren von MetricsPort

Tor bietet den Zugang zum Metrics-Port über eine torrc-Konfigurationsoption namens MetricsPort.

Es ist wichtig zu verstehen, dass die Veröffentlichung des Tor MetricsPort für die Nutzer des Tor-Netzwerks gefährlich ist, weshalb dieser Port nicht standardmäßig aktiviert ist und sein Zugriff durch eine Zugriffsrichtlinie geregelt werden muss. Bitte sei besonders vorsichtig, wenn du diesen Port öffnest, und schließe ihn, wenn du mit der Fehlersuche fertig bist.

Nehmen wir an, du bist der einzige Benutzer auf einem Server, der ein Tor-Relay betreibt. Du kannst den Metrics-Port aktivieren, indem du dies in deine torrc-Datei einträgst:

MetricsPort 127.0.0.1:9035
MetricsPortPolicy accept 127.0.0.1

Und dann kannst du die Metriken leicht abrufen mit:

# curl http://127.0.0.1:9035/metrics

welche standardmäßig in einem Prometheus-Format vorliegen.

Hinweis: jeder Benutzer auf diesem Server kann auf diese Relay-Metriken im obigen Beispiel zugreifen. Lege generell eine sehr strenge Zugriffsrichtlinie mit MetricsPortPolicy fest und erwäge die Verwendung der Firewall-Funktionen deines Betriebssystems für eine umfassende Verteidigung.

Für eine detailliertere Erklärung von MetricsPort und MetricsPortPolicy siehe die man page von Tor.

MetricsPort Ausgabe

Hier ist ein Beispiel für die Ausgabe, die das Aktivieren von MetricsPort erzeugen wird:

# HELP tor_relay_load_onionskins_total Total number of onionskins handled
# TYPE tor_relay_load_onionskins_total counter
tor_relay_load_onionskins_total{type="tap",action="processed"} 0
tor_relay_load_onionskins_total{type="tap",action="dropped"} 0
tor_relay_load_onionskins_total{type="fast",action="processed"} 0
tor_relay_load_onionskins_total{type="fast",action="dropped"} 0
tor_relay_load_onionskins_total{type="ntor",action="processed"} 0
tor_relay_load_onionskins_total{type="ntor",action="dropped"} 0
# HELP tor_relay_exit_dns_query_total Total number of DNS queries done by this relay
# TYPE tor_relay_exit_dns_query_total counter
tor_relay_exit_dns_query_total{record="A"} 0
tor_relay_exit_dns_query_total{record="PTR"} 0
tor_relay_exit_dns_query_total{record="AAAA"} 0
# HELP tor_relay_exit_dns_error_total Total number of DNS errors encountered by this relay
# TYPE tor_relay_exit_dns_error_total counter
tor_relay_exit_dns_error_total{record="A",reason="success"} 0
tor_relay_exit_dns_error_total{record="A",reason="format"} 0
tor_relay_exit_dns_error_total{record="A",reason="serverfailed"} 0
tor_relay_exit_dns_error_total{record="A",reason="notexist"} 0
tor_relay_exit_dns_error_total{record="A",reason="notimpl"} 0
tor_relay_exit_dns_error_total{record="A",reason="refused"} 0
tor_relay_exit_dns_error_total{record="A",reason="truncated"} 0
tor_relay_exit_dns_error_total{record="A",reason="unknown"} 0
tor_relay_exit_dns_error_total{record="A",reason="tor_timeout"} 0
tor_relay_exit_dns_error_total{record="A",reason="shutdown"} 0
tor_relay_exit_dns_error_total{record="A",reason="cancel"} 0
tor_relay_exit_dns_error_total{record="A",reason="nodata"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="success"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="format"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="serverfailed"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="notexist"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="notimpl"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="refused"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="truncated"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="unknown"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="tor_timeout"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="shutdown"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="cancel"} 0
tor_relay_exit_dns_error_total{record="PTR",reason="nodata"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="success"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="format"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="serverfailed"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="notexist"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="notimpl"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="refused"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="truncated"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="unknown"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="tor_timeout"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="shutdown"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="cancel"} 0
tor_relay_exit_dns_error_total{record="AAAA",reason="nodata"} 0
# HELP tor_relay_load_tcp_exhaustion_total Total number of times we ran out of TCP ports
# TYPE tor_relay_load_tcp_exhaustion_total counter
tor_relay_load_tcp_exhaustion_total 0
# HELP tor_relay_load_socket_total Total number of sockets
# TYPE tor_relay_load_socket_total gauge
tor_relay_load_socket_total{state="opened"} 135
tor_relay_load_socket_total 1048544
# HELP tor_relay_load_oom_bytes_total Total number of bytes the OOM has freed by subsystem
# TYPE tor_relay_load_oom_bytes_total counter
tor_relay_load_oom_bytes_total{subsys="cell"} 0
tor_relay_load_oom_bytes_total{subsys="dns"} 0
tor_relay_load_oom_bytes_total{subsys="geoip"} 0
tor_relay_load_oom_bytes_total{subsys="hsdir"} 0
# HELP tor_relay_load_global_rate_limit_reached_total Total number of global connection bucket limit reached
# TYPE tor_relay_load_global_rate_limit_reached_total counter
tor_relay_load_global_rate_limit_reached_total{side="read"} 0
tor_relay_load_global_rate_limit_reached_total{side="write"} 0

Lass uns herausfinden, was einige dieser Zeilen tatsächlich bedeuten:

tor_relay_load_onionskins_total{type="ntor",action="dropped"} 0

Wenn ein Relay anfängt "dropped" zu sehen, handelt es sich in der Regel um ein CPU/RAM-Problem.

Tor ist leider single threaded außer wenn die "onion skins" verarbeitet werden. Die "Onion Skins" sind die kryptographischen Arbeiten, die an den berühmten "Onion Layers" in jedem Kanal durchgeführt werden müssen.

Wenn Tor die Layers verarbeitet, verwenden wir einen Thread-Pool und lagern die gesamte Arbeit an diesen Pool aus. Es kann vorkommen, dass dieser Pool aufgrund von Speicher- oder CPU-Last die Arbeit einstellt, was zu einem Überlastungszustand führt.

Wenn dein Server ausgelastet ist, wird dies wahrscheinlich ausgelöst.

tor_relay_exit_dns_error_total{...}

Jeder Zähler im Bereich "*_dns_error_total" weist auf ein mögliches DNS-Problem hin. Während des 0.4.7-Release-Zyklus haben wir jedoch festgestellt, dass DNS-Fehler viel zu verrauscht sind und zu viele falsch-positive Meldungen enthalten, um für Überlastungsberichte nützlich zu sein. Daher verwenden wir sie ab 0.4.6.9 und 0.4.7.4-alpha nicht mehr für diesen Zweck. Wir behalten jedoch die DNS-Metriken bei, um den Relay-Betreibern einen Einblick in die Vorgänge bei ihrem Relay zu geben.

DNS-Zeitüberschreitungen -Fehler betreffen nur Exit-Knoten.

tor_relay_load_oom_bytes_total{...}

Eine Out-Of-Memory-Meldung weist auf ein RAM-Problem hin. Möglicherweise benötigt das Relay mehr RAM oder es treten Speicherverluste auf. Wenn du feststellst, dass der Tor-Prozess Speicherverluste hat, melde das Problem bitte entweder über Tor gitLab oder schicke eine E-Mail an die Tor-Relays Mailingliste.

Tor hat einen eigenen OOM-Handler, der aufgerufen wird, wenn 75% des Speichers, den Tor für verfügbar hält, erreicht sind. Angenommen, Tor denkt, dass es insgesamt 2 GB nutzen kann, dann wird es bei 1,5 GB Speicherverbrauch anfangen, Speicher zu räumen. Dies wird als Überlastungszustand angesehen.

Um die Menge des verfügbaren Speichers abzuschätzen, verwendet Tor beim Start MaxMemInQueues oder, falls es nicht eingestellt ist, den gesamten verfügbaren Arbeitsspeicher des Systems und wendet diesen Algorithmus an:

    if RAM >= 8GB {
      memory = RAM * 40%
    } else {
      memory = RAM * 75%
    }
    /* Capped. */
    memory = min(memory, 8GB) -> [8GB on 64bit and 2GB on 32bit)
    /* Minimum value. */
    memory = max(250MB, memory)

Um einen überlasteten Zustand zu vermeiden, empfehlen wir, ein Relay mit mehr als 2GB RAM auf 64bit zu betreiben. 4 GB werden empfohlen, obwohl es natürlich nicht schadet, noch mehr RAM hinzuzufügen, wenn du kannst.

Man könnte meinen, dass Tor vom OS OOM-Handler selbst aufgerufen werden könnte. Da Tor beim Start den gesamten Arbeitsspeicher des Systems beansprucht, verbraucht es zu viel Arbeitsspeicher, wenn auf dem Gesamtsystem viele andere Anwendungen laufen, die den Arbeitsspeicher nutzen. In diesem Fall könnte das Betriebssystem Tor OOM, sogar ohne dass Tor Speicherlast bemerken würde.

tor_relay_load_socket_total

Diese Zeilen zeigen an, dass das Relay keine Sockets mehr hat. Die Lösung ist, ulimit -n für den Tor-Prozess zu erhöhen.

tor_relay_load_tcp_exhaustion_total

Diese Zeilen zeigen an, dass das Relay keine TCP-Ports mehr hat.

Versuche sysctl wie oben beschrieben einzustellen.

tor_relay_load_global_rate_limit_reached_total

Wenn dieser Zähler über einen kurzen Zeitraum um einen merklichen Wert ansteigt, ist das Relay überlastet. Es wird wahrscheinlich von einem großen Onion-Dienst als Schutz verwendet oder für ein laufendes DDoS im Netzwerk.

Wenn dein Relay immer noch überlastet ist und du nicht weißt, warum, wende dich bitte an network-report@torproject.org. Du kannst deine E-Mail mit Network-Report OpenPGP Schlüssel verschlüsseln.