-
GEBIET DER ERFINDUNG
-
Die vorliegende Erfindung betrifft Verfahren und Speichercontroller zur Bestimmung einer Charakteristik einer Datenentität, wobei diese Charakteristik auf einer Zugriffshäufigkeit auf diese Datenentität in einem Speichersystem beruht.
-
HINTERGRUND
-
Im Folgenden wird eine Charakteristik einer Datenentität, die eine relative Häufigkeit darstellt, mit welcher auf die Datenentität zugegriffen wird, als Temperatur solch einer Datenentität bezeichnet. Die Bestimmung der Temperatur einer bestimmten Datenentität, einschließlich insbesondere ihrer logischen Adresse, ist eine seit langer Zeit bestehende Herausforderung in Speichersystemen. Die Temperatur einer bestimmten Datenentität bezieht sich auf ihre relative Abfragehäufigkeit, was Lese- oder Schreibzugriffe auf andere Datenentitäten im selben Speichersystem einschließen kann. Eine Sammlung von Temperaturinformation für das gesamte Speichersystem wird auch als Wärmebild bezeichnet. Eine Datenentität wird oft „heiß” genannt, wenn häufig auf sie zugegriffen wird, oder „kalt”, wenn selten auf sie zugegriffen wird. Die Temperatur ist ein quantitatives Maß dafür, wie oft und wie kürzlich auf eine Datenentität zugegriffen wurde.
-
Eine einfache und unkomplizierte Methode, die Temperatur von Datenentitäten zu bestimmen, ist die Verwendung eines Zählers für jede Datenentität, um die Zahl der Abfragen zu verfolgen. Bei Speichersystemen mit großer Kapazität kann dies jedoch nicht speichereffizient sein. Um den Speicherbedarf des Wärmebilds zu verkleinern, besteht eine gängige Lösung darin, einen Zähler für eine Gruppe zusammenhängender Datenentitäten zu verwenden, das heißt, die Temperatur von Daten mit einer gröberen Granularität zu verfolgen.
-
Aus
US 2009/0031082 A1 ist eine Datenverarbeitung bekannt, bei der eine Folge von Operationen durchgeführt wird. Dabei wird u. a. eine Fehlspeicherung im Cache-Speicher frühzeitig angezeigt.
-
In Dongchul Park et al.: „Hot Data Identification for Flash-based Storage Systems Using Muitiple Bloom Filters” in IEEE 27th Symposium an Mass Storage Systems und Technologies, 23.–27.05.2011, S. 1–11, wird die Datenidentifizierung häufig genutzter Daten (”hot data”) offenbart.
-
KURZE ZUSAMMENFASSUNG DER ERFINDUNG
-
Ausgehend von diesem Stand der Technik stellt sich die Erfindung die Aufgabe, die Zugriffshäufigkeit von Datenentitäten mit möglichst wenigen weiteren Annahmen über die Datenentitäten zu bestimmen.
-
Diese Aufgabe wird mit dem Verfahren nach Anspruch 1, dem Computerprogrammerzeugnis nach Anspruch 3 und dem Speichercontroller nach Anspruch 4 gelöst. Bevorzugte Ausführungsformen der Erfindung sind Gegenstand der jeweiligen Unteransprüche.
-
Zu einem Verfahren zur Bestimmung einer Charakteristik einer Datenentität, wobei diese Charakteristik auf einer Zugriffshäufigkeit auf diese Datenentität in einem Speichersystem beruht, kann ein zählendes Bloomfilter bereitgestellt werden, um während eines Zeitintervalls betrieben zu werden, wobei dieses zählende Bloomfilter eine Gruppe von Zählern umfasst. Eine Datenstruktur wird bereitgestellt, wobei die Datenstruktur eine Gruppe von Elementen umfasst, wobei jedes Element der Gruppe von Elementen einem Zähler der Gruppe von Zählern zugeordnet ist. Die Charakteristik der Datenentität wird abhängig von einem Wert mindestens eines Elements der Gruppe von Elementen bestimmt. Das zählende Bloomfilter wird für jedes einzelne Zeitintervall betrieben
- – die Zähler der Gruppe von Zählern werden vor oder am Anfang des Einzelzeitintervalls zurückgesetzt,
- – ein Wert mindestens eines Zählers einer Untergruppe von Zählern wird jedes Mal, wenn während des Einzelzeitintervalls auf die Datenentität zugegriffen wird, erhöht, wobei die Datenentität auf diese Untergruppe von Zählern im zählenden Bloomfilter abgebildet wird,
- – der Wert jedes Einzelelements der Gruppe von Elementen wird am oder nach einem Ende des Einzelzeitintervalls aktualisiert, wobei der Wert des Einzelelements abhängig von einem Wert, den der Zähler, der dem Einzelelement zugeordnet ist, am Ende des Einzelzeitintervalls aufweist, und abhängig von einem vorlegenden Wert des Einzelelements aktualisiert wird.
-
Dieses Verfahren kann eines oder mehrere der folgenden Merkmale umfassen:
- – das zählende Bloomfilter wird mehrmals für aufeinanderfolgende Zeitintervalle betrieben;
- – der Wert des Einzelelements wird abhängig von einem gewichteten Wert, den der Zähler, der dem Einzelelement zugeordnet ist, am Ende des Einzelzeitintervalls aufweist, und abhängig von einem gewichteten vorliegenden Wert des Einzelelements aktualisiert;
- – der Wert des Einzelelements wird durch den Wert aktualisiert, den der Zähler, der dem Einzelelement zugeordnet ist, am Ende des Einzelzeitintervalls aufweist, wobei dieser Wert mit einem Faktor α gewichtet wird, plus dem vorliegenden Wert des Einzelelements, wobei dieser vorliegende Wert mit einem Faktor 1 – α gewichtet wird;
- – der Faktor α hat einen Wert zwischen 0,75 und 0,95;
- – die Datenentität wird mithilfe einer oder mehrerer Hash-Funktionen auf die Untergruppe von Zählern abgebildet;
- – die Untergruppe von Zählern umfasst mehrere Zähler, auf welche die Datenentität im zählenden Bloomfilter abgebildet wird, und nur der Wert eines einzigen Zählers in der Untergruppe wird erhöht, wobei dieser einzige Zähler der Zähler in der Untergruppe ist, der aktuell unter den mehreren Zählern in der Untergruppe einen niedrigsten Wert aufweist;
- – jedes Element der Gruppe von Elementen ist einem einzigen Zähler der Gruppe von Zählern zugeordnet, und jeder Zähler der Gruppe von Zählern ist einem einzigen Element der Gruppe von Elementen zugeordnet;
- – die Untergruppe von Zählern umfasst mehrere Zähler, auf welche die Datenentität im zählenden Bloomfilter abgebildet wird, eine Untergruppe von Elementen enthält Elemente, die den Zählern der Untergruppe von Zählern zugeordnet sind, und die Charakteristik der Datenentität wird abhängig vom Wert eines Elements oder mehrerer Elemente der Untergruppe von Elementen bestimmt;
- – die Charakteristik der Datenentität wird abhängig vom Wert des Elements bestimmt, das unter den mehreren Elementen in der Untergruppe von Elementen den niedrigsten Wert aufweist; der Zugriff auf die Datenentität schließt mindestens eines vom Lesen und von der Aktualisierung der Datenentität ein;
- – die Datenentität stellt Daten dar, auf welche über eine einzige logische Blockadresse zugegriffen wird;
- – die Datenentität wird abhängig von der bestimmten Charakteristik dieser Datenentität gewählt, um in den Cache gestellt zu werden;
- – die Datenentität wird abhängig von der bestimmten Charakteristik dieser Datenentität gewählt, um in einer dedizierten Schicht in einem mehrschichtigen Speichersystem gespeichert zu werden.
-
Für ein weiteres Verfahren zur Bestimmung einer Charakteristik einer Datenentität, wobei diese Charakteristik auf einer Zugriffshäufigkeit auf diese Datenentität in einem Speichersystem beruht, kann ein erstes zählendes Bloomfilter bereitgestellt werden, um während eines ersten Zeitintervalls aktiv zu sein, wobei dieses erste zählende Bloomfilter eine Gruppe von ersten Zählern umfasst. Jedes Mal, wenn während des ersten Zeitintervalls auf die Datenentität zugegriffen wird, wird ein Wert mindestens eines ersten Zählers einer Untergruppe von ersten Zählern erhöht, wobei die Datenentität auf diese Untergruppe von ersten Zählern im ersten zählenden Bloomfilter abgebildet wird. Ein zweites zählendes Bloomfilter wird bereitgestellt, um während eines zweiten Zeitintervalls aktiv zu sein, wobei dieses zweite zählende Bloomfilter eine Gruppe von zweiten Zählern umfasst. Jedes Mal, wenn während des zweiten Zeitintervalls auf die Datenentität zugegriffen wird, wird ein Wert mindestens eines zweiten Zählers einer Untergruppe von zweiten Zählern erhöht, wobei die Datenentität auf diese Untergruppe von zweiten Zählern im zweiten zählenden Bloomfilter abgebildet wird. Die Charakteristik der Datenentität wird abhängig von einem Wert mindestens eines ersten Zählers der Untergruppe von ersten Zählern am Ende des ersten Zeitintervalls und abhängig von einem Wert mindestens eines zweiten Zählers der Untergruppe von zweiten Zählern am Ende des zweiten Zeitintervalls bestimmt.
-
Dieses Verfahren kann eines oder mehrere der folgenden Merkmale umfassen:
- – insgesamt n zählende Bloomfilter werden bereitgestellt, wobei jedes der n zählenden Bloomfilter während eines zugeordneten Zeitintervalls aktiv ist, wobei diese zugeordneten Zeitintervalle aufeinanderfolgen; jedes der n zählenden Bloomfilter wird jedes Mal, wenn während des zugeordneten Zeitintervalls auf die Datenentität zugegriffen wird, dem ersten oder zweiten zählenden Bloomfilter entsprechend betrieben; und die Charakteristik der Datenentität wird für jedes der n zählenden Bloomfilter abhängig von einem Wert mindestens eines Zählers einer Untergruppe von Zählern, die dieser Datenentität im jeweiligen zählenden Bloomfilter zugeordnet ist, am Ende des zugeordneten Zeitintervalls bestimmt;
- – die Charakteristik der Datenentität wird auf der Basis eines Durchschnitts der Zählerwerte bestimmt, die aus den n zählenden Bloomfiltern gewählt werden;
- – die Datenentität wird mithilfe einer oder mehrerer Hash-Funktionen auf die Untergruppe von ersten Zählern abgebildet, und die Datenentität wird mithilfe der gleichen einen oder mehreren Hash-Funktionen auf die Untergruppe von zweiten Zählern abgebildet;
- – die Untergruppe von ersten Zählern umfasst mehrere erste Zähler, auf welche die Datenentität im ersten zählenden Bloomfilter abgebildet wird; nur der Wert eines einzigen ersten Zählers in der Untergruppe wird erhöht, wobei dieser einzige erste Zähler der erste Zähler in der Untergruppe ist, der unter den mehreren ersten Zählern in der Untergruppe aktuell einen niedrigsten Wert aufweist; und die Untergruppe von zweiten Zählern umfasst mehrere zweite Zähler, auf welche diese Datenentität im zweiten zählenden Bloomfilter abgebildet wird; nur der Wert eines einzigen zweiten Zählers in der Untergruppe wird erhöht, wobei dieser einzige zweite Zähler der zweite Zähler ist, der unter den mehreren zweiten Zählern in der Untergruppe aktuell einen niedrigsten Wert aufweist;
- – die Untergruppe von ersten Zählern umfasst mehrere erste Zähler, auf welche die Datenentität im ersten zählenden Bloomfilter abgebildet wird, die Untergruppe von zweiten Zählern umfasst mehrere zweite Zähler, auf welche die Datenentität im zweiten zählenden Bloomfilter abgebildet wird; die Charakteristik dieser Datenentität wird abhängig von einem Wert eines dedizierten ersten Zählers der Untergruppe von ersten Zählern bestimmt, wobei dieser dedizierte erste Zähler der erste Zähler ist, der unter den mehreren ersten Zählern in der Untergruppe am Ende des ersten Zeitintervalls den niedrigsten Wert aufweist, und abhängig von einem Wert eines dedizierten zweiten Zählers der Untergruppe von zweiten Zählern, wobei dieser dedizierte zweite Zähler der zweite Zähler ist, der unter den mehreren zweiten Zählern in der Untergruppe am Ende des zweiten Zeitintervalls den niedrigsten Wert aufweist;
- – der Zugriff auf die Datenentität schließt mindestens eines vom Lesen und von der Aktualisierung der Datenentität ein;
- – die Datenentität stellt Daten dar, auf welche über eine einzige logische Blockadresse zugegriffen wird;
- – die Datenentität wird abhängig von der bestimmten Charakteristik dieser Datenentität gewählt, um in den Cache gestellt zu werden;
- – die Datenentität wird abhängig von der bestimmten Charakteristik dieser Datenentität gewählt, um in einer dedizierten Schicht in einem mehrschichtigen Speichersystem gespeichert zu werden.
-
KURZE BESCHREIBUNG DER ZEICHNUNGEN
-
Die Erfindung und ihre Ausführungsformen werden in der folgenden Beschreibung erläutert.
-
Die Figuren zeigen:
-
1, ein Diagramm einer zeitlichen Abfolge von zählenden Bloomfiltern, die einer Ausführungsform der vorliegenden Erfindung gemäß angewandt werden;
-
2, ein Diagramm eines ersten zählenden Bloomfilters, das einer Ausführungsform der vorliegenden Erfindung gemäß angewandt wird;
-
3, ein Diagramm eines zweiten zählenden Bloomfilters, das einer Ausführungsform der vorliegenden Erfindung gemäß angewandt wird;
-
4, ein Diagramm eines mehrschichtigen Speichersystems;
-
5, ein Flussdiagramm eines Verfahrens nach einer Ausführungsform der vorliegenden Erfindung; und
-
6, ein Flussdiagramm eines Verfahrens nach einer anderen Ausführungsform der vorliegenden Erfindung.
-
AUSFÜHRLICHE BESCHREIBUNG DER AUSFÜHRUNGSFORMEN
-
Einleitend zur folgenden Beschreibung wird zuerst auf allgemeine Aspekte der Erfindung hingewiesen, die Verfahren und Controller zur Bestimmung der Charakteristik einer Datenentität betrifft, wobei diese Charakteristik auf einer Zugriffshäufigkeit auf die Datenentität beruht. Derartige Verfahren und Speichercontroller verwenden ein oder mehrere Bloomfilter, die spezifisch an die vorliegende Anwendung angepasst sind, und verwenden insbesondere ein oder mehrere zählende Bloomfilter.
-
Ein Bloomfilter kann als eine einfache, Platz sparende randomisierte Datenstruktur zur Darstellung einer Gruppe betrachtet werden, um Abfragen zur Mitgliedschaft zu unterstützen. Bloomfilter erreichen Platzeinsparungen auf Kosten von Fehltreffern; die Wahrscheinlichkeit eines Fehltreffers kann jedoch auf einen ausreichend niedrigen Wert gehalten werden. Bloomfilter wurden in den 1970er Jahren von Burton Bloom eingeführt und haben seitdem in Datenbankanwendungen sowie im Netzbetrieb weit verbreitete Anwendung gefunden. Ein Bloomfilter kann als ein Verfahren zur Darstellung einer Gruppe S = {s1, s2, ..., sn) von Elementen aus einem Universum U mithilfe eines Bit-Vektors V von m = O(n) Bits betrachtet werden. Alle Bits im Vektor V sind am Anfang auf 0 gesetzt. Das Bloomfilter kann k Hash-Funktionen verwenden, h1, h2, ..., hk, um Elemente aus U auf den Bereich {1, 2, ..., m) abzubilden. Für jedes Element s in S werden die Bits an den Positionen h1(s), h2(s), ..., hk(s) in V auf 1 gesetzt. Um ein Element abzufragen, d. h., um zu prüfen, ob das Element in der Gruppe ist, wird das Element bevorzugt jeder von den k Hash-Funktionen zugeführt, um k Bitpositionen zu erhalten. Wenn Bits an diesen Positionen auf 0 sind, ist das Element nicht in der Gruppe – sonst wären alle Bits auf 1 gesetzt worden, als es eingefügt wurde. Wenn alle erkannten Bitpositionen auf 1 sind, ist das Element entweder in der Gruppe oder die Bits sind beim Einfügen anderer Elemente auf 1 gesetzt worden; der letztere Fall wird als „False Positive” bezeichnet. Die Wahrscheinlichkeit für einen Fehltreffer, der auf ein False Positive zurückzuführen ist, hängt von der Wahl der Parameter m, k ab. Diese Wahrscheinlichkeit wird bei k = log2(m/n) minimiert. Das Bloomfilter kann selbst bei m = cn mit einer kleinen Konstante c als sehr effektiv betrachtet werden. Bei c = 8 zum Beispiel liegt die Fehltrefferquote etwas über 2%.
-
Das Einfügen eines neuen Elements in ein Bloomfilter, d. h., das Einfügen eines neuen Elements in die Gruppe von Elementen, wird durch die folgenden Schritte erreicht: das Hashen des neuen Elements k mal mithilfe der k Hash-Funktionen und das Setzen der aus diesem Hashen resultierenden Bits auf 1. Eine Löschung eines Elements aus der Gruppe kann jedoch nicht durch Umkehren des Prozesses erreicht werden. Wenn das zu löschende Element gehasht wird und die entsprechenden Bits auf 0 gesetzt werden, kann eine Bitposition auf 0 gesetzt werden, die für ein anderes Element gehasht wurde. Um dieses Problem zu vermeiden, wurde die Idee des zählenden Bloomfilters entwickelt. In einem zählenden Bloomfilter wird jede Bitposition im Bloomfilter nicht durch ein Einzelbit, sondern durch einen Zähler dargestellt. Wenn ein neues Element in die Gruppe eingefügt wird, werden die entsprechenden Zähler inkrementiert; wenn ein Element aus der Gruppe gelöscht wird, werden die entsprechenden Zähler dekrementiert. Um einen Zählerüberlauf zu vermeiden, werden die Zähler groß genug ausgelegt. Zum Beispiel dürften vier Bits pro Zähler für die meisten Anwendungen ausreichen.
-
In gegenwärtigen Speicheranwendungen können zählende Bloomfilter nicht geeignet sein, um direkt zur Generierung von Wärmebildern benutzt zu werden, weil zählende Bloomfilter inhärent kurzfristig sind. Wenn mehr und mehr Datenentitäten angefordert werden, d. h., zum Speichersystem hinzugefügt werden, werden ihre entsprechenden Zähler inkrementiert, wodurch diese Zähler groß werden und schließlich überlaufen können.
-
Daher werden speicher- und berechnungseffiziente Verfahren zur Schätzung einer Charakteristik vorgeschlagen, die auf die Zugriffshäufigkeit einer Datenentität in einem Speichersystem bezogen ist.
-
Es wird bevorzugt ein einziges zählendes Bloomfilter mit einer Gruppe von Zählern bevorzugt wiederholt in einer Sequenz von Einzelzeitintervallen angewandt, um die Zugriffshäufigkeit einer und bevorzugt jeder Datenentität in jedem dieser Zeitintervalle zu erfassen. Bevorzugt ergibt die Sequenz von Einzelzeitintervallen einen zusammenhängenden Zeitraum. Daher wird für eine spezifische Datenentität jedes Mal, wenn während des Einzelzeitintervalls auf die Datenentität zugegriffen wird, ein Wert mindestens eines Zählers erhöht, wobei dieser Zähler Teil einer Untergruppe von Zählern ist und diese Datenentität bevorzugt mithilfe einer oder mehrerer Hash-Funktionen auf diese Untergruppe von Zählern abgebildet wird.
-
Zusätzlich wird eine Datenstruktur bereitgestellt, wobei diese Datenstruktur eine Gruppe von Elementen umfasst. Bevorzugt ist jedes Element aus der Gruppe von Elementen einem dedizierten einzigen Zähler aus der Gruppe von Zählern zugeordnet, und bevorzugt ist jeder Zähler aus der Gruppe von Zählern nur einem dedizierten einzigen Element zugeordnet.
-
Wenn das Verfahren beginnt, wird das zählende Bloomfilter zum ersten Mal gestartet, um für ein erstes Zeitintervall betrieben zu werden. An diesem Zeitpunkt oder davor werden alle Zähler der Gruppe von Zählern und alle Elemente der Gruppe von Elementen bevorzugt zurückgesetzt, d. h., in einer spezifischen Ausführungsform auf den Wert null gesetzt. Nullwerte stellen also am Anfang des ersten Zeitintervalls die vorliegenden Werte der Elemente und Zähler dar. Während des ersten Zeitintervalls können die Zähler jedoch abhängig vom Zugriff auf Datenentitäten erhöht werden, sodass die Zählerwerte am Ende des ersten Zeitintervalls Indikatoren dafür darstellen können, wie oft während dieses ersten Zeitintervalls auf verschiedene Datenentitäten zugegriffen wurde. Dagegen ändern sich die Elementwerte während eines Zeitintervalls typischerweise nicht.
-
Am Ende, nach dem Ende oder als Reaktion auf das Ende des ersten Zeitintervalls werden ein oder mehrere und bevorzugt alle der vorliegenden Elementwerte in der Gruppe von Elementen aktualisiert. Diese Aktualisierung beinhaltet, dass einem Einzelelement ein neuer Wert zugewiesen wird, wobei der neue Wert von einem Wert des Zählers, der dem Einzelelement zugeordnet ist, und vom vorliegenden Wert des Einzelelements abhängig ist.
-
Zur Bestimmung der Charakteristik einer spezifischen Datenentität an einem beliebigen Zeitpunkt wird die Gruppe von Elementen bevorzugt abgefragt. Hash-Funktionen, die der betreffenden Datenentität zugeordnet sind, werden angewandt und ergeben jeweils eine spezifische Untergruppe von Zählern und/oder eine spezifische Untergruppe von Elementen. Die Charakteristik kann aus den Werten der Elemente der Untergruppe von Elementen am gegebenen Zeitpunkt abgeleitet werden.
-
Es kann das zählende Bloomfilter auf relativ kurze Zeitintervalle angewandt werden, in denen das zählende Bloomfilter nicht Gefahr läuft, durch einen Zählerüberlauf blockiert zu werden. Die Datenstruktur mit der Gruppe von Elementen wird verwendet, um einen Durchschnitt von Zählerwerten über mehrere Zeitintervalle hinweg zu ermitteln. Bevorzugt stellt der vorliegende Wert eines Elements der Datenstruktur daher einen Durchschnitt vorheriger Zählerwerte am Ende von Zeitintervallen des zugeordneten Zählers dar. Nach Ablauf eines anderen Zeitintervalls wird der Zählerwert, der am Ende solch eines Zeitintervalls erreicht wurde, bevorzugt mit dem vorliegenden Durchschnittswert in Relation gesetzt. Bevorzugt wird dies erreicht, indem der vorliegende Elementwert mit einem Faktor nahe 1 gewichtet wird und indem der neue Zählerwert mit einem Faktor nahe null gewichtet wird und beide gewichteten Werte addiert werden. Dadurch wird nur ein einziges zählendes Bloomfilter benötigt, zusammen mit einer Datenstruktur, die langfristig gemittelte Zählerwerte enthält.
-
In dieser Hinsicht kann die Datenstruktur auch als „langfristig zählendes Bloomfilter” interpretiert werden, da sie Elementwerte enthält, die den zeitlichen Durchschnitt von zugeordneten Zählerwerten des zählenden Bloomfilters darstellen, wobei die Größe dieser Zähler des zählenden Bloomfilters begrenzt ist. Sobald das langfristig zählende Bloomfilter aktualisiert ist, wird das kurzfristig zählende Bloomfilter bevorzugt initialisiert, indem alle Zähler der Gruppe auf null zurückgesetzt werden, und ein nachfolgendes Zeitintervall wird gestartet. Die Charakteristik einer Datenentität kann bevorzugt bestimmt werden, indem ein minimaler Elementwert unter diesen Elementen ausgelesen wird, die durch Hash-Werte einer IRA der Datenentität indiziert sind.
-
Alternativ wird ein erstes zählendes Bloomfilter nur für ein begrenztes Zeitintervall angewandt, bevor ein anderes zählendes Bloomfilter für ein nachfolgendes Zeitintervall angewandt wird. Von den zwei oder mehr Bloomfiltern reflektiert jedes das Zugriffsverhalten auf entsprechende Datenentitäten während der zugeordneten Intervalle, wobei eine Routine zur Durchschnittswertermittlung bevorzugt die am Ende jedes Intervalls erreichten Ergebnisse der zählenden Bloomfilter mittelt, d. h., durchschnittliche Zählerwerte ermittelt, die die Ergebnisse mehrerer Bloomfilter im Zeitablauf darstellen. Es ist zudem anzumerken, dass die Ergebnisse der zählenden Bloomfilter gemittelt werden, indem die Zählerwerte jedes zählenden Bloomfilters gewählt werden, die der Datenentität entsprechen, deren Zugriffshäufigkeit bestimmt werden soll und deren Zählerwerte bevorzugt gemittelt werden können.
-
Es ist anzumerken, dass eine Erhöhung eines Zählers oder Zählerwerts auch jede andere Modifikation des Zählers oder Zählerwerts einschließen kann, die eine Schätzung der Zahl/Häufigkeit von Zugriffen auf die entsprechende Datenentität erlaubt.
-
Das zählende Bloomfilter kann bevorzugt für jedes Zeitintervall dieselbe Gruppe von k unabhängigen Hash-Funktionen verwenden, um die Zähler, die als ein Ergebnis gehashter Datenentitäten bestimmt werden, zu füllen. Die zählenden Bloomfilter und insbesondere das erste zählende Bloomfilter und das zweite zählende Bloomfilter können dieselbe Gruppe von k unabhängigen Hash-Funktionen verwenden, um die Zähler, die als ein Ergebnis gehashter Datenentitäten bestimmt werden, zu füllen.
-
Bevorzugt wird ein zählendes Bloomfilter über eine Abfragespanne hinweg erhalten, deren Abfragezahl das Zeitintervall definiert, in welchem das zählende Bloomfilter aktiv ist.
-
Das langfristig zählende Bloomfilter wird bevorzugt durch einen geglätteten oder exponentiell gleitenden Durchschnitt mehrerer oder aller früheren kurzfristig zählenden Bloomfilter dargestellt, wobei dieses langfristig zählende Bloomfilter als Wärmebild verwendet werden kann. Die Temperatur einer bestimmten Datenentität wird durch Abfragen des langfristig zählenden Bloomfilters erhalten. Auch hier bezeichnet eine Temperatur einer Datenentität ihre relative Abfragehäufigkeit, was Lese- oder Schreibzugriffe auf andere Datenentitäten im gleichen Speichersystem einschließen kann, wobei diese Temperatur eine der Charakteristika sein kann, deren Bestimmung in einem Speichersystem von Interesse ist. Insbesondere kann die ganze Temperaturinformation für ein gesamtes Speichersystem auch als Wärmebild bezeichnet werden. Eine Datenentität wird oft „heiß” genannt, wenn häufig auf sie zugegriffen wird, oder „kalt”, wenn selten auf sie zugegriffen wird oder sie selten aktualisiert wird. Die Temperatur ist ein quantitatives Maß dafür, wie oft und wie kürzlich auf eine Datenentität zugegriffen wurde. Eine Charakteristik, die auf der Zugriffshäufigkeit auf/einer Datenentität beruht, kann sich jedoch auf ihre absolute(n) Zugriffshäufigkeit/-zahlen beziehen.
-
Eine Beispieldatenentität kann bevorzugt ein Datenblock sein, der durch eine logische Blockadresse (LBA) adressiert wird.
-
In 1 wird eine zeitliche Abfolge von zählenden Bloomfiltern CBF1 bis CBF4 gezeigt, die einer Ausführungsform der vorliegenden Erfindung gemäß angewandt werden. Ein erstes zählendes Bloomfilter CBF1 wird während eines ersten Zeitintervalls t1–t0 angewandt, ein zweites zählendes Bloomfilter CBF2 wird während eines zweiten Zeitintervalls t2–t1 angewandt, ein drittes zählendes Bloomfilter CBF3 wird während eines dritten Zeitintervalls t3–t2 angewandt, und ein viertes zählendes Bloomfilter CBF4 wird während eines vierten Zeitintervalls t4–t3 angewandt. Insgesamt n zählende Bloomfilter CBF können angewandt werden, wobei jedes davon während eines zugeordneten Zeitintervalls aktiv ist. Dem ersten Aspekt der vorliegenden Erfindung gemäß können alle zählenden Bloomfilter CBF1 bis CBF4 physikalisch einem einzigen zählenden Bloomfilter CHF entsprechen, das wiederverwendet und direkt am Ende jedes Zeitintervalls neu gestartet wird, wobei dieser Neustart bevorzugt ein vorheriges Zurücksetzen seiner Zähler einschließt. Bevorzugt überschneiden sich die Zeitintervalle nicht, und ein nachfolgendes Zeitintervall folgt auf das vorherige Zeitintervall, ohne dass eine Lücke dazwischen liegt. Jedes Zeitintervall kann eine definierte begrenzte Länge haben, wobei diese definierte Länge zum Beispiel durch eine vordefinierte Zahl von Zugriffen während dieses Zeitintervalls dargestellt werden kann. Folglich müssen die verschiedenen Zeitintervalle nicht unbedingt die gleiche Länge haben. Die vordefinierte Zahl von Zugriffen kann gewählt werden, um eine größtmögliche zu sein, bevor eine Mehrheit der Zähler C des entsprechenden zählenden Bloomfilters CBF überläuft. Darüber hinaus kann selbst die Zahl der Zugriffe für Einzelzeitintervalle ungleich sein.
-
Daher wird eine mehrmalige Verwendung eines einzigen zählenden Bloomfilters oder, alternativ dazu, eine einmalige Verwendung von mehreren zählenden Bloomfiltern in Betracht gezogen, wobei jedes während eines spezifischen Zeitintervalls aktiv Ist, wie in 1 gezeigt. Beim letzteren Aspekt wird am Anfang jedes Zeitintervalls ein neues zählendes Bloomfilter CBFx initialisiert, indem alle Zähler dieses zählenden Bloomfilters CBF auf null gesetzt werden. Beim ersten Aspekt wird das einzige zählende Bloomfilter initialisiert, indem alle Zähler dieses zählenden Bloomfilters CBF am Anfang jedes neuen Zeitintervalls auf null gesetzt werden.
-
Ein erstes zählendes Bloomfilter CBF1 wird in 2 gezeigt. Eine Anzahl m von ersten Zählern C1 0 bis C1 m-1 bilden eine Gruppe S1 von ersten Zählern, die dem ersten zählenden Bloomfilter CBF1 zugeordnet ist. Ein Eingabewert, der im vorliegenden Fall eine logische Blockadresse LBA sein kann, die eine Datenentität darstellt, wird bevorzugt durch mehrere Hash-Funktionen h1(LBA), h2(LBA), ... hk(LBA) – mit k = 2 im vorliegenden Beispiel – auf k erste Zähler C1 aus der Gruppe S1 der m ersten Zähler C1 abgebildet. Dies bedeutet, dass im vorliegenden Fall zwei verschiedene Hash-Funktionen für jede LBA verwendet werden, sobald von einen Host, vom Speichersystem selbst oder von einer anderen Entität auf solch eine LBA zugegriffen wird. Im vorliegenden Beispiel wird die LBA mit dem Wert 1 in die ersten Zähler C1 0 und C1 m-1 gehasht. Die LBA mit dem Wert 4 wird in die ersten Zähler C1 1 und C1 4 gehasht. Die LBA mit dem Wert 5 wird in die ersten Zähler C1 3 und C1 5 gehasht. Daher ist jedem Dateneintrag, der durch eine IRA dargestellt wird, eine Untergruppe von zwei ersten Zählern C1 aus der Gruppe S1 der ersten Zähler C1 zugeordnet. Bei jedem Zugriff auf eine IRA werden die entsprechenden ersten Zähler C1 ihrer Untergruppe inkrementiert. Wenn k Hash-Funktionen angewandt werden, um das erste zählende Bloomfilter CBF1 aufzubauen, d. h., um jeden Dateneintrag auf k erste Zähler C1 abzubilden, besteht eine Untergruppe von ersten Zählern C1 typischerweise aus k ersten Zählern C1. In einer anderen Ausführungsform wird nur ein einziger erster Zähler C1 aus der Untergruppe von ersten Zählern C1 bei jedem Zugriff auf die entsprechende Datenentität inkrementiert, der bevorzugt der erste Zähler C1 aus der Untergruppe von ersten Zählern C1 mit dem niedrigsten Wert ist. Solch eine Ausführungsform zielt darauf ab, in diesem kurzfristigen CBF mehr Zugriffe zuzulassen, ohne dass ein Überlauf seiner Zähler auftritt, und die Genauigkeit der Häufigkeitsschätzung zu erhöhen.
-
Das erste zählende Bloomfilter nach 2 kann in der Anwendung mit einem einzigen zählenden Bloomfilter wiederholt verwendet werden.
-
Ein zweites zählendes Bloomfilter CBF2, wie es in der Anwendung mit mehreren zählenden Bloomfiltern verwendet werden kann, wird in 3 gezeigt. Grundsätzlich ist das zweite zählende Bloomfilter in seiner Struktur mit dem ersten zählenden Bloomfilter CBF1 identisch. Eine Gruppe S2 von m zweiten Zählern C2 enthält zweite Zähler CP0 bis C2 m-1, die dem zweiten zählenden Bloomfilter CBF2 zugeordnet sind. Der Eingabewert, der wieder eine logische Blockadresse IRA ist, auf die während eines zweiten Zeitintervalls zugegriffen wird, in welchem das zählende Bloomfilter CBF2 aktiv ist, wird durch dieselben k Hash-Funktionen wie die, die im ersten zählenden Bloomfilter CBF1 verwendet werden, d. h., Hash-Funktionen h1(LBA), h2(LBA), ... hk(LBA) – mit k = 2 – auf zweite Zähler C2 aus der Gruppe S2 von m zweiten Zählern C2 abgebildet. Zwei verschiedene Hash-Funktionen werden im vorliegenden Falle für jede LBA verwendet, sobald von einem Host, vom Speichersystem selbst oder von einer anderen Entität auf solch eine LBA zugegriffen wird. Im vorliegenden Beispiel wird die LBA mit dem Wert 1 in zweite Zähler C2 0 und C2 m-1 gehasht. Die LBA mit dem Wert 4 wird in zweite Zähler C2 1 und C2 4 gehasht. Die LBA mit dem Wert 5 wird in zweite Zähler C2 3 und C2 5 gehasht. Daher ist jedem Dateneintrag, der durch eine LBA dargestellt wird, eine Untergruppe von zwei zweiten Zählern C2 aus der Gruppe S2 von m zweiten Zählern C2 zugeordnet. Bei jedem Zugriff auf eine LBA werden die entsprechenden zweiten Zähler C2 ihrer Untergruppe inkrementiert. Wenn k Hash-Funktionen angewandt werden, um das zweite zählende Bloomfilter CBF2 aufzubauen, d. h., um jeden Dateneintrag auf k zweite Zähler C2 abzubilden, besteht eine Untergruppe von zweiten Zählern C2 typischerweise aus k zweiten Zählern C2. In einer anderen Ausführungsform wird nur ein einziger zweiter Zähler C2 aus der Untergruppe von zweiten Zählern C2 bei jedem Zugriff auf die entsprechende Datenentität inkrementiert, der bevorzugt der zweite Zähler C2 aus der Untergruppe von zweiten Zählern C2 mit dem niedrigsten Wert ist. Solch eine Ausführungsform zielt darauf ab, in diesem kurzfristigen CBF mehr Zugriffe zuzulassen, ohne dass ein Überlauf seiner Zähler auftritt, und die Genauigkeit der Häufigkeitsschätzung zu erhöhen.
-
Im vorliegenden Beispiel wird das zweite Zeitintervall, in welchem das zweite zählende Bloomfilter angewandt wird, definiert, indem die gleiche Zahl von Datenentitätzugriffen zugelassen wird wie die, die verwendet wurde, um die Länge des ersten Zeitintervalls zu definieren.
-
Auf gleiche Weise können n kurzfristig zählende Bloomfilter CBF angewandt werden, um ein großes Zeitintervall gemäß
1 entsprechend abzudecken. Bevorzugt werden die Zählerwerte jedes Zählers eines zählenden Bloomfilters CBF am Ende seines zugeordneten Zeitintervalls gespeichert. Wenn
C j / i der Wert des i-ten Zählers im i-ten zählenden Bloomfilter CBF ist, kann der Wert des i-ten Zählers C
i des langfristig zählenden Bloomfilters CBF erhalten werden, indem die
C j / i in allen kurzfristig zählenden Bloomfiltern CBF
1 bis CBF
n gemittelt werden, nämlich
-
Der resultierende Zählerwert Ci kann dann als Temperatur einer zugehörigen Datenentität verwendet werden. Durch Bestimmen aller Zählerwerte C0 bis Cm-1 kann ein Wärmebild des betreffenden Speichersystems erhalten werden. Solch ein Zählerwert Ci kann auch allgemeiner als ein Element einer Datenstruktur bezeichnet werden, wobei diese Datenstruktur die Mittelung der Einzelzählerwerte unterstützt. Die Temperatur einer spezifischen Datenentität kann bestimmt werden, indem ihre LBA k mal gehasht wird, was eine Untergruppe von k Zählerwerten aus C0 bis Cm-1 ergibt und auch als langfristig zählendes Bloomfilter bezeichnet wird, und der Minimalwert aus der Untergruppe von k Zählerwerten als die geschätzte Temperatur der entsprechenden Datenentität genommen wird.
-
Zur Realisierung eines langfristig zählenden Bioomfilters kann ein geglätteter oder exponentiell gleitender Durchschnitt aller früheren Werte kurzfristig zählender Bloomfilter verwendet werden. Als Ergebnis braucht nur das einzige kurzfristig zählende Bloomfilter CBF verfolgt zu werden. Das einzige kurzfristig zählende Bloomfilter CBF wird für jede neue Epoche, d. h., jedes neuen Zeitintervall wiederverwendet und am Anfang dieser Epoche initialisiert, d. h. seine Zähler C
i werden auf null gesetzt. Auch hier bezeichnet
C j / i den Wert des i-ten Zählers der Gruppe von Zählern, der am Ende des letzten Zeitintervalls j erreicht wurde, wobei dieses Zeitintervall j gerade erst abgelaufen sein kann. Es ist anzumerken, dass die Zählerwerte früherer Zeitintervalle nicht mehr verfügbar sind, da nur ein einziges zählendes Bloomfilter verwendet wird. Der aktualisierte Wert des i-ten Elements C
i der Gruppe von Elementen kann durch Gewichten des zugeordneten Zählerwerts
C j / i und durch Addieren des gewichteten vorliegenden Werts des i-ten Elements C
i erhalten werden, zum Beispiel anhand einer der folgenden Regeln:
Ci = αCi + (1 – α)C j / i wobei α, j Gewichtungsfaktoren sind, die typischerweise auf 0,75–0,95 gesetzt sind. Diese Operation wird bevorzugt für alle Elemente C
i aus der Gruppe für Elemente C
0 bis C
m-1 durchgeführt, was m Elementwerte ergibt. Sobald das aktuelle kurzfristig zählende Bloomfilter CBF in die zugeordnete Gruppe von Elementen gemischt wurde, werden alle seine Zähler auf null zurückgesetzt. Daher kann nur ein einziges zählendes Bloomfilter verwendet werden, um Datenentitätszugriffe für das aktuelle Zeitintervall abzudecken. Nach Ablauf des Zeitintervalls wird die zugehörige Datenstruktur aktualisiert, indem die Zählerwerte auf die zugeordneten Elementwerte angewandt werden. Dann wird das zählende Bloomfilter initialisiert, indem all seine Zähler auf null zurückgesetzt werden, und ein neues Zeitintervall wird gestartet, in welchem das zählende Bloomfilter von neuem betrieben wird.
-
Auf diese Weise wird nur ein einziges kurzfristig zählendes Filter und eine Datenstruktur benötigt, und dadurch wird der RAM-Bedarf drastisch gesenkt.
-
Die Vorteile der periodisch aktualisierten Datenstruktur sind zweifach. Erstens erfordert sie nur eine Hauptspeichergröße für zwei gespeicherte zählende Bloomfilter CBFs, wodurch der Speicherbedarf drastisch gesenkt wird. Zweitens können sich die vorgeschlagenen langfristig zählenden Bloomfilter CBF dank der Verwendung des exponentiell gleitenden Durchschnitts an die veränderliche Auslastungsdynamik anpassen.
-
Eine genaue Schätzung der Temperatur einer gegebenen Datenentität kann dazu beitragen, die Leistung und/oder Kostenwirksamkeit von Speichersystemen zu verbessern. Diese Information kann in einem oder mehreren von einem Cache, einem mehrschichtigen Speichersystem oder einem Gerät auf Flashspeicherbasis integriert werden. Zum Beispiel können „heiße” Daten, sobald sie erkannt werden, in einen Cache gestellt werden, um eine Cache-Trefferrate und somit die Leistung zu erhöhen. Ein hierarchisches, d. h., ein mehrschichtiges Speichersystem besteht mindestens aus zwei Speichermedien: eines ist typischerweise teuer, aber schnell, während das andere typischerweise billig, aber langsamer ist. „Heiße” Daten können, sobald sie erkannt werden, auf dem teuren, aber schnellen Speichermedium in einer ersten Schicht des mehrschichtigen Speichersystems gespeichert werden, während „kalte” Daten auf dem billigeren, aber langsameren Speichermedium mit größerer Kapazität in einer zweiten Schicht des mehrschichtigen Speichermediums gespeichert werden können, um eine höhere Leistung zu niedrigeren Kosten anzustreben. Wenn ein Flashspeichergerät als Speichermedium verwendet wird, können Daten mit ähnlicher Aktualisierungshäufigkeit bevorzugt in derselben Flash-Löscheinheit gespeichert sein, um den Schreibfaktor zu minimieren.
-
Dieser Ansatz ist auf jedes System anwendbar, das aus der Verfolgung des Werts einer Metrik/Charakteristik für eine sehr große Population von Datenentitäten über lange Zeit hinweg Nutzen ziehen kann, während eine sehr kleine Menge an Speicherplatz in Anspruch genommen wird.
-
In einer bevorzugten Ausführungsform der vorliegenden Erfindung kann das vorliegende Verfahren zum selektiven Füllen eines Caches angewandt werden und kann bevorzugt auch für Entscheidungen über die Entfernung von Blöcken aus dem Cache angewandt werden. Ein Cache ist typischerweise ein Teil des Speicherplatzes, der Datenentitäten enthält, auf welche häufig zugegriffen wird, um durch Vermeidung von Mehrfachzugriffen auf das zugrunde liegende Speichermedium Zugriffslatenzen zu reduzieren. Ein Cache kann als Lese-Cache, Schreib-Cache oder kombinierter Lese-und-Schreib-Cache realisiert sein.
-
Insbesondere, wenn ein Cache auf Flashspeicher realisiert ist, ist das Filtern der Datenentitäten, mit denen der Cache gefüllt wird, kritisch: das Füllen des Caches mit „kalten” Datenentitäten belastet nicht nur den Cache und kann potentielle „heiße” Datenentitäten aus dem Cache verdrängen, sondern kann auch zu einer großen Zahl von Flash-Schreibvorgängen führen, die typischerweise zufällig sind. Letzteres führt zu einer Cache-Leistung, die viel geringer ist, da der Durchsatz des Caches stark verringert wird und die Latenzzeit anderer Lese-und-Schreib-Anforderungen, die parallel ausgeführt werden, zunimmt. Überdies führt eine hohe Schreibrate in den Flash-Cache zum früheren Verschleiß des Flash-Chips und somit zu einer kürzeren Lebensdauer der Einheit.
-
Das vorliegende Verfahren kann zur effektiven Verwaltung eines Caches verwendet werden, indem es ein langfristig zählendes Bloomfilter CBF verwendet, d. h., ein Mittel zur Durchschnittswertermittlung an Zählerwerten, die von zählenden Bloomfiltern stammen, die in begrenzten Zeitperioden angewandt werden. Ein entsprechender Speichercontroller kann ein langfristiges CBF über den ganzen Adressraum des Speichersystems hinweg mit Blockgranularität verwalten, wobei eine Datenentität einem Datenblock entspricht, d. h., die Temperatur aller Blöcke im System wird verfolgt. Bei jedem Zugriff auf einen Block aktualisiert das System dessen Temperatur im kurzfristigen CBF. Gleichzeitig kann der Speichercontroller bevorzugt die niedrigste Temperatur verfolgen, die in Datenböcken des Caches gefunden wird.
-
Wenn in Antwort auf eine Zugriffsanforderung auf einen Datenblock dieser Datenblock im Cache gefunden wird, wird sie vom Cache bedient. Angenommen, dass der Zugriff auf einen Datenblock angefordert wurde und dieser nicht im Cache gefunden wird, liest das System den Block aus dem zugrunde liegenden Speichermedium, das in einer Ausführungsform eine Festplattengruppe sein kann. Dann verwendet der Speichercontroller das aktuelle kurzfristig zählende Bloomfilter CBF und das langfristig zählende Bloomfilter CBF, um eine Messung der Temperatur des Blocks zu erhalten. Wenn diese Temperatur höher ist als die Mindesttemperatur im Cache, wird der Block in den Cache zugelassen, d. h., eine Kopie des Blocks wird in den Cache geschrieben, und insbesondere in den Flashspeicher, wenn der Cache als Flashcache ausgeführt ist. Andernfalls wird der Block an den Benutzer ausgegeben, aber nicht im Cache gespeichert.
-
Wenn ein Block in den Cache zugelassen wird, kann es vorkommen, dass der Cache voll ist, das heißt, dass ein Block entfernt werden muss, bevor der neue Block in den Cache geschrieben werden kann. Dann kann das System das zählende Bloomfilter CBF verwenden oder nicht, um einen Block zu wählen, der aus dem Cache entfernt werden soll. Im ersteren Fall wird der Block mit der geringsten Temperatur im Cache zur Entfernung gewählt. Im letzteren Fall kann das System eine andere bestehende Seitenersetzungsrichtlinie verwenden, um einen zu entfernenden Block zu wählen. Diese Richtlinie kann auf einem oder mehreren von einer Neuheit der Zugriffe, der Zugriffshäufigkeit oder einem beliebigen anderen Kriterium basieren, das der Entwickler für geeignet hält. Ein Vorteil dieses Ansatzes ist, dass die Interna des Caches nicht modifiziert zu werden brauchen.
-
In einer anderen Ausführungsform kann ein Speichersystem einen Speichercontroller und mehrschichtige Speichermedien umfassen. Ein derartiges System wird auch als mehrschichtiges Speichersystem bezeichnet. Auch Speichersysteme mit mehreren Schichten persistenten Speichers können hinsichtlich der Leistung und Kapazität vom vorliegenden Ansatz profitieren. In einem typischen mehrschichtigen Speichersystem sind die Speichermedien ihren Leistungseigenschaften entsprechend geordnet. Je höher die Leistung eines Speichermediums ist, umso teurer ist es natürlich pro Speichereinheit, und umso geringer wird daher seine Kapazität sein. Ein derartiges System wird im Diagramm von 4 gezeigt. In diesem Beispiel schließt das System vier Schichten T0–T3 ein, mit einem Bandspeicher um, der das langsamste Medium mit der größten Kapazität in der untersten Schicht T0 ist, während ein Flashspeichermedium das schnellste Speichermedium mit der geringsten Kapazität unter den vorhandenen Speichermedien ist und in der obersten Schicht T3 liegt. Zwischen den zwei Extremen liegen zwei Schichten T2 und T1 mit Magnetplatten; die zweitoberste Schicht T2 umfasst zum Beispiel SAS-Festplatten, die in einem RAID 5-Array konfiguriert sind, während die zweitunterste Schicht T1 zum Beispiel SATA-Festplatten umfasst, die in einem RAID 6-Array konfiguriert sind. Wenn man die Hierarchie von Schicht T0 zu Schicht T3 durchgeht, verbessert sich die Leistung sowohl hinsichtlich der Latenzzeit als auch hinsichtlich des Durchsatzes, während die Kapazität kleiner wird.
-
In mehrschichtigen Speichersystemen entspricht die Gesamtkapazität des Speichersystems typischerweise der Summe der Kapazitäten der Einzelschichten. Dies bedeutet, dass alle Schichten vom System als persistenter Speicher benutzt werden und kein Block in mehr als einer der Schichten gleichzeitig zu finden ist.
-
Insbesondere wird keine der Schichten als Cache in der Hierarchie verwendet. Natürlich kann eine Datenentität von einer Schicht zu einer anderen Schicht umgelagert werden. Um eine maximale Leistung zu erreichen, strebt der Speichercontroller solch eines mehrschichtigen Speichersystems an, Datenböcke mit der heißesten Temperatur auf den schnellsten Schichten zu speichern, während Datenböcke mit der kältesten Temperatur zu den langsameren Schichten nach unten verlagert werden.
-
In einem derartigen mehrschichtigen Speichersystem kann der vorliegende Ansatz zur Bestimmung der Temperaturen von Datenentitäten angewandt werden, indem die Temperatur über den gesamten Adressraum des Speichersystems mit Datenblockgranularität bestimmt wird, d. h., die Temperatur aller Datenböcke im Speichersystem wird mithilfe von zählenden Bloomfiltern verfolgt. Bei jedem Zugriff auf einen Datenblock aktualisiert das System dessen Temperatur im kurzfristig zählenden Bloomfilter CBF. Gleichzeitig kann das System die höchste(n) und die niedrigste(n) Temperatur(en) verfolgen, die in jeder Schicht des Systems gefunden werden.
-
Bei jedem Zugriff auf einen Block, der aktuell auf einer Schicht j gespeichert ist, kann das System das aktuelle kurzfristig zählende Bloomfilter CBF und das langfristig zählende Bloomfilter CBF verwenden, um eine Messung der Temperatur des Blocks zu erhalten. Wenn diese Temperatur höher ist als die niedrigste Temperatur in der Schicht j + 1, wird für diesen Block eine Umlagerung von der Schicht j zur Schicht j + 1 ausgelöst. Gleichzeitig wird der Block mit der niedrigsten Temperatur von der Schicht j + 1 zur Schicht j zurückversetzt, da angenommen wird, dass die Schicht j + 9 voll ist, d. h., alle ihre Blöcke zugewiesen worden sind. Es ist anzumerken, dass der Block als Alternative zu einer beliebigen Schicht j' > j + 1 verschoben werden kann, wenn sich herausstellt, dass seine Temperatur höher ist als die niedrigste Temperatur der Schicht j'. Ein Block wird bevorzugt zu einer niedrigeren Schicht zurückversetzt, wenn er durch einen anderen Block ersetzt wird, d. h., wenn sich herausstellt, dass er der kälteste Block in seiner aktuellen Schicht ist. Wenn am Anfang ein neuer Block zugewiesen wird, wird er in der obersten Schicht angeordnet, die noch nicht voll ist.
-
5 zeigt ein Flussdiagramm, das ein Verfahren nach einer Ausführungsform der vorliegenden Erfindung darstellt. In Schritt SO wird das Verfahren gestartet, indem ein Index I des zählenden Bloomfilters auf 1 gesetzt wird. In Schritt S1 wird ein erstes zählendes Bloomfilter – dem Index i = 1 gemäß -initialisiert, indem alle Zähler des ersten zählenden Bloomfilters auf 0 gesetzt werden. In Schritt S2 wird eine neue Zugriffsanforderung auf eine Datenentität des vorliegenden Speichermediums empfangen. In Schritt S3 wird geprüft, ob ein erstes Zeitintervall, das dem ersten zählenden Bloomfilter zugeordnet ist, abgelaufen ist. Wenn das erste Intervall nicht abgelaufen ist (N), wird die Datenentität oder ihre jeweilige Kennung wie z. B. die LBA dem ersten zählenden Bloomfilter zugeführt, und die Untergruppe der entsprechenden Zähler, die erkannt wird, indem die vorliegende LBA mithilfe von k Hash-Funktionen gehasht wird, wird in Schritt S4 inkrementiert. In Schritt 85 kann die Zugriffsanforderung bedient werden, und optional werden die Zähler der Untergruppe in Schritt S6 analysiert, um mit einem niedrigsten Temperaturwert einer Datenentität in einem Cache des Speichersystems verglichen zu werden. Dann fährt das Speichersystem mit Schritt S2 fort und wartet auf/empfängt eine neue Datenzugriffsanforderung.
-
Wenn das erste Intervall in Schritt S3 abgelaufen/beendet ist (J), werden die Zählerwerte des ersten zählenden Bloomfilters in Schritt S7 gespeichert, und in Schritt S8 werden aus allen vorherigen Zählerwerten neue Durchschnittszählerwerte bestimmt. Im nächsten Schritt S9 wird der Index des zählenden Bloomfilters inkrementiert, und in Schritt S1 wird ein nächstes zählendes Bloomfilter initialisiert, d. h., laut Index das zweite zählende Bloomfilter.
-
6 zeigt ein Flussdiagramm, das ein anderes Verfahren nach einer Ausführungsform der vorliegenden Erfindung darstellt. In Schritt SO wird das Verfahren gestartet, und x Elemente einer Datenstruktur, die x Zählern eines zählenden Bloomfilters entsprechen, werden auf null gesetzt. In Schritt S1 wird das zählende Bloomfilter initialisiert, indem alle x Zähler des zählenden Bloomfilters auf null gesetzt werden, und das zählende Bloomfilter wird gestartet, um während eines definierten Zeitintervalls betrieben zu werden, wobei dieses Zeitintervall in Schritt S1 gestartet wird. In Schritt S2 wird eine neue Zugriffsanforderung auf eine Datenentität des vorliegenden Speichermediums empfangen. In Schritt 83 wird geprüft, ob das Zeitintervall, in welchem das zählende Bloomfilter betrieben wird, bereits abgelaufen ist. Wenn das Intervall nicht abgelaufen ist (N), wird die Datenentität oder ihre jeweilige Kennung wie z. B. die LBA dem zählenden Bloomfilter zugeführt, und Zähler einer Untergruppe von Zählern, die erkannt werden, indem die betreffende LBA mithilfe von k Hash-Funktionen gehasht wird, werden in Schritt S4 inkrementiert. In Schritt S5 kann die Zugriffsanforderung bedient werden, und optional werden die Zähler der Untergruppe in Schritt S6 analysiert, um mit einem niedrigsten Temperaturwert einer Datenentität in einem Cache des Speichersystems verglichen zu werden. Dann fährt das Speichersystem mit Schritt S2 fort und wartet auf/empfängt eine neue Datenzugriffsanforderung.
-
Wenn das Intervall in Schritt S3 abgelaufen/beendet ist (J), was zum Beispiel bestimmt werden kann, wenn eine definierte Zahl von Datenentitätszugriffen erreicht worden ist, werden in Schritt S7 neue Werte von Elementen der Datenstruktur auf der Basis der vorliegenden Zählerwerte bestimmt und auf der Basis der vorliegenden Elementwerte des ersten zählenden Bloomfilters gespeichert. Bevorzugt wird für jedes Element in der Datenstruktur ein neuer Wert bestimmt, da jedes Element einem Zähler des zählenden Bloomfilters entspricht. Die neuen Elementwerte werden in Schritt S8 gespeichert. Im folgenden Schritt S1 werden die Zählerwerte zurückgesetzt, und ein neues Zeitintervall wird gestartet. Die anstehende Zugriffsanforderung kann temporär gespeichert worden sein und kann während des neuen Zeitintervalls ausgeführt werden.