Heim  >  Artikel  >  Datenbank  >  Chat MySQL-Speicherverwaltung, Speicherzuweisung und Betriebssysteme

Chat MySQL-Speicherverwaltung, Speicherzuweisung und Betriebssysteme

coldplay.xixi
coldplay.xixinach vorne
2021-01-08 09:35:411873Durchsuche

Chat MySQL-Speicherverwaltung, Speicherzuweisung und Betriebssysteme

Empfohlen (kostenlos): MySQL-Video-Tutorial

Wenn Benutzer bei der Verwendung einer Software (einschließlich MySQL) auf Speicherprobleme stoßen, ist unsere erste Reaktion ein Speicherverlust. Wie dieser Artikel zeigt, ist das nicht immer der Fall.

Dieser Artikel erklärt einen Fehler im Speicher.

Alle Percona-Support-Kunden haben Anspruch auf Fehlerbehebungen, aber ihre Optionen variieren. Beispielsweise wird Advanced+ Kunden ein HotFix-Build vor der öffentlichen Veröffentlichung der Software mit dem Patch angeboten Sie müssen nicht einmal Percona-Software verwenden: Wir können unsere Patches für sie in den Upstream portieren. Aber für Percona-Produkte haben alle Supportstufen das Recht, einen Fix zu erhalten.

Alle von Percona unterstützten Kunden haben Anspruch auf Fehlerbehebungen, aber das haben sie auch verschiedene Optionen. VIP-Kunden können beispielsweise die Hotfix-Version erhalten, bevor der Software-Patch offiziell veröffentlicht wird. Premium-Kunden müssen nicht einmal die Software von Percona verwenden. Wir können den Patch auch im Upstream veröffentlichen. Bei Percona-Produkten haben jedoch alle Supportstufen Anspruch auf Fehlerbehebungen.

Dennoch bedeutet dies nicht, dass wir jedes unerwartete Verhalten beheben, selbst wenn wir dieses Verhalten als gültigen Fehler akzeptieren. Einer der Gründe für eine solche Entscheidung könnte sein, dass das Verhalten bei Percona-Produkten zwar eindeutig falsch ist, dies jedoch der Fall ist ist immer noch eine Funktionsanfrage.

Dies bedeutet jedoch nicht, dass wir alle unerwarteten Situationen beheben, selbst wenn wir diese Situation als gültigen Fehler akzeptieren. Einer der Gründe für eine solche Entscheidung könnte sein, dass diese unerwartete Situation zwar eindeutig falsch ist, es sich jedoch tatsächlich um eine Produktanforderung für das Percona-Produkt selbst handelt

Ein Fehler als Lernfall

Ein gutes aktuelles Beispiel für einen solchen Fall ist PS-5312 – der Fehler ist mit Upstream reproduzierbar und wird unter bugs.mysql.com/95065 gemeldet. Ein aktueller guter Fall ist PS-5312 – dieser Fehler kann mit Upstream reproduziert und unter bugs.mysql.com gemeldet werden /95065.

Hier wird eine Situation gemeldet, in der der Zugriff auf InnoDB-Volltextindizes zu einem Anstieg der Speichernutzung führt. Sie beginnt, wenn jemand einen Volltextindex abfragt, wächst bis zu einem Maximum und wird für längere Zeit nicht freigegeben.

Dieser Bericht erklärt einen In In diesem Fall erhöht sich die Speichernutzung beim Zugriff auf den Volltextindex von InnoDB. Diese Situation tritt bei einigen Volltextindexabfragen auf. Der Speicher wächst weiter, bis er den Maximalwert erreicht, und wird für längere Zeit nicht freigegeben.

Yura Sorokin vom Percona Engineering Team hat untersucht, ob es sich um einen Speicherverlust handelt, und festgestellt, dass dies nicht der Fall ist.

Yura Sorokin vom Percona Engineering Team hat untersucht, ob es sich um einen Speicherverlust handelt, und festgestellt, dass dies nicht der Fall ist.

