Freigeben über


Kornplatzierung

Orleans stellt sicher, dass wenn ein Grain-Aufruf erfolgt, eine Instanz dieses Grain im Arbeitsspeicher auf einem Server im Cluster zur Bearbeitung der Anfrage verfügbar ist. Wenn das Korn derzeit nicht im Cluster aktiv ist, wählt Orleans einen Server aus, um das Korn zu aktivieren. Dieser Prozess wird als Grain Placement bezeichnet. Die Platzierung ist auch eine Möglichkeit Orleans um die Last auszugleichen: Gleichmäßig platzierte arbeitsintensive Einheiten tragen dazu bei, die Arbeitslast über den Cluster zu verteilen.

Der Platzierungsprozess in Orleans ist vollständig konfigurierbar. Wählen Sie aus standardmäßigen Platzierungsrichtlinien wie zufällig, lokal bevorzugt und lastbasiert, oder konfigurieren Sie benutzerdefinierte Logik. Dies ermöglicht volle Flexibilität bei der Entscheidung, wo Getreide entsteht. Platzieren Sie z. B. Getreide auf einem Server in der Nähe der Ressourcen, mit denen sie arbeiten müssen, oder nahe an anderen Getreiden, mit denen sie kommunizieren.

Hinweis

Orleans Ab 9.2 wurde die Standardplatzierungsstrategie von zufälliger Platzierung in ressourcenoptimierte Platzierung geändert. Dies bietet eine bessere Lastverteilung basierend auf der CPU- und Speicherauslastung über Silos. Wenn Sie das vorherige zufällige Platzierungsverhalten benötigen, konfigurieren Sie es explizit, wie unter "Konfigurieren der Standardplatzierungsstrategie" beschrieben.

Wählt standardmäßig Orleans einen zufällig kompatiblen Server aus.

Konfigurieren Sie die Platzierungsstrategie Orleans , die global oder pro Kornklasse verwendet.

Ressourcenoptimierte Platzierung (Standard)

Hinweis

Orleans Ab 9.2 ist die ressourcenoptimierte Platzierung die Standardplatzierungsstrategie. Sie müssen sie nicht explizit konfigurieren, es sei denn, Sie möchten die Optionen anpassen.

Um die ressourcenoptimierte Platzierung zu verwenden, fügen Sie der Grain-Klasse das ResourceOptimizedPlacementAttribute hinzu.

Ressourcenoptimierte Platzierung ist in dieser Version von Orleans nicht verfügbar. Erwägen Sie ein Upgrade auf Orleans 8.1 oder höher, um dieses Feature zu verwenden.

Die ressourcenoptimierte Platzierungsstrategie versucht, Clusterressourcen zu optimieren, indem die Kornaktivierungen auf Basis des verfügbaren Arbeitsspeichers und der CPU-Auslastung über Silos hinweg ausgeglichen werden. Sie weist Laufzeitstatistiken Gewichtungen zu, um unterschiedliche Ressourcen zu priorisieren und eine normalisierte Bewertung für jeden Silo zu berechnen. Das Silo mit der niedrigsten Bewertung wird für die Platzierung der bevorstehenden Aktivierung ausgewählt. Die Normalisierung stellt sicher, dass jede Eigenschaft proportional zur Gesamtbewertung beiträgt. Passen Sie die Gewichtungen basierend ResourceOptimizedPlacementOptions auf bestimmten Anforderungen und Prioritäten für verschiedene Ressourcen an.

Darüber hinaus bietet diese Platzierungsstrategie die Möglichkeit, eine stärkere Vorliebe für das lokale Silo zu entwickeln (dasjenige, das das Ersuchen zur Durchführung einer neuen Platzierung erhält), um als Ziel für die Aktivierung ausgewählt zu werden. Steuern Sie dies über die LocalSiloPreferenceMargin Eigenschaft, Teil der Optionen.

