Beheben von Problemen mit der Speichernutzung bei Aurora-MySQL-Datenbanken - Amazon Aurora

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beheben von Problemen mit der Speichernutzung bei Aurora-MySQL-Datenbanken

CloudWatch, Enhanced Monitoring und Performance Insights bieten zwar einen guten Überblick über die Speichernutzung auf Betriebssystemebene, z. B. darüber, wie viel Speicher der Datenbankprozess verbraucht, allerdings können Sie nicht aufschlüsseln, welche Verbindungen oder Komponenten innerhalb der Engine diesen Speichenverbrauch verursachen.

Zur Behebung können Sie das Leistungsschema und das sys-Schema verwenden. In Version 3 von Aurora MySQL ist die Speicherinstrumentierung standardmäßig aktiviert, wenn das Leistungsschema aktiviert ist. In Version 2 von Aurora MySQL ist standardmäßig nur die Speicherinstrumentierung für die Speichernutzung des Leistungsschemas aktiviert. Informationen zu Tabellen, die im Leistungsschema verfügbar sind, um die Speichernutzung nachzuverfolgen und die Speicherinstrumentierung des Leistungsschemas zu aktivieren, finden Sie unter Speicherzusammenfassungstabellen in der MySQL-Dokumentation. Weitere Informationen über die Verwendung des Leistungsschemas mit Performance Insights finden Sie unter Übersicht über das Leistungsschema für Performance Insights auf Aurora MySQL.

Das Leistungsschema enthält detaillierte Informationen zur Nachverfolgung der aktuellen Speichernutzung, das sys-Schema von MySQL dagegen bietet zusätzlich zu den Leistungsschematabellen Ansichten, anhand derer Sie schnell feststellen können, wo Speicher genutzt wird.

Im sys-Schema sind die folgenden Ansichten verfügbar, mit denen die Speichernutzung nach Verbindung, Komponente und Abfrage nachverfolgt werden kann.

Anzeigen Beschreibung

memory_by_host_by_current_bytes

Diese Ansicht stellt Informationen zur Engine-Speichernutzung nach Host bereit. Dies kann nützlich sein, um festzustellen, welche Anwendungsserver oder Client-Hosts Speicher verbrauchen.

memory_by_thread_by_current_bytes

Diese Ansicht stellt Informationen zur Engine-Speichernutzung nach Thread-ID bereit. Die Thread-ID in MySQL kann eine Client-Verbindung oder ein Hintergrund-Thread sein. Sie können Thread-IDs MySQL-Verbindungs-IDs zuordnen, indem Sie die Ansicht sys.processlist oder die Tabelle performance_schema.threads verwenden.

memory_by_user_by_current_bytes

Diese Ansicht stellt Informationen zur Engine-Speichernutzung nach Benutzer bereit. Dies kann nützlich sein, um festzustellen, welche Benutzerkonten oder Clients Speicher verbrauchen.

memory_global_by_current_bytes

Diese Ansicht stellt Informationen zur Engine-Speichernutzung nach Engine-Komponente bereit. Dies kann nützlich sein, um die Speichernutzung global nach Engine-Puffer oder Komponente zu ermitteln. So werden möglicherweise das memory/innodb/buf_buf_pool-Ereignis für den InnoDB-Pufferpool oder das memory/sql/Prepared_statement::main_mem_root-Ereignis für vorbereitete Anweisungen angezeigt.

memory_global_total

Diese Ansicht bietet einen Überblick über die insgesamt nachverfolgte Speichernutzung in der Engine der Datenbank.

In den Versionen 3.05 und höher von Aurora MySQL können Sie die maximale Speichernutzung auch nach Anweisungs-Digest in den Übersichtstabellen der Leistungsschemaanweisungen nachverfolgen. Die Übersichtstabellen der Anweisungen enthalten normalisierte Anweisungs-Digests und aggregierte Statistiken zu deren Ausführung. Anhand der MAX_TOTAL_MEMORY-Spalte können Sie ermitteln, wie viel Speicher je nach Abfrage-Digest seit dem letzten Zurücksetzen der Statistiken oder seit dem Neustart der Datenbank-Instance belegt wurde. Dies kann nützlich sein, um bestimmte Abfragen zu identifizieren, die möglicherweise viel Speicher verbrauchen.

Anmerkung

Das Leistungsschema und das sys-Schema zeigen Ihnen die aktuelle Speichernutzung auf dem Server sowie die Höchstwerte für den Speicherverbrauch pro Verbindung und Engine-Komponente. Da das Leistungsschema im Arbeitsspeicher gespeichert wird, werden die Informationen zurückgesetzt, wenn die DB-Instance neu gestartet wird. Zum Verwalten eines chronologischen Verlaufs empfehlen wir, den Abruf und die Speicherung dieser Daten außerhalb des Leistungsschemas zu konfigurieren.

Beispiel 1: Anhaltend hohe Speichernutzung

Wenn wir uns FreeableMemory in CloudWatch näher ansehen, stellen wir fest, dass die Speichernutzung am 26.03.2024 um 02:59 UTC stark zugenommen hat.

FreeableMemory-Diagramm, das einen hohen Speicherverbrauch zeigt

Dies vermittelt uns kein vollständiges Bild. Sie können sich bei der Datenbank anmelden und sich sys.memory_global_by_current_bytes anzeigen lassen, um festzustellen, welche Komponente den meisten Speicher beansprucht. Diese Tabelle enthält eine Liste von Speicherereignissen, die MySQL nachverfolgt, zusammen mit Informationen zur Speicherzuweisung pro Ereignis. Jedes Speicherverfolgungsereignis beginnt mit memory/%, gefolgt von weiteren Informationen darüber, mit welcher Engine-Komponente oder -Funktion das Ereignis verknüpft ist.

memory/performance_schema/% gilt beispielsweise für Speicherereignisse, die sich auf das Leistungsschema beziehen, memory/innodb/% für InnoDB und so weiter. Informationen zu den Benennungskonventionen für Ereignisse finden Sie unter Leistungsschema – Instrument-Benennungskonventionen in der MySQL-Dokumentation.

