Reputation: 81
I have an application running on Postgres database, sometimes when I have about 8-10 people working on the application, the CPU usage soars high to something between 99-100%, The application was built on Codeigniter framework which I believe had made provision for closing up connections to the database each and every time it is not needed, What could be solution to this problem. I would appreciate any suggestions. Thank you
Basically, what the people do on the application is to running insert queries but at a very fast rate, A person could run between 70 - 90 insert queries in a minute.
Upvotes: 8
Views: 57902
Reputation: 48476
Here are some cases we met that cause high CPU usage of Postgres.
Incorrect indexes are used in the query
EXPLAIN
, we could check the query plan, if the index is used in the query, the Index Scan
could be found in the query plan result.Query with sort
operation
EXPLAIN (analyze, buffers)
- If the memory is insufficient to do the sorting operation, the temporary file could be used to do the sorting, and high CPU usage comes up.
work_mem
and sorting operations
Long-running transactions
SELECT pid
, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '2 minutes';
select pg_terminate_backend(pid)
Upvotes: 0
Reputation: 9190
I came across with the similar kind of issue. The reason was - some transactions were getting stuck and running since long time. Hence CPU utilization got increased to 100%. Following command helped to find out the connections running for the longest time:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
This command shows the the amount of time a connection has been running. This time should not be greater than an hour. So killing the connection which was running for a long long time or stuck at any point worked for me. I followed this post for monitoring and solving my issue. Post includes lots of useful commands to monitor this situation.
Upvotes: 20
Reputation: 2720
You need to find out what PostgreSQL is doing. Relevant resources:
Once you find what the slow or the most common queries are use, use EXPLAIN to make sure they are being executed efficiently.
Upvotes: 6