Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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,
MaxEdgeCountzu erhöhen. -
Arbeitsspeicherauslastung: Höhere
MaxEdgeCountWerte 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
RecoveryPeriodWerte, 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:
- Statistikensammlung: Jedes Silo veröffentlicht regelmäßig seine Speicherauslastung und Aktivierungsanzahl für den Rebalancer.
- Entropieberechnung: Der Rebalancer berechnet die aktuelle "Entropie" des Clusters – ein Maß dafür, wie gleichmäßig verteilte Ressourcen sind. Maximale Entropie bedeutet perfekte Balance.
- 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.
- 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.