Anhand der folgenden Abfrage können wir basierend auf current_alloc den wahrscheinlichen Verursacher ermitteln, sehen aber auch viele memory/performance_schema/%-Ereignisse.

mysql> SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10; +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc | +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | memory/sql/Prepared_statement::main_mem_root | 512817 | 4.91 GiB | 10.04 KiB | 512823 | 4.91 GiB | 10.04 KiB | | memory/performance_schema/prepared_statements_instances | 252 | 488.25 MiB | 1.94 MiB | 252 | 488.25 MiB | 1.94 MiB | | memory/innodb/hash0hash | 4 | 79.07 MiB | 19.77 MiB | 4 | 79.07 MiB | 19.77 MiB | | memory/performance_schema/events_errors_summary_by_thread_by_error | 1028 | 52.27 MiB | 52.06 KiB | 1028 | 52.27 MiB | 52.06 KiB | | memory/performance_schema/events_statements_summary_by_thread_by_event_name | 4 | 47.25 MiB | 11.81 MiB | 4 | 47.25 MiB | 11.81 MiB | | memory/performance_schema/events_statements_summary_by_digest | 1 | 40.28 MiB | 40.28 MiB | 1 | 40.28 MiB | 40.28 MiB | | memory/performance_schema/memory_summary_by_thread_by_event_name | 4 | 31.64 MiB | 7.91 MiB | 4 | 31.64 MiB | 7.91 MiB | | memory/innodb/memory | 15227 | 27.44 MiB | 1.85 KiB | 20619 | 33.33 MiB | 1.66 KiB | | memory/sql/String::value | 74411 | 21.85 MiB | 307 bytes | 76867 | 25.54 MiB | 348 bytes | | memory/sql/TABLE | 8381 | 21.03 MiB | 2.57 KiB | 8381 | 21.03 MiB | 2.57 KiB | +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ 10 rows in set (0.02 sec)

Wir haben bereits erwähnt, dass das Leistungsschema im Arbeitsspeicher gespeichert wird, was bedeutet, dass es auch in der performance_schema-Speicherinstrumentierung nachverfolgt wird.

Anmerkung

Sie können Datenbankparameter an Ihre Anforderungen anpassen, wenn Sie feststellen, dass das Leistungsschema viel Speicher beansprucht und Sie dessen Speichernutzung einschränken möchten. Weitere Informationen finden Sie unter Das Speicherzuweisungsmodell des Leistungsschemas in der MySQL-Dokumentation.

Zum Zwecke einer besseren Lesbarkeit können Sie dieselbe Abfrage erneut ausführen, dabei aber die Ereignisse des Leistungsschemas ausschließen. Die Ausgabe zeigt:

  • memory/sql/Prepared_statement::main_mem_root verbraucht am meisten Speicher.

  • Aus der current_alloc-Spalte geht hervor, dass MySQL diesem Ereignis derzeit 4,91 GiB zugewiesen hat.

  • high_alloc column gibt an, dass 4,91 GiB den Höchststand von current_alloc seit dem letzten Zurücksetzen oder dem Neustart des Servers markieren. Das bedeutet, dass memory/sql/Prepared_statement::main_mem_root seinen höchsten Wert erreicht hat.

mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name NOT LIKE 'memory/performance_schema/%' LIMIT 10; +-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc | +-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | memory/sql/Prepared_statement::main_mem_root | 512817 | 4.91 GiB | 10.04 KiB | 512823 | 4.91 GiB | 10.04 KiB | | memory/innodb/hash0hash | 4 | 79.07 MiB | 19.77 MiB | 4 | 79.07 MiB | 19.77 MiB | | memory/innodb/memory | 17096 | 31.68 MiB | 1.90 KiB | 22498 | 37.60 MiB | 1.71 KiB | | memory/sql/String::value | 122277 | 27.94 MiB | 239 bytes | 124699 | 29.47 MiB | 247 bytes | | memory/sql/TABLE | 9927 | 24.67 MiB | 2.55 KiB | 9929 | 24.68 MiB | 2.55 KiB | | memory/innodb/lock0lock | 8888 | 19.71 MiB | 2.27 KiB | 8888 | 19.71 MiB | 2.27 KiB | | memory/sql/Prepared_statement::infrastructure | 257623 | 16.24 MiB | 66 bytes | 257631 | 16.24 MiB | 66 bytes | | memory/mysys/KEY_CACHE | 3 | 16.00 MiB | 5.33 MiB | 3 | 16.00 MiB | 5.33 MiB | | memory/innodb/sync0arr | 3 | 7.03 MiB | 2.34 MiB | 3 | 7.03 MiB | 2.34 MiB | | memory/sql/THD::main_mem_root | 815 | 6.56 MiB | 8.24 KiB | 849 | 7.19 MiB | 8.67 KiB | +-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ 10 rows in set (0.06 sec)

Am Namen des Ereignisses können wir erkennen, dass dieser Speicher für vorbereitete Anweisungen verwendet wird. Wenn Sie erfahren möchten, welche Verbindungen diesen Speicher verwenden, überprüfen Sie memory_by_thread_by_current_bytes.

Im folgenden Beispiel sind jeder Verbindung ungefähr 7 MiB zugewiesen, der Höchststand beträgt ca. 6,29 MiB (current_max_alloc). Dies ergibt Sinn, da in diesem Beispiel sysbench mit 80 Tabellen und 800 Verbindungen mit vorbereiteten Anweisungen verwendet wird. Wenn Sie in diesem Szenario die Speichernutzung reduzieren möchten, können Sie die Verwendung von vorbereiteten Anweisungen in Ihrer Anwendung optimieren, um den Speicherverbrauch zu senken.

mysql> SELECT * FROM sys.memory_by_thread_by_current_bytes; +-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+ | thread_id | user | current_count_used | current_allocated | current_avg_alloc | current_max_alloc | total_allocated | +-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+ | 46 | rdsadmin@localhost | 405 | 8.47 MiB | 21.42 KiB | 8.00 MiB | 155.86 MiB | | 61 | reinvent@10.0.4.4 | 1749 | 6.72 MiB | 3.93 KiB | 6.29 MiB | 14.24 MiB | | 101 | reinvent@10.0.4.4 | 1845 | 6.71 MiB | 3.72 KiB | 6.29 MiB | 14.50 MiB | | 55 | reinvent@10.0.4.4 | 1674 | 6.68 MiB | 4.09 KiB | 6.29 MiB | 14.13 MiB | | 57 | reinvent@10.0.4.4 | 1416 | 6.66 MiB | 4.82 KiB | 6.29 MiB | 13.52 MiB | | 112 | reinvent@10.0.4.4 | 1759 | 6.66 MiB | 3.88 KiB | 6.29 MiB | 14.17 MiB | | 66 | reinvent@10.0.4.4 | 1428 | 6.64 MiB | 4.76 KiB | 6.29 MiB | 13.47 MiB | | 75 | reinvent@10.0.4.4 | 1389 | 6.62 MiB | 4.88 KiB | 6.29 MiB | 13.40 MiB | | 116 | reinvent@10.0.4.4 | 1333 | 6.61 MiB | 5.08 KiB | 6.29 MiB | 13.21 MiB | | 90 | reinvent@10.0.4.4 | 1448 | 6.59 MiB | 4.66 KiB | 6.29 MiB | 13.58 MiB | | 98 | reinvent@10.0.4.4 | 1440 | 6.57 MiB | 4.67 KiB | 6.29 MiB | 13.52 MiB | | 94 | reinvent@10.0.4.4 | 1433 | 6.57 MiB | 4.69 KiB | 6.29 MiB | 13.49 MiB | | 62 | reinvent@10.0.4.4 | 1323 | 6.55 MiB | 5.07 KiB | 6.29 MiB | 13.48 MiB | | 87 | reinvent@10.0.4.4 | 1323 | 6.55 MiB | 5.07 KiB | 6.29 MiB | 13.25 MiB | | 99 | reinvent@10.0.4.4 | 1346 | 6.54 MiB | 4.98 KiB | 6.29 MiB | 13.24 MiB | | 105 | reinvent@10.0.4.4 | 1347 | 6.54 MiB | 4.97 KiB | 6.29 MiB | 13.34 MiB | | 73 | reinvent@10.0.4.4 | 1335 | 6.54 MiB | 5.02 KiB | 6.29 MiB | 13.23 MiB | | 54 | reinvent@10.0.4.4 | 1510 | 6.53 MiB | 4.43 KiB | 6.29 MiB | 13.49 MiB | . . . . . . | 812 | reinvent@10.0.4.4 | 1259 | 6.38 MiB | 5.19 KiB | 6.29 MiB | 13.05 MiB | | 214 | reinvent@10.0.4.4 | 1279 | 6.38 MiB | 5.10 KiB | 6.29 MiB | 12.90 MiB | | 325 | reinvent@10.0.4.4 | 1254 | 6.38 MiB | 5.21 KiB | 6.29 MiB | 12.99 MiB | | 705 | reinvent@10.0.4.4 | 1273 | 6.37 MiB | 5.13 KiB | 6.29 MiB | 13.03 MiB | | 530 | reinvent@10.0.4.4 | 1268 | 6.37 MiB | 5.15 KiB | 6.29 MiB | 12.92 MiB | | 307 | reinvent@10.0.4.4 | 1263 | 6.37 MiB | 5.17 KiB | 6.29 MiB | 12.87 MiB | | 738 | reinvent@10.0.4.4 | 1260 | 6.37 MiB | 5.18 KiB | 6.29 MiB | 13.00 MiB | | 819 | reinvent@10.0.4.4 | 1252 | 6.37 MiB | 5.21 KiB | 6.29 MiB | 13.01 MiB | | 31 | innodb/srv_purge_thread | 17810 | 3.14 MiB | 184 bytes | 2.40 MiB | 205.69 MiB | | 38 | rdsadmin@localhost | 599 | 1.76 MiB | 3.01 KiB | 1.00 MiB | 25.58 MiB | | 1 | sql/main | 3756 | 1.32 MiB | 367 bytes | 355.78 KiB | 6.19 MiB | | 854 | rdsadmin@localhost | 46 | 1.08 MiB | 23.98 KiB | 1.00 MiB | 5.10 MiB | | 30 | innodb/clone_gtid_thread | 1596 | 573.14 KiB | 367 bytes | 254.91 KiB | 970.69 KiB | | 40 | rdsadmin@localhost | 235 | 245.19 KiB | 1.04 KiB | 128.88 KiB | 808.64 KiB | | 853 | rdsadmin@localhost | 96 | 94.63 KiB | 1009 bytes | 29.73 KiB | 422.45 KiB | | 36 | rdsadmin@localhost | 33 | 36.29 KiB | 1.10 KiB | 16.08 KiB | 74.15 MiB | | 33 | sql/event_scheduler | 3 | 16.27 KiB | 5.42 KiB | 16.04 KiB | 16.27 KiB | | 35 | sql/compress_gtid_table | 8 | 14.20 KiB | 1.77 KiB | 8.05 KiB | 18.62 KiB | | 25 | innodb/fts_optimize_thread | 12 | 1.86 KiB | 158 bytes | 648 bytes | 1.98 KiB | | 23 | innodb/srv_master_thread | 11 | 1.23 KiB | 114 bytes | 361 bytes | 24.40 KiB | | 24 | innodb/dict_stats_thread | 11 | 1.23 KiB | 114 bytes | 361 bytes | 1.35 KiB | | 5 | innodb/io_read_thread | 1 | 144 bytes | 144 bytes | 144 bytes | 144 bytes | | 6 | innodb/io_read_thread | 1 | 144 bytes | 144 bytes | 144 bytes | 144 bytes | | 2 | sql/aws_oscar_log_level_monitor | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 4 | innodb/io_ibuf_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 7 | innodb/io_write_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 8 | innodb/io_write_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 9 | innodb/io_write_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 10 | innodb/io_write_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 11 | innodb/srv_lra_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 12 | innodb/srv_akp_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 18 | innodb/srv_lock_timeout_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 248 bytes | | 19 | innodb/srv_error_monitor_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 20 | innodb/srv_monitor_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 21 | innodb/buf_resize_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 22 | innodb/btr_search_sys_toggle_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 32 | innodb/dict_persist_metadata_table_thread | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | | 34 | sql/signal_handler | 0 | 0 bytes | 0 bytes | 0 bytes | 0 bytes | +-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+ 831 rows in set (2.48 sec)

