Delen via


Problemen met hoog CPU-gebruik in Azure Database for PostgreSQL - Flexible Server oplossen

VAN TOEPASSING OP: Azure Database for PostgreSQL - Flexibele server

In dit artikel wordt beschreven hoe u de hoofdoorzaak van een hoog CPU-gebruik kunt identificeren. Het biedt ook mogelijke herstelacties om het CPU-gebruik te beheren bij het gebruik van Azure Database for PostgreSQL Flexible Server.

In dit artikel leert u het volgende:

  • Informatie over probleemoplossingsgidsen voor het identificeren en verkrijgen van aanbevelingen om de hoofdoorzaken te beperken.
  • Informatie over hulpprogramma's voor het identificeren van hoog CPU-gebruik, zoals metrische gegevens van Azure, queryopslag en pg_stat_statements.
  • Hoofdoorzaken identificeren, zoals langlopende query's en totale verbindingen.
  • Een hoog CPU-gebruik oplossen met behulp van EXPLAIN ANALYZE, verbindingspooling en vacuümtabellen.

Handleidingen voor probleemoplossing

Met behulp van de handleidingen voor probleemoplossing kunt u de waarschijnlijke hoofdoorzaak van een hoog CPU-scenario identificeren en aanbevelingen lezen om het gevonden probleem te verhelpen.

Als u wilt weten hoe u de handleidingen voor probleemoplossing instelt en gebruikt, volgt u de handleidingen voor het oplossen van problemen met setups.

Hulpprogramma's voor het identificeren van hoog CPU-gebruik

Overweeg het gebruik van de volgende lijst met hulpprogramma's om een hoog CPU-gebruik te identificeren.

Metrische gegevens van Azure

Metrische gegevens van Azure zijn een goed startpunt om het CPU-gebruik voor een bepaalde periode te controleren. Metrische gegevens bieden informatie over de resources die worden gebruikt tijdens de periode waarin het CPU-gebruik hoog is. Vergelijk de grafieken van SCHRIJF-IOPS, LEES-IOPS, Bytes per seconde lezen en Doorvoer bytes per seconde schrijven met CPU-percentage, om te achterhalen wanneer de werkbelasting een hoog CPU-gebruik heeft veroorzaakt.

Voor proactieve bewaking kunt u waarschuwingen voor de metrische gegevens configureren. Zie Metrische gegevens van Azure voor stapsgewijze instructies.

Query Store

Query Store legt automatisch de geschiedenis van query's en runtimestatistieken vast en behoudt deze voor uw beoordeling. Hiermee worden de gegevens gesegmenteerd op tijd, zodat u tijdelijke gebruikspatronen kunt zien. Gegevens voor alle gebruikers, databases en query's worden opgeslagen in een database met de naam azure_sys in het flexibele serverexemplaren van Azure Database for PostgreSQL.

Query store kan wachten gebeurtenisgegevens correleren met query runtime statistieken. Gebruik het queryarchief om query's te identificeren die een hoog CPU-verbruik hebben tijdens de interesseperiode.

Zie querystore voor meer informatie.

pg_stat_statements

De pg_stat_statements extensie helpt bij het identificeren van query's die tijd verbruiken op de server. Zie de bijbehorende documentatie voor meer informatie over deze extensie.

Gemiddelde of gemiddelde uitvoeringstijd

Voor Postgres-versies 13 en hoger gebruikt u de volgende instructie om de vijf belangrijkste SQL-instructies te bekijken met gemiddelde of gemiddelde uitvoeringstijd:

SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 5;

Totale uitvoeringstijd

Voer de volgende instructies uit om de vijf belangrijkste SQL-instructies weer te geven op basis van de totale uitvoeringstijd.

Voor Postgres-versies 13 en hoger gebruikt u de volgende instructie om de vijf belangrijkste SQL-instructies weer te geven op basis van de totale uitvoeringstijd:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

Hoofdoorzaken identificeren

Als het CPU-verbruik hoog is in het algemeen, kunnen de volgende hoofdoorzaken zijn:

Langlopende transacties

Langlopende transacties kunnen CPU-resources verbruiken die kunnen leiden tot een hoog CPU-gebruik.

De volgende query helpt bij het identificeren van verbindingen die het langst worden uitgevoerd:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Totaal aantal verbindingen en aantal verbindingen per status

Een groot aantal verbindingen met de database kan ook leiden tot een verhoogd CPU- en geheugengebruik.

De volgende query geeft informatie over het aantal verbindingen per status:

SELECT state, count(*)
FROM  pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY state
ORDER BY state ASC;

Hoog CPU-gebruik oplossen

Gebruik EXPLAIN ANALYZE, overweeg het gebruik van de ingebouwde PgBouncer-verbindingspooler en beëindig langlopende transacties om een hoog CPU-gebruik op te lossen.

EXPLAIN ANALYZE gebruiken

Zodra u de query's kent die meer CPU verbruiken, gebruikt u EXPLAIN ANALYZE om ze verder te onderzoeken en af te stemmen.

Raadpleeg de bijbehorende documentatie voor meer informatie over de opdracht EXPLAIN ANALYZE.

PgBouncer, een ingebouwde verbindingspooler

In situaties waarin er veel kortdurende verbindingen zijn, of veel verbindingen die voor het grootste deel van hun leven inactief blijven, kunt u overwegen een verbindingspooler zoals PgBouncer te gebruiken.

Zie de best practices voor verbindingspooler en verbindingsafhandeling met PostgreSQL voor meer informatie over PgBouncer

Azure Database for PostgreSQL flexibele server biedt PgBouncer als een ingebouwde oplossing voor groepsgewijze verbindingen. Zie PgBouncer voor meer informatie.

Langlopende transacties beëindigen

U kunt overwegen om een langlopende transactie als optie te beëindigen.

Als u de PID van een sessie wilt beëindigen, moet u de PID ervan vinden met behulp van de volgende query:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

U kunt ook filteren op andere eigenschappen, zoals usename (gebruikersnaam), datname (databasenaam), enzovoort.

Zodra u de PID van de sessie hebt, kunt u deze beëindigen met behulp van de volgende query:

SELECT pg_terminate_backend(pid);

Vacuüm- en tabelstatistieken bewaken

Het up-to-date houden van tabelstatistieken helpt de prestaties van query's te verbeteren. Controleer of regelmatige automatischevacuuming wordt uitgevoerd.

Met de volgende query kunt u de tabellen identificeren die vacuüm nodig hebben:

SELECT schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze, last_autovacuum,last_autoanalyze
FROM pg_stat_all_tables
WHERE n_live_tup > 0;

last_autovacuum en last_autoanalyze kolommen geven de datum en tijd aan waarop de tabel voor het laatst automatisch is ontruimd of geanalyseerd. Als de tabellen niet regelmatig worden opgezogen, voert u stappen uit om autovacuum af te stemmen.

Zie Problemen met Autovacuum oplossen voor meer informatie over het oplossen en afstemmen van autovacuum.

Een kortetermijnoplossing is om een handmatige vacuümanalyse uit te voeren van de tabellen waarin trage query's worden gezien:

VACUUM ANALYZE <table>;