Wenn InnoDB eine Volltextabfrage auflöst, erstellt es einen Speicher-Heap in der Funktion fts_query_phrase_search. Dieser Heap kann bis zu 80 MB groß werden. Darüber hinaus verfügt er über eine große Anzahl von Blöcken (mem_block_t), die nicht immer kontinuierlich verwendet werden, was wiederum dazu führt, dass InnoDB eine Volltextabfrage auflöst. führt zu Speicherfragmentierung.

Wenn InnoDB eine Volltextabfrage analysiert, erstellt es einen Speicherheap in der Funktion fts_query_phrase_search, der auf 80 MB anwachsen kann. Darüber hinaus verwendet dieser Prozess auch eine große Anzahl nicht zusammenhängender Blöcke (mem_block_t), was zu einer Speicherfragmentierung führt.

Im Funktionsexit wird der Speicherheap für jeden der zugewiesenen Blöcke freigegeben. Am Ende der Funktion ruft es free() auf, das zu einer der Speicherzuweisungsbibliotheken gehört, z. B. malloc oder jemalloc . Aus mysqld-Sicht ist alles richtig gemacht: Es gibt keinen Speicherverlust.fts_query_phrase_search函数中创建一个内存堆,这个堆可能增长到80M。另外,这个过程还会使用到大量非连续块(mem_block_t)进而产生的内存碎片。

In the function exit , the memory heap is freed. InnoDB does this for each of the allocated blocks. At the end of the function, it calls free() which belongs to one of the memory allocator libraries, such as malloc or jemalloc. From the mysqld point of view, everything is done correctly: there is no memory leak.

在函数出口,这些内存堆会被释放。InnoDB会为其分配的每一个块做这个操作。在函数执行结束时,调用一个内存分配器库中的free()操作,比如malloc或者jemalloc

Beim Beenden der Funktion werden diese Speicherheaps freigegeben. InnoDB führt dies für jeden Block durch, den es zuweist. Rufen Sie am Ende der Funktionsausführung eine free()-Operation in einer Speicherzuweisungsbibliothek auf, z. B. malloc oder jemalloc. Aus Sicht von MySQL selbst ist dies kein Problem und es liegt kein Speicherverlust vor.

Obwohl free() beim Aufruf Speicher freigeben sollte, ist es nicht erforderlich, ihn an das Betriebssystem zurückzugeben. Wenn der Speicherzuweiser entscheidet, dass dieselben Speicherblöcke bald benötigt werden, behält er sie möglicherweise trotzdem für den MySQL-Prozess . Dies erklärt, warum Sie möglicherweise feststellen, dass mysqld nach Abschluss des Auftrags immer noch viel Speicher verbraucht.

Allerdings sollte die Funktion free() tatsächlich den Speicher freigeben, wenn sie aufgerufen wird, was jedoch nicht der Fall ist Sie müssen es an das Betriebssystem zurückgeben. Wenn der Speicherzuweiser feststellt, dass diese Speicherblöcke sofort benötigt werden, werden sie für den mysqld-Prozess reserviert. Dies erklärt, warum mysqld immer noch viel Speicher beansprucht, nachdem es seine Arbeit abgeschlossen und den Speicher freigegeben hat. 🎜

Dies stellt in der Praxis kein großes Problem dar und sollte keinen Schaden anrichten. Wenn Sie jedoch eine schnellere Rückgabe des Speichers an das Betriebssystem benötigen, können Sie alternative Speicherzuweiser wie Jemalloc ausprobieren. Letzteres hat sich als Lösung erwiesen mit PS-5312.

Dies stellt in der tatsächlichen Produktion kein großes Problem dar und sollte keine Unfälle verursachen. Wenn Sie jedoch schneller Speicher an das Betriebssystem zurückgeben müssen, können Sie einen nicht-traditionellen Speicherzuweiser wie jemallolc ausprobieren. Es löst nachweislich das Problem von PS-5312. jemallolc。它被证明可以解决PS-5312<链接5>的问题。