Ein adaptiver Online-Algorithmus bietet außerdem einen Glättungseffekt, der schnelle Signalabbrüche verhindert, indem das Signal in einen polynomähnlichen Zerfallsprozess umgewandelt wird. Dies ist besonders wichtig für die CPU-Auslastung und trägt insgesamt dazu bei, die Ressourcensättigung auf Silos, insbesondere neu eingebundene, zu vermeiden.

Dieser Algorithmus basiert auf der ressourcenbasierten Platzierung mit kooperativer Dualmodus-Kalman-Filterung.

Konfigurieren Sie diese Platzierungsstrategie, indem Sie das ResourceOptimizedPlacementAttribute zur Grain-Klasse hinzufügen.

Ressourcenoptimierte Platzierungsoptionen

Konfigurieren der ressourcenoptimierten Platzierungsstrategie mithilfe von ResourceOptimizedPlacementOptions:

siloBuilder.Configure<ResourceOptimizedPlacementOptions>(options =>
{
    options.CpuUsageWeight = 40;
    options.MemoryUsageWeight = 20;
    options.AvailableMemoryWeight = 20;
    options.MaxAvailableMemoryWeight = 5;
    options.ActivationCountWeight = 15;
    options.LocalSiloPreferenceMargin = 5;
});
Option Typ Standard Description
CpuUsageWeight int 40 Die Bedeutung der CPU-Auslastung. Höhere Werte bevorzugen Silos mit geringerer CPU-Auslastung. Gültiger Bereich: 0-100.
MemoryUsageWeight int 20 Die Bedeutung der Speicherauslastung. Höhere Werte bevorzugen Silos mit geringerer Speicherauslastung. Gültiger Bereich: 0-100.
AvailableMemoryWeight int 20 Die Wichtigkeit des verfügbaren Arbeitsspeichers. Höhere Werte bevorzugen Silos mit mehr verfügbarem Arbeitsspeicher. Gültiger Bereich: 0-100.
MaxAvailableMemoryWeight int 5 Die Wichtigkeit des maximalen verfügbaren Arbeitsspeichers. Höhere Werte begünstigen Silos mit höherer physischer Arbeitsspeicherkapazität. Nützlich bei Clustern mit ungleich verteilten Ressourcen. Gültiger Bereich: 0-100.
ActivationCountWeight int 15 Die Wichtigkeit der Aktivierungsanzahl. Höhere Werte bevorzugen Silos mit weniger aktiven Getreiden. Gültiger Bereich: 0-100.
LocalSiloPreferenceMargin int 5 Spielraum für die bevorzugte Wahl des lokalen Silos. Bei Festlegung auf 0 wählt immer das Silo mit niedrigster Auslastung aus. Bei Festlegung auf 100 bevorzugt es immer das lokale Silo (entspricht PreferLocalPlacement). Empfohlen: 5-10. Gültiger Bereich: 0-100.

Hinweis

Die Summe der Gewichtungswerte muss nicht 100 betragen. Orleans normalisiert sie automatisch, sodass sie relative Wichtigkeit und nicht absolute Prozentsätze darstellen.

Zufällige Platzierung

Orleans wählt zufällig einen Server von den kompatiblen Servern im Cluster aus. Um diese Platzierungsstrategie zu konfigurieren, fügen Sie die RandomPlacementAttribute Grainklasse hinzu.

Lokale Platzierung

Wenn der lokale Server kompatibel ist, Orleans wählt er den lokalen Server aus. Andernfalls wird ein zufälliger Server ausgewählt. Konfigurieren Sie diese Platzierungsstrategie, indem Sie das PreferLocalPlacementAttribute zur Grain-Klasse hinzufügen.

Hashbasierte Platzierung

Orleans Hashiert die Korn-ID in eine nicht-negative Ganzzahl und wendet eine Modulo-Operation mit der Anzahl kompatibler Server an. Anschließend wird der entsprechende Server aus der Liste der kompatiblen Server ausgewählt, die nach Serveradresse sortiert sind. Beachten Sie, dass diese Platzierung nicht garantiert stabil bleibt, wenn sich die Clustermitgliedschaft ändert. Insbesondere kann das Hinzufügen, Entfernen oder Neustarten von Servern den für eine bestimmte Korn-ID ausgewählten Server ändern. Da Getreide, das mithilfe dieser Strategie im Getreideverzeichnis registriert wird, platziert wird, hat die Änderung der Platzierungsentscheidung aufgrund von Mitgliedschaftsänderungen üblicherweise keinen spürbaren Effekt.