Wie bereits erwähnt, kann sich der Wert der Thread-ID (thd_id) hier auf Serverhintergrund-Threads oder Datenbankverbindungen beziehen. Wenn Sie Thread-ID-Werte Datenbankverbindungs-IDs zuordnen möchten, können Sie die performance_schema.threads-Tabelle oder die sys.processlist-Ansicht verwenden, wobei conn_id die Verbindungs-ID darstellt.

mysql> SELECT thd_id,conn_id,user,db,command,state,time,last_wait FROM sys.processlist WHERE user='reinvent@10.0.4.4'; +--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+ | thd_id | conn_id | user | db | command | state | time | last_wait | +--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+ | 590 | 562 | reinvent@10.0.4.4 | sysbench | Execute | closing tables | 0 | wait/io/redo_log_flush | | 578 | 550 | reinvent@10.0.4.4 | sysbench | Sleep | NULL | 0 | idle | | 579 | 551 | reinvent@10.0.4.4 | sysbench | Execute | closing tables | 0 | wait/io/redo_log_flush | | 580 | 552 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 581 | 553 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 582 | 554 | reinvent@10.0.4.4 | sysbench | Sleep | NULL | 0 | idle | | 583 | 555 | reinvent@10.0.4.4 | sysbench | Sleep | NULL | 0 | idle | | 584 | 556 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 585 | 557 | reinvent@10.0.4.4 | sysbench | Execute | closing tables | 0 | wait/io/redo_log_flush | | 586 | 558 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 587 | 559 | reinvent@10.0.4.4 | sysbench | Execute | closing tables | 0 | wait/io/redo_log_flush | . . . . . . | 323 | 295 | reinvent@10.0.4.4 | sysbench | Sleep | NULL | 0 | idle | | 324 | 296 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 325 | 297 | reinvent@10.0.4.4 | sysbench | Execute | closing tables | 0 | wait/io/redo_log_flush | | 326 | 298 | reinvent@10.0.4.4 | sysbench | Execute | updating | 0 | wait/io/table/sql/handler | | 438 | 410 | reinvent@10.0.4.4 | sysbench | Execute | System lock | 0 | wait/lock/table/sql/handler | | 280 | 252 | reinvent@10.0.4.4 | sysbench | Sleep | starting | 0 | wait/io/socket/sql/client_connection | | 98 | 70 | reinvent@10.0.4.4 | sysbench | Query | freeing items | 0 | NULL | +--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+ 804 rows in set (5.51 sec)

Wir beenden jetzt den sysbench-Workload, wodurch die Verbindungen geschlossen und der Speicher freigegeben wird. Wenn wir die Ereignisse erneut überprüfen, können wir bestätigen, dass Speicher freigegeben wurde, aber high_alloc lässt uns nach wie vor wissen, was der Höchststand ist. Die high_alloc-Spalte kann sehr nützlich sein, um kurze Spitzen bei der Speichernutzung zu identifizieren, die Sie möglicherweise nicht sofort anhand von current_alloc ermitteln können, da diese Spalte nur den derzeit zugewiesenen Speicher anzeigt.

mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name='memory/sql/Prepared_statement::main_mem_root' LIMIT 10; +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc | +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | memory/sql/Prepared_statement::main_mem_root | 17 | 253.80 KiB | 14.93 KiB | 512823 | 4.91 GiB | 10.04 KiB | +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ 1 row in set (0.00 sec)

Wenn Sie high_alloc zurücksetzen möchten, können Sie die performance_schema-Speicherübersichtstabellen kürzen. Dadurch wird jedoch die gesamte Speicherinstrumentierung zurückgesetzt. Weitere Informationen finden Sie unter Leistungsschema – allgemeine Tabellenmerkmale in der MySQL-Dokumentation.

Im folgenden Beispiel sehen wir, dass high_alloc nach der Kürzung zurückgesetzt wird.

mysql> TRUNCATE `performance_schema`.`memory_summary_global_by_event_name`; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name='memory/sql/Prepared_statement::main_mem_root' LIMIT 10; +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc | +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | memory/sql/Prepared_statement::main_mem_root | 17 | 253.80 KiB | 14.93 KiB | 17 | 253.80 KiB | 14.93 KiB | +----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ 1 row in set (0.00 sec)

Beispiel 2: Vorübergehende Speicherspitzen

Ein weiteres häufiges Ereignis sind kurze Spitzen bei der Speichernutzung auf einem Datenbankserver. Dabei kann es sich um periodische Einbrüche beim freigebbaren Speicher handeln, die durch current_alloc in sys.memory_global_by_current_bytes nur schwer zu beheben sind, da der Speicher bereits freigegeben wurde.

Anmerkung

Wurden die Statistiken des Leistungsschemas zurückgesetzt oder wurde die Instance der Datenbank neu gestartet, sind diese Informationen im sys oder erformance_schema nicht verfügbar. Zur Beibehaltung dieser Informationen sollten Sie die Erfassung externer Metriken konfigurieren.

Das folgende Diagramm der os.memory.free-Metrik in Enhanced Monitoring zeigt kurze Spitzen bei der Speichernutzung von 7 Sekunden. Enhanced Monitoring ermöglicht Ihnen eine Überwachung in Intervallen von nur 1 Sekunde. Dies ist ideal, um vorübergehende Spitzen wie diese abzufangen.

Diagramm, das vorübergehende Spitzen bei der Speichernutzung im zeitlichen Verlauf mit einem periodischen Muster zeigt, das auf potenzielle Probleme bei der Speicherverwaltung hinweist

Um hier die Ursache der Speichernutzung zu ermitteln, können wir eine Kombination aus high_alloc in den sys-Speicherübersichtsansichten und den Übersichtstabellen der Leistungsschemaanweisungen verwenden, um zu versuchen, problematische Sitzungen und Verbindungen zu identifizieren.

Da der Speicherverbrauch derzeit nicht hoch ist, können wir in der sys-Schemaansicht unter current_alloc erwartungsgemäß keine größeren Problemverursacher erkennen.

mysql> SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10; +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc | +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ | memory/innodb/hash0hash | 4 | 79.07 MiB | 19.77 MiB | 4 | 79.07 MiB | 19.77 MiB | | memory/innodb/os0event | 439372 | 60.34 MiB | 144 bytes | 439372 | 60.34 MiB | 144 bytes | | memory/performance_schema/events_statements_summary_by_digest | 1 | 40.28 MiB | 40.28 MiB | 1 | 40.28 MiB | 40.28 MiB | | memory/mysys/KEY_CACHE | 3 | 16.00 MiB | 5.33 MiB | 3 | 16.00 MiB | 5.33 MiB | | memory/performance_schema/events_statements_history_long | 1 | 14.34 MiB | 14.34 MiB | 1 | 14.34 MiB | 14.34 MiB | | memory/performance_schema/events_errors_summary_by_thread_by_error | 257 | 13.07 MiB | 52.06 KiB | 257 | 13.07 MiB | 52.06 KiB | | memory/performance_schema/events_statements_summary_by_thread_by_event_name | 1 | 11.81 MiB | 11.81 MiB | 1 | 11.81 MiB | 11.81 MiB | | memory/performance_schema/events_statements_summary_by_digest.digest_text | 1 | 9.77 MiB | 9.77 MiB | 1 | 9.77 MiB | 9.77 MiB | | memory/performance_schema/events_statements_history_long.digest_text | 1 | 9.77 MiB | 9.77 MiB | 1 | 9.77 MiB | 9.77 MiB | | memory/performance_schema/events_statements_history_long.sql_text | 1 | 9.77 MiB | 9.77 MiB | 1 | 9.77 MiB | 9.77 MiB | +-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+ 10 rows in set (0.01 sec)

Wenn wir die Ansicht erweitern, um nach high_alloc zu sortieren, sehen wir, dass die memory/temptable/physical_ram-Komponente hier ein möglicher Kandidat ist. Deren höchster Verbrauch lag bei 515,00 MiB.

Wie der Name schon sagt, instrumentiert memory/temptable/physical_ram die Speichernutzung für die TEMP-Speicher-Engine in MySQL, die in MySQL 8.0 eingeführt wurde. Weitere Informationen darüber, wie MySQL temporäre Tabellen verwendet, finden Sie unter Verwenden von internen temporären Tabellen in MySQL in der MySQL-Dokumentation.

Anmerkung

In diesem Beispiel verwenden wir die sys.x$memory_global_by_current_bytes-Ansicht.

mysql> SELECT event_name, format_bytes(current_alloc) AS "currently allocated", sys.format_bytes(high_alloc) AS "high-water mark" FROM sys.x$memory_global_by_current_bytes ORDER BY high_alloc DESC LIMIT 10; +-----------------------------------------------------------------------------+---------------------+-----------------+ | event_name | currently allocated | high-water mark | +-----------------------------------------------------------------------------+---------------------+-----------------+ | memory/temptable/physical_ram | 4.00 MiB | 515.00 MiB | | memory/innodb/hash0hash | 79.07 MiB | 79.07 MiB | | memory/innodb/os0event | 63.95 MiB | 63.95 MiB | | memory/performance_schema/events_statements_summary_by_digest | 40.28 MiB | 40.28 MiB | | memory/mysys/KEY_CACHE | 16.00 MiB | 16.00 MiB | | memory/performance_schema/events_statements_history_long | 14.34 MiB | 14.34 MiB | | memory/performance_schema/events_errors_summary_by_thread_by_error | 13.07 MiB | 13.07 MiB | | memory/performance_schema/events_statements_summary_by_thread_by_event_name | 11.81 MiB | 11.81 MiB | | memory/performance_schema/events_statements_summary_by_digest.digest_text | 9.77 MiB | 9.77 MiB | | memory/performance_schema/events_statements_history_long.sql_text | 9.77 MiB | 9.77 MiB | +-----------------------------------------------------------------------------+---------------------+-----------------+ 10 rows in set (0.00 sec)

In Beispiel 1: Anhaltend hohe Speichernutzung haben wir die aktuelle Speichernutzung jeder Verbindung überprüft, um festzustellen, welche Verbindung für die Nutzung des fraglichen Speichers verantwortlich ist. In diesem Beispiel ist der Speicher bereits freigegeben, sodass es nicht hilfreich ist, die Speichernutzung für aktuelle Verbindungen zu überprüfen.

Um tiefer in die Materie einzutauchen und die problematischen Anweisungen, Benutzer und Hosts zu ermitteln, verwenden wir das Leistungsschema. Das Leistungsschema enthält mehrere Übersichtstabellen zu Anweisungen, die in verschiedene Dimensionen wie Ereignisname, Anweisungs-Digest, Host, Thread und Benutzer unterteilt sind. Jede Ansicht ermöglicht es Ihnen, genauer zu untersuchen, wo bestimmte Anweisungen ausgeführt werden und was sie bewirken. Dieser Abschnitt konzentriert sich auf MAX_TOTAL_MEMORY. Weitere Informationen zu allen verfügbaren Spalten finden Sie in der Dokumentation Leistungsschema – Übersichtstabellen für Anweisungen.

mysql> SHOW TABLES IN performance_schema LIKE 'events_statements_summary_%'; +------------------------------------------------------------+ | Tables_in_performance_schema (events_statements_summary_%) | +------------------------------------------------------------+ | events_statements_summary_by_account_by_event_name | | events_statements_summary_by_digest | | events_statements_summary_by_host_by_event_name | | events_statements_summary_by_program | | events_statements_summary_by_thread_by_event_name | | events_statements_summary_by_user_by_event_name | | events_statements_summary_global_by_event_name | +------------------------------------------------------------+ 7 rows in set (0.00 sec)

Zuerst überprüfen wir events_statements_summary_by_digest, um MAX_TOTAL_MEMORY zu sehen.

Aus diesen Daten ergibt sich Folgendes:

  • Die Abfrage mit dem 20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a-Digest scheint ein möglicher Kandidat für diese Speichernutzung zu sein. MAX_TOTAL_MEMORY beträgt 537 450 710, was dem Höchststand entspricht, den wir bei dem memory/temptable/physical_ram-Ereignis in sys.x$memory_global_by_current_bytes gesehen haben.

  • Eine Ausführung fand viermal (COUNT_STAR) statt, zuerst am 26.03.2024 um 04:08:34,943256 und zuletzt um 26.03.2024 um 04:43:06,998310.

mysql> SELECT SCHEMA_NAME,DIGEST,COUNT_STAR,MAX_TOTAL_MEMORY,FIRST_SEEN,LAST_SEEN FROM performance_schema.events_statements_summary_by_digest ORDER BY MAX_TOTAL_MEMORY DESC LIMIT 5; +-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+ | SCHEMA_NAME | DIGEST | COUNT_STAR | MAX_TOTAL_MEMORY | FIRST_SEEN | LAST_SEEN | +-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+ | sysbench | 20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a | 4 | 537450710 | 2024-03-26 04:08:34.943256 | 2024-03-26 04:43:06.998310 | | NULL | f158282ea0313fefd0a4778f6e9b92fc7d1e839af59ebd8c5eea35e12732c45d | 4 | 3636413 | 2024-03-26 04:29:32.712348 | 2024-03-26 04:36:26.269329 | | NULL | 0046bc5f642c586b8a9afd6ce1ab70612dc5b1fd2408fa8677f370c1b0ca3213 | 2 | 3459965 | 2024-03-26 04:31:37.674008 | 2024-03-26 04:32:09.410718 | | NULL | 8924f01bba3c55324701716c7b50071a60b9ceaf17108c71fd064c20c4ab14db | 1 | 3290981 | 2024-03-26 04:31:49.751506 | 2024-03-26 04:31:49.751506 | | NULL | 90142bbcb50a744fcec03a1aa336b2169761597ea06d85c7f6ab03b5a4e1d841 | 1 | 3131729 | 2024-03-26 04:15:09.719557 | 2024-03-26 04:15:09.719557 | +-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+ 5 rows in set (0.00 sec)

Jetzt, da wir den problematischen Digest kennen, können wir mehr Details abrufen, z. B. den Abfragetext, den Benutzer und die Stelle, an der er ausgeführt wurde. Anhand des zurückgegebenen Digest-Texts können wir erkennen, dass es sich um einen allgemeinen Tabellenausdruck (CTE) handelt, der 4 temporäre Tabellen erstellt und 4 Tabellenscans durchführt, was sehr ineffizient ist.

mysql> SELECT SCHEMA_NAME,DIGEST_TEXT,QUERY_SAMPLE_TEXT,MAX_TOTAL_MEMORY,SUM_ROWS_SENT,SUM_ROWS_EXAMINED,SUM_CREATED_TMP_TABLES,SUM_NO_INDEX_USED FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST='20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a'\G; *************************** 1. row *************************** SCHEMA_NAME: sysbench DIGEST_TEXT: WITH RECURSIVE `cte` ( `n` ) AS ( SELECT ? FROM `sbtest1` UNION ALL SELECT `id` + ? FROM `sbtest1` ) SELECT * FROM `cte` QUERY_SAMPLE_TEXT: WITH RECURSIVE cte (n) AS ( SELECT 1 from sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte MAX_TOTAL_MEMORY: 537450710 SUM_ROWS_SENT: 80000000 SUM_ROWS_EXAMINED: 80000000 SUM_CREATED_TMP_TABLES: 4 SUM_NO_INDEX_USED: 4 1 row in set (0.01 sec)

Weitere Informationen zur events_statements_summary_by_digest-Tabelle und zu anderen Übersichtstabellen für Leistungsschemaanweisungen finden Sie unter Übersichtstabellen für Anweisungen in der MySQL-Dokumentation.

Sie können auch eine EXPLAIN- oder EXPLAIN ANALYZE-Anweisung ausführen, um weitere Informationen zu erhalten.

Anmerkung

EXPLAIN ANALYZE kann mehr Informationen bereitstellen als EXPLAIN, führt aber auch die Abfrage aus. Seien Sie also vorsichtig.

-- EXPLAIN mysql> EXPLAIN WITH RECURSIVE cte (n) AS (SELECT 1 FROM sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte; +----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+ | 1 | PRIMARY | <derived2> | NULL | ALL | NULL | NULL | NULL | NULL | 19221520 | 100.00 | NULL | | 2 | DERIVED | sbtest1 | NULL | index | NULL | k_1 | 4 | NULL | 9610760 | 100.00 | Using index | | 3 | UNION | sbtest1 | NULL | index | NULL | k_1 | 4 | NULL | 9610760 | 100.00 | Using index | +----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+ 3 rows in set, 1 warning (0.00 sec) -- EXPLAIN format=tree mysql> EXPLAIN format=tree WITH RECURSIVE cte (n) AS (SELECT 1 FROM sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte\G; *************************** 1. row *************************** EXPLAIN: -> Table scan on cte (cost=4.11e+6..4.35e+6 rows=19.2e+6) -> Materialize union CTE cte (cost=4.11e+6..4.11e+6 rows=19.2e+6) -> Index scan on sbtest1 using k_1 (cost=1.09e+6 rows=9.61e+6) -> Index scan on sbtest1 using k_1 (cost=1.09e+6 rows=9.61e+6) 1 row in set (0.00 sec) -- EXPLAIN ANALYZE mysql> EXPLAIN ANALYZE WITH RECURSIVE cte (n) AS (SELECT 1 from sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte\G; *************************** 1. row *************************** EXPLAIN: -> Table scan on cte (cost=4.11e+6..4.35e+6 rows=19.2e+6) (actual time=6666..9201 rows=20e+6 loops=1) -> Materialize union CTE cte (cost=4.11e+6..4.11e+6 rows=19.2e+6) (actual time=6666..6666 rows=20e+6 loops=1) -> Covering index scan on sbtest1 using k_1 (cost=1.09e+6 rows=9.61e+6) (actual time=0.0365..2006 rows=10e+6 loops=1) -> Covering index scan on sbtest1 using k_1 (cost=1.09e+6 rows=9.61e+6) (actual time=0.0311..2494 rows=10e+6 loops=1) 1 row in set (10.53 sec)

Aber wer ist für die Ausführung verantwortlich? Wir können im Leistungsschema sehen, dass der destructive_operator-Benutzer den MAX_TOTAL_MEMORY-Wert von 537 450 710 hatte, was wiederum den vorherigen Ergebnissen entspricht.

Anmerkung

Das Leistungsschema wird im Arbeitsspeicher gespeichert und sollte daher nicht als alleinige Quelle für Überprüfungen verwendet werden. Wenn Sie einen Verlauf der ausgeführten Anweisungen und der Benutzer, von denen diese stammen, verwalten müssen, sollten Sie das Advanced Auditing von Aurora aktivieren. Wenn Sie auch Informationen zur Speichernutzung verwalten müssen, sollten Sie die Überwachung so konfigurieren, dass diese Werte exportiert und gespeichert werden.

mysql> SELECT USER,EVENT_NAME,COUNT_STAR,MAX_TOTAL_MEMORY FROM performance_schema.events_statements_summary_by_user_by_event_name ORDER BY MAX_CONTROLLED_MEMORY DESC LIMIT 5; +----------------------+---------------------------+------------+------------------+ | USER | EVENT_NAME | COUNT_STAR | MAX_TOTAL_MEMORY | +----------------------+---------------------------+------------+------------------+ | destructive_operator | statement/sql/select | 4 | 537450710 | | rdsadmin | statement/sql/select | 4172 | 3290981 | | rdsadmin | statement/sql/show_tables | 2 | 3615821 | | rdsadmin | statement/sql/show_fields | 2 | 3459965 | | rdsadmin | statement/sql/show_status | 75 | 1914976 | +----------------------+---------------------------+------------+------------------+ 5 rows in set (0.00 sec) mysql> SELECT HOST,EVENT_NAME,COUNT_STAR,MAX_TOTAL_MEMORY FROM performance_schema.events_statements_summary_by_host_by_event_name WHERE HOST != 'localhost' AND COUNT_STAR>0 ORDER BY MAX_CONTROLLED_MEMORY DESC LIMIT 5; +------------+----------------------+------------+------------------+ | HOST | EVENT_NAME | COUNT_STAR | MAX_TOTAL_MEMORY | +------------+----------------------+------------+------------------+ | 10.0.8.231 | statement/sql/select | 4 | 537450710 | +------------+----------------------+------------+------------------+ 1 row in set (0.00 sec)

Beispiel 3: Der freie Speicherplatz sinkt kontinuierlich und wird nicht wieder zurückgewonnen

Die InnoDB-Datenbank-Engine verwendet eine Reihe spezialisierter Ereignisse zur Speichernachverfolgung für verschiedene Komponenten. Diese spezifischen Ereignisse ermöglichen eine detaillierte Nachverfolgung der Speichernutzung in wichtigen InnoDB-Subsystemen, zum Beispiel:

  • memory/innodb/buf0buf – Dieses Ereignis dient zur Überwachung der Speicherzuweisungen für den InnoDB-Pufferpool.

  • memory/innodb/ibuf0ibuf – Dieses Ereignis verfolgt speziell Speicheränderungen im Zusammenhang mit dem InnoDB-Änderungspuffer nach.

Zum Ermitteln der primären Speicherverbraucher können wir sys.memory_global_by_current_bytes abfragen:

mysql> SELECT event_name,current_alloc FROM sys.memory_global_by_current_bytes LIMIT 10; +-----------------------------------------------------------------+---------------+ | event_name | current_alloc | +-----------------------------------------------------------------+---------------+ | memory/innodb/memory | 5.28 GiB | | memory/performance_schema/table_io_waits_summary_by_index_usage | 495.00 MiB | | memory/performance_schema/table_shares | 488.00 MiB | | memory/sql/TABLE_SHARE::mem_root | 388.95 MiB | | memory/innodb/std | 226.88 MiB | | memory/innodb/fil0fil | 198.49 MiB | | memory/sql/binlog_io_cache | 128.00 MiB | | memory/innodb/mem0mem | 96.82 MiB | | memory/innodb/dict0dict | 96.76 MiB | | memory/performance_schema/rwlock_instances | 88.00 MiB | +-----------------------------------------------------------------+---------------+ 10 rows in set (0.00 sec)

Die Ergebnisse zeigen, dass memory/innodb/memory der primäre Verbraucher ist und 5,28 GiB des aktuell zugewiesenen Speichers nutzt. Dieses Ereignis dient als eine Kategorie für Speicherzuweisungen innerhalb verschiedener InnoDB-Komponenten, die nicht mit spezifischeren Warteereignissen verknüpft sind, wie dem zuvor erwähnten memory/innodb/buf0buf.

Nachdem wir festgestellt haben, dass InnoDB-Komponenten die primären Speicherverbraucher sind, befassen wir uns nun mithilfe des folgenden MySQL-Befehls näher mit den Einzelheiten:

SHOW ENGINE INNODB STATUS \G;

Der Befehl SHOW ENGINE INNODB STATUS liefert einen umfassenden Statusbericht für die InnoDB-Speicher-Engine, einschließlich detaillierter Speichernutzungsstatistiken für verschiedene InnoDB-Komponenten. Mit ihm lässt sich herausfinden, welche spezifischen InnoDB-Strukturen oder -Operationen den meisten Speicher verbrauchen. Weitere Informationen finden Sie unter InnoDB-In-Memory-Strukturen in der MySQL-Dokumentation.

Wenn wir den Abschnitt BUFFER POOL AND MEMORY des InnoDB-Statusberichts analysieren, stellen wir fest, dass 5 051 647 748 Bytes (4,7 GiB) dem Wörterbuchobjekt-Cache zugewiesen sind, was 89 % des von memory/innodb/memory nachverfolgten Speichers ausmacht.

---------------------- BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 0 Dictionary memory allocated 5051647748 Buffer pool size 170512 Free buffers 142568 Database pages 27944 Old database pages 10354 Modified db pages 6 Pending reads 0

Der Wörterbuchobjekt-Cache ist ein gemeinsam genutzter globaler Cache, der Datenwörterbuchobjekte im Arbeitsspeicher speichert, auf die zuvor zugegriffen wurde, um die Wiederverwendung von Objekten zu ermöglichen und die Leistung zu verbessern. Die hohe Speicherzuweisung für den Wörterbuchobjekt-Cache deutet auf eine große Anzahl von Datenbankobjekten im Cache des Datenwörterbuchs hin.

Da wir nun wissen, dass der Datenwörterbuch-Cache ein primärer Verbraucher ist, untersuchen wir diesen nun auf offene Tabellen. Zum Ermitteln der Anzahl der Tabellen im Tabellendefinitions-Cache fragen Sie die globale Statusvariable open_table_definitions ab.

mysql> show global status like 'open_table_definitions'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | Open_table_definitions | 20000 | +------------------------+-------+ 1 row in set (0.00 sec)

Weitere Informationen finden Sie unter How MySQL Opens and Closes Tables in der MySQL-Dokumentation.

Sie können die Anzahl der Tabellendefinitionen im Datenwörterbuch-Cache begrenzen, indem Sie den table_definition_cache-Parameter im DB-Cluster oder in der DB-Instance-Parametergruppe begrenzen. In Aurora MySQL dient dieser Wert als weicher Grenzwert hinsichtlich der Anzahl der Tabellen im Tabellendefinitions-Cache. Der Standardwert hängt von der Instance-Klasse ab und ist wie folgt festgelegt:

LEAST({DBInstanceClassMemory/393040}, 20000)

Wenn die Anzahl der Tabellen den table_definition_cache-Grenzwert überschreitet, bereinigt ein Least Recently Used (LRU)-Mechanismus Tabellen im Cache und entfernt diese. Tabellen, die an Fremdschlüsselbeziehungen beteiligt sind, werden jedoch nicht in die LRU-Liste aufgenommen, wodurch verhindert wird, dass sie entfernt werden.

In unserem aktuellen Szenario führen wir FLUSH TABLES aus, um den Tabellendefinitions-Cache zu leeren. Diese Aktion führt zu einem deutlichen Rückgang der globalen Statusvariable Open_Table_Definitions von 20 000 auf 12, wie hier dargestellt:

mysql> show global status like 'open_table_definitions'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | Open_table_definitions | 12 | +------------------------+-------+ 1 row in set (0.00 sec)

Trotz dieser Reduzierung stellen wir fest, dass die Speicherzuweisung für memory/innodb/memory mit 5,18 GiB hoch bleibt. Auch am zugewiesenen Wörterbuchspeicher ändert sich nichts. Dies geht aus den folgenden Abfrageergebnissen hervor:

mysql> SELECT event_name,current_alloc FROM sys.memory_global_by_current_bytes LIMIT 10; +-----------------------------------------------------------------+---------------+ | event_name | current_alloc | +-----------------------------------------------------------------+---------------+ | memory/innodb/memory | 5.18 GiB | | memory/performance_schema/table_io_waits_summary_by_index_usage | 495.00 MiB | | memory/performance_schema/table_shares | 488.00 MiB | | memory/sql/TABLE_SHARE::mem_root | 388.95 MiB | | memory/innodb/std | 226.88 MiB | | memory/innodb/fil0fil | 198.49 MiB | | memory/sql/binlog_io_cache | 128.00 MiB | | memory/innodb/mem0mem | 96.82 MiB | | memory/innodb/dict0dict | 96.76 MiB | | memory/performance_schema/rwlock_instances | 88.00 MiB | +-----------------------------------------------------------------+---------------+ 10 rows in set (0.00 sec)
---------------------- BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 0 Dictionary memory allocated 5001599639 Buffer pool size 170512 Free buffers 142568 Database pages 27944 Old database pages 10354 Modified db pages 6 Pending reads 0

Diese anhaltend hohe Speichernutzung kann auf Tabellen zurückgeführt werden, die an Fremdschlüsselbeziehungen beteiligt sind. Diese Tabellen werden nicht zur Entfernung in die LRU-Liste aufgenommen, was erklärt, warum die Speicherzuweisung auch nach dem Leeren des Tabellendefinitions-Cache hoch bleibt.

So beheben Sie dieses Problem:

  1. Überprüfen und optimieren Sie Ihr Datenbankschema, insbesondere im Hinblick auf Fremdschlüsselbeziehungen.

  2. Erwägen Sie, zu einer größeren DB-Instance-Klasse zu wechseln, die mehr Speicher für Ihre Wörterbuchobjekte bietet.

Wenn Sie diese Schritte befolgen und die Muster der Speicherzuweisung kennen, können Sie die Speichernutzung in Ihrer DB-Instance von Aurora MySQL besser verwalten und potenziellen Leistungsproblemen aufgrund von Speicherknappheit vorbeugen.