Another factor which improves memory management is the number of CPU cores: the more we used for the test, the faster the memory was returned to the operating system. This, probably, can be explained by the fact that if you have multiple CPUs, then the memory allocator can dedicate one of them just for releasing memory to the operating system.

另一个改善内存管理的因素是cpu内核数量:在测试中,cpu核数越多,内存返回给操作系统的速度会越快。这可能是你拥有多个CPU,而其中一个可专门用作内存分配器释放内存给操作系统。

The very first implementation of InnoDB full text indexes introduced this flaw. As our engineer Yura Sorokin found:

  • The very first 5.6 commit which introduces Full Text Search Functionality for InnoDB WL#5538: InnoDB Full-Text Search Support – https://dev.mysql.com/worklog/task/?id=5538

  • Implement WL #5538 InnoDB Full-Text Search Support, merge – https://github.com/mysql/mysql-server/commit/b6169e2d944 – also has this problem.

正如我们的工程师Yura Sorokin所发现的一样,下面两点阐述了InnoDB全文索引的早期实现引入了这个缺陷:

  • 5.6版本MySQL最早对InnoDB WL全文索引功能引入的介绍:#5538: InnoDB全文搜索支持 – https://dev.mysql.com/worklog/task/?id=5538

  • 实现WL #5538 InnoDB全文搜索支持与合并 - https://github.com/mysql/mysql-server/commit/b6169e2d944 - 也存在同样的问题问题

修复方法

We have a few options to fix this:

  1. Change implementation of InnoDB fulltext index

  2. Use custom memory library like jemalloc

Both have their advantages and disadvantages.

我们有两种方法来修复这个问题:

1.修改InnoDB全文索引的实现

2.使用自定义内存库,例如jemalloc

Ein weiterer Faktor, der die Speicherverwaltung verbessert, ist die Anzahl der CPU-Kerne: Je mehr wir für den Test verwendet haben, desto schneller wurde der Speicher an das Betriebssystem zurückgegeben. Dies kann wahrscheinlich dadurch erklärt werden, dass Sie über mehrere CPUs verfügen , dann kann der Speicherzuweiser einen davon nur für die Freigabe von Speicher für das Betriebssystem reservieren.

Ein weiterer Faktor, der die Speicherverwaltung verbessert, ist die Anzahl der CPU-Kerne: In Tests gilt: Je mehr CPU-Kerne, desto schneller wird der Speicher an den Betrieb zurückgegeben System wird schneller sein. Es ist möglich, dass Sie über mehrere CPUs verfügen und eine davon ausschließlich als Speicherzuweisung verwendet werden kann, um Speicher für das Betriebssystem freizugeben.

Die allererste Implementierung von InnoDB-Volltextindizes führte zu diesem Fehler. Wie unser Ingenieur Yura Sorokin herausfand:

  • Der allererste 5.6-Commit, der Full einführt Textsuchfunktion für InnoDB WL#5538: Unterstützung der InnoDB-Volltextsuche – https://dev.mysql.com/worklog/task/?id=5538

  • Implementieren Sie WL #5538 InnoDB Full- Textsuchunterstützung, Zusammenführung – https://github.com/mysql/mysql-server/commit/b6169e2d944 – hat auch dieses Problem.

Wie unsere Ingenieure As Yura Sorokin entdeckte, veranschaulichen die folgenden zwei Punkte, dass die frühe Implementierung des InnoDB-Volltextindex diesen Fehler verursachte:

  • Die Version 5.6 von MySQL war Der erste, der InnoDB einführte Einführung in die Einführung der WL-Volltextindizierungsfunktion: #5538: InnoDB-Volltextsuchunterstützung – https://dev.mysql.com/worklog/task/?id=5538

  • Implementierung von WL #5538 InnoDB-Volltextsuche, Unterstützung und Fusion – https://github.com/mysql/mysql-server/commit/b6169e2d944 – Das gleiche Problem besteht auch

