RDS (NetEase Cloud Relational Database Service) ist seit einiger Zeit online und Produkte wurden kontinuierlich in RDS verschoben. Während des Online-Betriebs- und Wartungsprozesses sind uns auch einige Dinge aufgefallen, die nicht oder nicht vollständig berücksichtigt wurden berücksichtigt. . Ich kann es später mit Ihnen teilen, wenn ich Zeit habe.
Was ich heute erwähnen möchte, ist, dass eine 4G-RDS-Instanz online ist. Es ist ein OOM-Problem (nicht genügend Speicher) aufgetreten und der MySQL-Prozess wurde direkt abgebrochen. Um dieses Problem zu erklären, müssen wir zunächst mit der Speicherzuweisungsstrategie des Linux-Systems beginnen.
Im Allgemeinen sind wir beim Schreiben von C-Sprachprogrammen daran gewöhnt, malloc zur dynamischen Beantragung von Speicherplatz zu verwenden (Java ist für die Speicherverwaltung durch die JVM verantwortlich. Die malloc-Funktion wendet eine kontinuierliche Speichereinheit auf das Betriebssystem an und gibt diese dann zurück). Startadresse dieses Bereichs. Wenn die malloc-Funktion null zurückgibt, bedeutet dies, dass das System keinen Speicherplatz zum Zuweisen hat. Dies ist unsere allgemeine Meinung, und natürlich ist dies in einigen Betriebssystemen (Solaris) tatsächlich richtig.
Bei der Speicherzuweisung von Linux wird jedoch davon ausgegangen, dass die Anwendung den Speicherplatz nicht unmittelbar nach der Beantragung nutzt, sodass eine gewisse Überbuchung zulässig ist, wenn die Anwendung ihn tatsächlich benötigt Dadurch ist das Betriebssystem möglicherweise in der Lage, die Anforderungen dieser Anwendung zu erfüllen, indem es den Speicherplatz anderer Anwendungen zurückgewinnt. Einfach ausgedrückt ermöglicht es der Anwendung, mehr Speicherplatz zu beantragen, als tatsächlich zuweisbar ist (einschließlich physischem Speicher und Swap). . Mehr Speicher, diese Funktion wird OverCommit genannt.
Diese Funktion ist auch im Linux-Betriebssystem konfigurierbar. Sie können die OverCommit-Richtlinie anpassen, indem Sie /proc/sys/overcommit_memory auf andere Werte festlegen.
Overcommit_memory kann 3 Werte annehmen:
0: Standardwert. Der Linux-Kernel verwendet einige heuristische Algorithmen, um zu bestimmen, ob eine Überbuchung erfolgen soll. Im Allgemeinen ist eine leichte Überbuchung zulässig. Einige Anforderungen, die offensichtlich nicht bereitgestellt werden können, werden abgelehnt, und es werden einige Regeleinschränkungen auferlegt als Überbelegung durch verschiedene Benutzer. Auch die Größen sind unterschiedlich.
1: Erlaubt, Überbuchung ohne Einschränkungen. Dies ist natürlich nicht unendlich und wird auch durch den Adressraum begrenzt. Die maximal mögliche Größe beträgt für 32-Bit-Systeme nur 4G, und das Maximum für 64-Bit-Systeme beträgt etwa 16T.
2: Verboten, Überbuchung ist verboten. Der Speicher, den das System zuweisen kann, überschreitet nicht den tatsächlichen physischen Speicher von Swap *overcommit_ratio. Dieser Wert kann über /proc/sys/vm/overcommit_ratio festgelegt werden.
Um die Speicherbelegung von Linux zu überprüfen, verwenden wir ein kleines Programm zum Testen:
#include <stdio.h> #include <stdlib.h> #define MEGABYTE 1024*1024 int main(int argc, char *argv[]) { void *myblock = NULL; int count = 0; while (1) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; printf("Currently allocating %d MB\n", ++count); } exit(0); } #include <stdio.h> #include <stdlib.h> #define MEGABYTE 1024*1024 int main(int argc, char *argv[]) { void *myblock = NULL; int count = 0; while(1) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; memset(myblock,1, MEGABYTE); printf("Currently allocating %d MB\n",++count); } exit(0); }
Nachdem ersterer über malloc() Speicherplatz beantragt hatte, nutzte er diesen nicht sofort, während letzterer ihn im Gegenteil nach jeder Anwendung sofort mit 1 füllte. Werfen wir einen Blick auf die Ergebnisse der Ausführung der beiden Programme.
Dies ist das Ergebnis der Ausführung auf einer virtuellen Maschine mit 1 GB RAM und 400 MB Swap. Ersteres beansprucht weitaus mehr Speicherplatz als der tatsächliche Speicher, während letzteres den tatsächlich verfügbaren Speicherplatz nicht überschreitet. Dadurch wird die zuvor beschriebene Linux-Speicherzuweisungsstrategie überprüft.
Dies ist eine systematische Optimierung an sich, die verständlich ist. Wir wissen jedoch, dass jede „Überbuchung“ auf der Annahme beruht, dass nicht viele Programme gleichzeitig Ressourcen verbrauchen, was offensichtlich riskant ist. Daher verwendet Linux einen OOM-Killer-Mechanismus (Out Of Memory Killer), um einige Prozesse selektiv zu beenden, um etwas Speicher freizugeben, bevor der verfügbare Speicher des Systems (einschließlich Swap) aufgebraucht ist. Im nächsten Kapitel konzentrieren wir uns auf den Mechanismus von Linux OOM Killer.