Konfigurieren Sie diese Platzierungsstrategie, indem Sie das HashBasedPlacementAttribute zur Grain-Klasse hinzufügen.

Platzierung auf Basis der Aktivierungsanzahl

Diese Platzierungsstrategie versucht, neue Getreideaktivierungen auf dem am wenigsten stark geladenen Server basierend auf der Anzahl der zuletzt ausgelasteten Getreide zu platzieren. Es enthält einen Mechanismus, bei dem alle Server regelmäßig ihre Gesamtaktivierungsanzahl auf allen anderen Servern veröffentlichen. Der Verantwortliche für die Platzierung wählt dann einen Server aus, bei dem die wenigsten Aktivierungen vorhergesagt werden, indem er die zuletzt gemeldete Aktivierungsanzahl untersucht und die aktuelle Anzahl basierend auf den kürzlich vom Platzierungsdirektor auf dem aktuellen Server durchgeführten Aktivierungen prognostiziert. Der Director wählt mehrere Server zufällig aus, wenn diese Vorhersage vorgenommen wird, um zu vermeiden, dass mehrere separate Server denselben Server überladen. Standardmäßig werden zwei Server zufällig ausgewählt, aber dieser Wert kann über ActivationCountBasedPlacementOptionskonfiguriert werden.

Dieser Algorithmus basiert auf der These The Power of Two Choices in Randomized Load Balancing von Michael David Mitzenmacher. Es wird auch in Nginx für den verteilten Lastenausgleich verwendet, wie im Artikel NGINX und der "Power of Two Choices" Load-Balancing Algorithmus beschrieben.

Konfigurieren Sie diese Platzierungsstrategie, indem Sie das ActivationCountBasedPlacementAttribute zur Grain-Klasse hinzufügen.

Zustandslose Workerplatzierung

Zustandslose Workerplatzierung ist eine spezielle Platzierungsstrategie, die von zustandslosen Workern Grainsverwendet wird. Diese Platzierung funktioniert fast identisch wie PreferLocalPlacement, mit der Ausnahme, dass jeder Server mehrere Aktivierungen desselben Grains haben kann und das Grain nicht im Grain-Verzeichnis registriert wird, da es keine Notwendigkeit gibt.

Konfigurieren Sie diese Platzierungsstrategie, indem Sie das StatelessWorkerAttribute zur Grain-Klasse hinzufügen.

Silo-rollenbasierte Platzierung

Dies ist eine deterministische Platzierungsstrategie, die Getreide auf Silos mit einer bestimmten Rolle platziert. Konfigurieren Sie diese Platzierungsstrategie, indem Sie das SiloRoleBasedPlacementAttribute zur Grain-Klasse hinzufügen.

Auswählen einer Platzierungsstrategie

Die Auswahl der geeigneten Kornplatzierungsstrategie, die über die Standardwerte Orleans hinausgeht, erfordert Überwachung und Auswertung. Die Wahl sollte auf der Größe und Komplexität, den Workloadmerkmalen und der Bereitstellungsumgebung der App basieren.

Zufällige Platzierung basiert auf dem Gesetz großer Zahlen, daher ist es in der Regel ein guter Standardwert für unvorhersehbare Lasten, die sich über viele Getreide verteilt (10.000 oder mehr).