Methode reparieren

Wir haben ein paar Möglichkeiten, dieses Problem zu beheben:

  1. Implementierung des InnoDB-Volltextindex ändern
  2. Benutzerdefinierte Speicherbibliothek verwenden wie jemalloc

Beides hat seine Vor- und Nachteile.

Wir haben zwei Möglichkeiten, dieses Problem zu beheben: 🎜🎜1. Ändern Sie die Implementierung des InnoDB-Volltextindex. 🎜🎜2 Bibliothek, wie zum Beispiel jemalloc🎜🎜Diese beiden Methoden haben ihre eigenen Vor- und Nachteile. 🎜🎜Option 1 bedeutet, dass wir eine Inkompatibilität mit dem Upstream einführen, die in zukünftigen Versionen zu seltsamen Fehlern führen kann. Dies bedeutet auch eine vollständige Neufassung des InnoDB-Volltextcodes, der in GA-Versionen, die von unseren Kunden verwendet werden, immer riskant ist.🎜🎜Methode 1 bedeutet, dass wir das Risiko einer Inkompatibilität mit der Originalsoftware eingehen, was zu unbekannten Fehlern in neuen Versionen führen kann. Es bedeutet auch, einen Teil des InnoDB-Volltextindexcodes komplett neu zu schreiben, was in der von Benutzern verwendeten GA-Version riskant ist. 🎜🎜Option 2 bedeutet, dass wir möglicherweise auf Fehler in der Jemalloc-Bibliothek stoßen, die auf Leistung und nicht auf die sicherste Speicherzuweisung ausgelegt ist. Nicht der sicherste Fehler bei der Speicherzuweisung. 🎜🎜Also müssen wir uns zwischen diesen beiden nicht idealen Lösungen entscheiden.🎜🎜Da Option 1 dazu führen kann, dass Percona Server nicht mit dem Upstream kompatibel ist, bevorzugen wir Option 2 und freuen uns auf die Behebung dieses Fehlers durch den Upstream.🎜🎜Daher Wir müssen zwischen diesen beiden unvollkommenen Methoden wählen. 🎜🎜Angesichts der Tatsache, dass Methode eins dazu führen kann, dass der Percona-Dienst nicht mit dem Upstream kompatibel ist, bevorzugen wir die Verwendung von Methode zwei, um das Problem zu lösen, und freuen uns darauf, dass der Upstream diesen Fehler behebt. 🎜🎜🎜Fazit🎜🎜🎜Wenn Sie eine hohe Speichernutzung durch den MySQL-Prozess feststellen, ist dies nicht immer ein Symptom für einen Speicherverlust. Sie können die Speicherinstrumentierung im Leistungsschema verwenden, um herauszufinden, wie der zugewiesene Speicher verwendet wird Durchsuchen Sie das Benutzerhandbuch nach LD_PRELOAD, um herauszufinden, wie Sie es auf diesen Seiten einrichten.🎜🎜Wenn Sie feststellen, dass der mysqld-Prozess viel Speicher beansprucht, klicken Sie hier bedeutet nicht unbedingt, dass ein Speicherverlust vorliegt. Wir können die Speicherinstrumentierung im Leistungsschema verwenden, um zu verstehen, wie der Prozess den zugewiesenen Speicher nutzt. Sie können auch versuchen, die Speicherbibliothek auszutauschen, um die Speicherzuweisung und -freigabe besser zu handhaben. Informationen zur Konfiguration von LD_RELOAD finden Sie auf den entsprechenden Seiten des MySQL-Benutzerhandbuchs mysqld-safe und using-system. 🎜

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmierlehre! !

Das obige ist der detaillierte Inhalt vonChat MySQL-Speicherverwaltung, Speicherzuweisung und Betriebssysteme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen