Frage

Setup Redis und Nussknacker auf CENTOS 6.4.und versuchen, mit dem servicestack.redis-Client herzustellen.Grundlegende Leistungsausgabe gefunden.

Zum Testen nur noch 1 Redis-Instanz

generasacodicetagpre.

In der folgenden Einheitstest versuche ich, 100k Saiten über Nussknacker in Redis zu senden.

generasacodicetagpre.

In den ersten Läufen, nachdem Nussknacker neu gestartet, arbeitet Addrangetolist mit 1-2 Sekunden.Mit nachfolgenden Läufen sinkt die Addrangetolist-Leistung jedoch deutlich von wenigen Minuten, sogar mehr als 20 Minuten (falls kein Timeout konfiguriert).Ich kann nicht gleich reproduzieren, wenn Sie Redis direkt verwenden.Ich habe noch keinen anderen Kunden ausprobiert.Irgendwelche Ideen warum?

Dies, was ich in der Konsole nach dem Testlauf in der Konsole sehe:

generasacodicetagpre.

War es hilfreich?

Lösung

Wenn der Nussknacker mehrere Zehntausende von Verbindungen aufläuft oder Multi-Get-Anforderung mit mehreren Tausenden von Tasten sendet, sollten Sie die MBUF-Größe von 512

verwenden.

Die folgende Verbindung spricht darüber, wie Sie die MBUF-Größe interpretieren können? - https://github.com/twitter/twemproxy/issues/141 .

Jeder Clientanschluss verbraucht mindestens ein MBUF. Um eine Anfrage zu bedienen, benötigen wir zwei Verbindungen (eines von Client zum Proxy und einem anderen von Proxy to Server). Wir brauchen also zwei MBUFs.

Eine fragmentierbare Anforderung wie 'Holen Sie sich foo bar \ r \ n', die BTW fragmentiert wird, um 'foo \ r \ n' und 'get bar \ r \ n' zwei MBUF für Anforderung und zwei MBUF für die Antwort konsumieren . So braucht eine fragmentierbare Anforderung mit n Fragmenten N * 2 Mbufts

Das Gute an MBUF ist, dass der Speicher von einem Wiederverwendungsbecken stammt. Sobald ein MBUF zugewiesen ist, wird es niemals freigegeben, sondern nur in den Resese-Pool zurückgesetzt. Die schlechte Sache ist, dass einst MBUF zugeteilt wird, es wird niemals freigegeben, da ein freier MBUF immer wieder in den Wiederverbrauchspool zurückkehrt - https://github.com/twitter/twempoxy/blob/master/src/nc_mbuf.c#l23-l24 (dies kann durch Anlegen eines Schwellenwertparameter auf dem Wiederverwendungspool)

Wenn der Nussknacker die Handhabung von 1K-Clientverbindungen und 100 Serververbindungen handelt, würde dies (max (1000, 100) * 2 * MBUF-Größe) für MBUF konsumieren. Wenn wir davon ausgehen, dass Clients nicht pipelinierte Anforderung sendet, würde dies mit der Standardgröße von MBUF-Größe von 16.000 insgesamt 32m verbrauchen.

ferner, wenn im Durchschnitt jede Anforderung 10 Fragmente aufweist, wäre der Speicherverbrauch 320m. Anstelle von 1K-Clientverbindungen können Sie sagen, dass Sie 10k behandelt haben, dann wäre der Speicherverbrauch 3,2g. Anstatt eine Standard-MBUF-Größe von 16K mit 16K zu verwenden, verwenden Sie 512 Bytes, dann würde der Speicherverbrauch für dasselbe Szenario auf 1000 * 2 * 512 * 10= 10m

fallen.

Dies ist der Grund, warum Sie für "große Zahl" der Verbindung einen kleinen Wert für MBUF-Größe wie 512

wählen möchten

Andere Tipps

sieht aus, als ob das Problem beim Übertragen dieser Datenmenge mit hoher Speicherverwendung zusammenhängt.

Standardmäßig weist Nussknacker 16K-Puffergröße für jeden Schlüssel zu.In meinem Fall wird es 16k * 100000= 1,5 GB sein.Ich sah um 2 GB-Peak, wenn ich Nussknackerprozess beobachtete.Mein CENT-OS VM wurde überlastet und es gab nicht genügend Speicher, um diese Spitze zu handhaben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top