Die auf Aktivierungszähler basierende Platzierung enthält auch ein Zufallselement und beruht auf dem Prinzip "Power of Two Choices" (Prinzip der Wahl zwischen zwei Optionen). Dies ist ein häufig verwendeter Algorithmus für den verteilten Lastenausgleich und wird in beliebten Lastenausgleichsmodulen verwendet. Silos veröffentlichen häufig Laufzeitstatistiken für andere Silos im Cluster, darunter:

  • Verfügbarer Arbeitsspeicher, gesamter physischer Speicher und Speicherauslastung.
  • CPU-Auslastung.
  • Die Gesamtzahl der Aktivierungen und die Anzahl der kürzlich aktiven Aktivierungen.
    • Ein gleitendes Fenster von Aktivierungen, die in den letzten Sekunden aktiv sind, manchmal auch als Aktivierungsarbeitssatz bezeichnet.

Aus diesen Statistiken werden derzeit nur Aktivierungsanzahlen verwendet, um die Last eines bestimmten Silos zu ermitteln.

Experimentieren Sie letztendlich mit verschiedenen Strategien, und überwachen Sie Leistungsmetriken, um die beste Passform zu ermitteln. Die Auswahl der richtigen Kornplatzierungsstrategie optimiert die Leistung, Skalierbarkeit und Kosteneffizienz von Orleans Apps.

Konfigurieren der Standardplatzierungsstrategie

Beginnend mit Version Orleans 9.2, verwendet Orleans standardmäßig eine ressourcenoptimierte Platzierung. Überschreiben Sie die Standardplatzierungsstrategie, indem Sie während der Konfiguration eine Implementierung von PlacementStrategy registrieren.

So stellen Sie das zufällige Platzierungsverhalten wieder her:

siloBuilder.Services.AddSingleton<PlacementStrategy, RandomPlacement>();

So verwenden Sie eine benutzerdefinierte Platzierungsstrategie:

siloBuilder.Services.AddSingleton<PlacementStrategy, MyPlacementStrategy>();

Orleans verwendet zufällige Platzierung, es sei denn, der Standardwert wird außer Kraft gesetzt. Überschreiben Sie die Standardplatzierungsstrategie, indem Sie während der Konfiguration eine Implementierung von PlacementStrategy registrieren.

siloBuilder.Services.AddSingleton<PlacementStrategy, MyPlacementStrategy>();

Orleans verwendet zufällige Platzierung, es sei denn, der Standardwert wird außer Kraft gesetzt. Überschreiben Sie die Standardplatzierungsstrategie, indem Sie während der Konfiguration eine Implementierung von PlacementStrategy registrieren.

siloBuilder.ConfigureServices(services =>
    services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());

Konfigurieren der Platzierungsstrategie für ein Korn

Konfigurieren Sie die Platzierungsstrategie für einen Korntyp, indem Sie der Kornklasse das entsprechende Attribut hinzufügen. Relevante Attribute werden in den oben genannten Abschnitten für Platzierungsstrategien angegeben.

Beispiel für eine benutzerdefinierte Platzierungsstrategie

Definieren Sie zunächst eine Klasse, die die IPlacementDirector Schnittstelle implementiert, die eine einzelne Methode erfordert. Gehen Sie in diesem Beispiel davon aus, dass eine Funktion GetSiloNumber definiert ist, die eine Silonummer zurückgibt, wenn das Guid Korn erstellt werden soll.

public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
    public Task<SiloAddress> OnAddActivation(
        PlacementStrategy strategy,
        PlacementTarget target,
        IPlacementContext context)
    {
        var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
        int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);

        return Task.FromResult(silos[silo]);
    }
}

Definieren Sie dann zwei Klassen, um die Zuweisung von Getreideklassen zur Strategie zu ermöglichen:

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
    public SamplePlacementStrategyAttribute() :
        base(new SamplePlacementStrategy())
    {
    }
}

Markieren Sie dann alle Kornklassen, die diese Strategie mit dem Attribut verwenden möchten:

[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

Registrieren Sie schließlich die Strategie beim Erstellen der ISiloHost:

private static async Task<ISiloHost> StartSilo()
{
    var builder = new HostBuilder(c =>
    {
        // normal configuration methods omitted for brevity
        c.ConfigureServices(ConfigureServices);
    });

    var host = builder.Build();
    await host.StartAsync();

    return host;
}

private static void ConfigureServices(IServiceCollection services)
{
    services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}

Ein zweites einfaches Beispiel zur weiteren Verwendung des Platzierungskontexts finden Sie im PreferLocalPlacementDirectorOrleans Quell-Repository.

Platzierungsfilterung

Durch die Platzierungsfilterung können Sie filtern, welche Silos für die Getreidelagerung auswählbar sind, bevor die Platzierungsstrategie ein Ziel auswählt. Dies funktioniert in Verbindung mit Platzierungsstrategien und ermöglicht Szenarien wie:

  • Zonenbezogene Platzierung: Platzieren von Getreide auf Silos in derselben Verfügbarkeitszone
  • Mehrstufige Bereitstellungen: Direktes Weiterleiten bestimmter Getreide auf Premium- oder Standardebenensilos
  • Hardwareaffinität: platzieren Sie rechenintensive Elemente auf Silos mit spezifischen Kapazitäten

Orleans stellt integrierte Filter basierend auf Silometadaten bereit, einschließlich der Filterung erforderlicher Übereinstimmungen und bevorzugter Übereinstimmungen. Sie können auch benutzerdefinierte Platzierungsfilter implementieren.

Ausführliche Informationen zum Konfigurieren von Silometadaten, unter Verwendung von integrierten Filtern und Implementieren von benutzerdefinierten Filtern finden Sie unter "Grain Placement Filtering".

Umverteilung der Aktivierung

Die Neupartitionierung der Aktivierungen ist ein Feature, das die Lokalisierung des Kornaufrufs automatisch optimiert, indem Kornaktivierungen migriert werden, um sich den Körnern anzunähern, zu denen sie am häufigsten kommunizieren. Dieses Feature kann die Leistung erheblich verbessern, indem Netzwerk-Sprünge für die Kommunikation zwischen Grains reduziert werden.

Warnung

Die Aktivierungsumpartitionierung ist ein experimentelles Feature. Verwenden Sie die #pragma warning disable ORLEANSEXP001 Direktive, oder fügen Sie <NoWarn>ORLEANSEXP001</NoWarn> sie ihrer Projektdatei hinzu, um die experimentelle Warnung zu unterdrücken.

Funktionsweise

Der Repartitioner überwacht Korn-zu-Korn-Kommunikationsmuster und erstellt einen Graphen aus "Kanten", der angibt, wie häufig Körner kommunizieren. In regelmäßigen Abständen analysiert es dieses Diagramm, um Möglichkeiten zur Verbesserung der Lokalität zu identifizieren, indem Getreide zu Silos migriert wird, in denen sich ihre Kommunikationspartner befinden, und gleichzeitig eine ungefähr gleiche Verteilung von Aktivierungen über Silos hinweg erhalten.

Wichtige Merkmale:

  • Probabilistische Nachverfolgung: Verwendet eine probabilistische Datenstruktur, um die schwersten Kommunikationsverbindungen nachzuverfolgen und gleichzeitig Arbeitsspeicher zu sparen.
  • Ausgewogene Verteilung: Bemühungen, die Aktivierungszahlen gleichmäßig zwischen Silos zu verteilen
  • Wiederherstellungszeitraum: Nach der Migration von Getreide wartet ein Silo, bevor er an einer anderen Neupartitionierungsrunde teilnimmt, um dem System die Stabilisierung zu ermöglichen.
  • Verankerungsfilter: Identifiziert gut partitionierte Getreide (die bereits nahe an ihren Kommunikationspartnern sind) und vermeidet die Migration.

Aktivierung der Repartitionierung

Aktivieren Sie die Aktivierungsumteilung mithilfe der AddActivationRepartitioner-Erweiterungsmethode:

#pragma warning disable ORLEANSEXP001
siloBuilder.AddActivationRepartitioner();
#pragma warning restore ORLEANSEXP001

Konfigurationsoptionen

Konfigurieren Sie den Repartitionierer mit ActivationRepartitionerOptions:

#pragma warning disable ORLEANSEXP001
siloBuilder.AddActivationRepartitioner();
siloBuilder.Configure<ActivationRepartitionerOptions>(options =>
{
    options.MaxEdgeCount = 10_000;
    options.MinRoundPeriod = TimeSpan.FromMinutes(1);
    options.MaxRoundPeriod = TimeSpan.FromMinutes(2);
    options.RecoveryPeriod = TimeSpan.FromMinutes(1);
    options.AnchoringFilterEnabled = true;
});
#pragma warning restore ORLEANSEXP001
Option Typ Standard Description
MaxEdgeCount int 10.000 Maximale Anzahl von Kanten (Kornkommunikationslinks) zum Nachverfolgen. Höhere Werte verbessern die Genauigkeit, verwenden aber mehr Arbeitsspeicher. Werte unter 100 werden nicht empfohlen.
MaxUnprocessedEdges int 100,000 Maximale Anzahl nicht verarbeiteter Kanten, die gepuffert werden sollen. Älteste Kanten werden verworfen, wenn ein Limit überschritten wird.
MinRoundPeriod TimeSpan 1 Minute Minimale Zeit zwischen Neupartitionierungsrunden.
MaxRoundPeriod TimeSpan 2 Minuten Maximale Zeit zwischen Neupartitionierungsrunden. Der Zeitpunkt liegt innerhalb eines zufälligen Bereichs zwischen Mindest- und Höchstzeit. Um optimale Ergebnisse zu erzielen, zielen Sie auf ~10 Sekunden, multipliziert mit der maximalen Siloanzahl.
RecoveryPeriod TimeSpan 1 Minute Zeit, die ein Silo nach einer Neupartitionierungsrunde wartet, bevor es an einer anderen Teilnahme teilnimmt. Muss kleiner oder gleich MinRoundPeriodsein.
AnchoringFilterEnabled bool true Ermöglicht die Nachverfolgung gut partitionierter Getreide, um unnötige Migrationen zu vermeiden. Verringert die Genauigkeit leicht, verbessert aber die Effektivität.
ProbabilisticFilteringMaxAllowedErrorRate double 0.01 Maximale Fehlerrate für den probabilistischen Filter (0,1% bis 1% Bereich). Gilt nur, wenn AnchoringFilterEnabledtrue ist.

Leistungsüberlegungen

  • Konvergenzzeit: Der Repartitionierer steigert schrittweise die Lokalität über mehrere Runden. Wenn das System nicht schnell genug konvergiert, erwägen Sie, MaxEdgeCount zu erhöhen.
  • Arbeitsspeicherauslastung: Höhere MaxEdgeCount Werte verbrauchen mehr Arbeitsspeicher. Die probabilistische Datenstruktur trägt dazu bei, die Speicherauslastung zu begrenzen und gleichzeitig eine angemessene Genauigkeit aufrechtzuerhalten.
  • Clusterstabilität: Vermeiden Sie sehr kurze RecoveryPeriod Werte, um übermäßige Getreidemigration zu verhindern.
  • Arbeitsauslastungsmuster: Funktioniert am besten mit Arbeitslasten, die stabile Kommunikationsmuster aufweisen. Hoch dynamische Workloads können weniger Vorteile haben.

Wann die Aktivierungspartitionierung verwendet werden soll

Erwägen Sie die Aktivierungsumpartitionierung, wenn:

  • Ihre Getreide haben vorhersagbare Kommunikationsmuster (Korn A ruft korn A häufig Korn B auf)
  • Sie haben einen Multi-Silo-Cluster, in dem die Netzwerklatenz zwischen Silos signifikant ist.
  • Benchmarking zeigt einen verbesserten Durchsatz mit aktivierter Funktion

Vermeiden Sie die Neupartitionierung der Aktivierung, wenn:

  • Körner kommunizieren zufällig mit vielen verschiedenen Körnern
  • Ihr Cluster ist klein (2-3 Silos), bei denen der Migrationsaufwand vorteile überwiegen kann
  • Ihre Körner werden häufig deaktiviert und reaktiviert, wodurch verhindert wird, dass stabile Muster entstehen.

Die Aktivierungsumpartitionierung wurde als experimentelles Feature in Orleans 8.2 eingeführt. Die neueste Dokumentation zu diesem Feature finden Sie in der Orleans 9.0+-Dokumentation.

Die Neupartitionierung der Aktivierung ist in Orleans 8.2 und höher verfügbar.

Aktivierungsrebalancing

Die Aktivierungsverteilung ist eine clusterweite Funktion, die Aktivierungen automatisch über Silos umverteilt, um sowohl die Speicherauslastung als auch die Balance der Anzahl der Aktivierungen zu optimieren. Im Gegensatz zur Aktivierungsumteilung (die für die Kommunikationslokalität optimiert wird), konzentriert sich der Rebalancer auf die gleichmäßige Ladung von Silos im Hinblick auf den Ressourcenverbrauch.

Warnung

Aktivierungsausgleich ist eine experimentelle Funktion. Verwenden Sie die #pragma warning disable ORLEANSEXP002 Direktive, oder fügen Sie <NoWarn>ORLEANSEXP002</NoWarn> sie ihrer Projektdatei hinzu, um die experimentelle Warnung zu unterdrücken.

Funktionsweise

Der Aktivierungsrebalancer wird als Singletonkorn ausgeführt, der die Neubalancierung über den Cluster koordiniert:

  1. Statistikensammlung: Jedes Silo veröffentlicht regelmäßig seine Speicherauslastung und Aktivierungsanzahl für den Rebalancer.
  2. Entropieberechnung: Der Rebalancer berechnet die aktuelle "Entropie" des Clusters – ein Maß dafür, wie gleichmäßig verteilte Ressourcen sind. Maximale Entropie bedeutet perfekte Balance.
  3. Migrationsentscheidungen: Wenn die Entropie unter dem Ziel liegt, identifiziert der Rebalancer "schwere" Silos (hohe Speicher-/Aktivierungsanzahl) und "leichte" Silos und weist dann schwere Silos an, Aktivierungen zu leichten Silos zu migrieren.
  4. Sitzungsbasierte Ausführung: Das Rebalancing wird in Sitzungen mit mehreren Zyklen ausgeführt. Eine Sitzung endet, wenn der Cluster ein akzeptables Gleichgewicht erreicht oder keine weitere Verbesserung erkannt wird.

Der Algorithmus berücksichtigt sowohl die Speicherauslastung als auch die Aktivierungsanzahl, wobei das harmonische Mittel der Speicherauslastung verwendet wird, um eine ideale Aktivierungsverteilung zu berechnen. Dies bedeutet, dass Silos mit weniger verfügbaren Arbeitsspeicher weniger Aktivierungen erhalten.

Aktivierungs-Ausgleich aktivieren

Aktivieren Sie das Aktivierungsrebalancing mithilfe der AddActivationRebalancer-Erweiterungsmethode:

#pragma warning disable ORLEANSEXP002
siloBuilder.AddActivationRebalancer();
#pragma warning restore ORLEANSEXP002

Konfigurationsoptionen

Konfigurieren sie den Rebalancer mithilfe von ActivationRebalancerOptions:

#pragma warning disable ORLEANSEXP002
siloBuilder.AddActivationRebalancer();
siloBuilder.Configure<ActivationRebalancerOptions>(options =>
{
    options.RebalancerDueTime = TimeSpan.FromSeconds(60);
    options.SessionCyclePeriod = TimeSpan.FromSeconds(15);
    options.MaxStagnantCycles = 3;
});
#pragma warning restore ORLEANSEXP002
Option Typ Standard Description
RebalancerDueTime TimeSpan 60 Sekunden Anfängliche Verzögerung, bevor die erste Rebalancing-Sitzung beginnt, nachdem sich der Cluster stabilisiert hat.
SessionCyclePeriod TimeSpan 15 Sekunden Zeit zwischen den Rebalancing-Zyklen während einer Sitzung. Muss mindestens doppelt so groß sein wie das Veröffentlichungsintervall für Statistiken.
MaxStagnantCycles int 3 Maximale aufeinanderfolgende Zyklen ohne Verbesserung vor Dem Ende einer Sitzung.
EntropyQuantum double 0.0001 Eine minimale Entropieänderung gilt als Verbesserung. Kleinere Werte machen den Rebalancer empfindlicher.
AllowedEntropyDeviation double 0.0001 Basisschwellenwert für eine akzeptable Abweichung von der maximalen Entropie. Wenn die Abweichung unter diesem Schwellenwert liegt, wird der Cluster als ausgeglichen betrachtet.
ScaleAllowedEntropyDeviation bool true Gibt an, ob die zulässige Abweichung dynamisch basierend auf der Clustergröße und aktivierungsanzahl skaliert werden soll.
CycleNumberWeight double 0,1 Gewichtungsfaktor für die Zyklusnummer bei der Migrationsratenberechnung. Höhere Werte beschleunigen die Migration in späteren Zyklen.
SiloNumberWeight double 0,1 Gewichtungsfaktor für die Siloanzahl bei der Berechnung der Migrationsrate. Höhere Werte migrieren mehr Aktivierungen in größeren Clustern.
ActivationMigrationCountLimit int Int.MaxValue Maximale Anzahl von Aktivierungen, die in einem einzelnen Zyklus migriert werden sollen. Wird verwendet, um die Migrationsrate zu drosseln.

Anforderungen

  • Minimale Clustergröße: Erfordert mindestens 2 Silos, die funktionieren.
  • Speicherstatistiken: Jeder Silo muss eine gültige Speicherauslastung (nicht null) melden. Wenn ein Silo keinen Speicher meldet, werden die Rebalancing-Zyklen übersprungen.
  • Getreidemigratabilität: Getreide, die mit [Immovable] gekennzeichnet sind, sind vom Rebalancing ausgeschlossen oder [Immovable(ImmovableKind.Rebalancer)] vollständig ausgeschlossen.

Wann sollte das Aktivierungsrebalancing verwendet werden?

Erwägen Sie das Aktivierungsrebalancing, wenn:

  • Ihr Cluster verfügt über Silos mit ungleichmäßiger Ressourcenauslastung (einige Silos, die heiß laufen, während andere unterlastet sind)
  • Sie haben lang andauernde Getreideaktivierungen, die sich im Laufe der Zeit ungleichmäßig ansammeln können
  • Ihre Arbeitsauslastungsmuster verursachen Aktivierungsungleichgewichte, die platzierungsstrategien allein nicht adressieren können

Vermeiden Sie das Aktivierungs-Ungleichgewicht, wenn:

  • Ihr Cluster ist klein (2-3 Silos), bei denen der Aufwand vorteile überwiegen kann
  • Getreide hat sehr kurze Lebensdauer und deaktiviert schnell
  • Sie verwenden bereits die Aktivierungsneupartitionierung und möchten konfliktreiche Migrationen vermeiden – auch wenn die beiden Funktionen koexistieren können, passt der Repartitionierer sein Verhalten basierend auf den Rebalancer-Berichten an.

Vergleich mit Aktivierungsneupartitionierung

Merkmal Aktivierungsneuausrichtung Repartitionierung der Aktivierung
Optimiert für Gleichgewicht von Arbeitsspeicher- und Aktivierungsanzahl Kommunikationslokalität
Scope Clusterweite Koordination Paarweise Silokoordination
Experimentelle Kennung ORLEANSEXP002 ORLEANSEXP001
Migrationsauslöser Ressourcenungleichgewicht Kommunikationsmuster

Beide Features können gleichzeitig aktiviert werden. Die Neupartitionierung passt ihre Toleranz automatisch an das vom Rebalancer gemeldete Ungleichgewicht des Clusters an.

Das Rebalancing der Aktivierung ist in Orleans 10.0 und höher verfügbar.