【问题标题】:Postgres CPU high usage after hours下班后 Postgres CPU 使用率高
【发布时间】:2020-06-04 08:35:24
【问题描述】:

我在 Windows 2016 上有一个带有 Postgresql 数据库的应用程序服务器,8 个虚拟线程 CPU 和 32GB 内存

我试图强调 10 个客户端并发插入数据库, 在 250 万条记录的表上,每次插入操作大约需要 500 毫秒

大约 1 小时后即可正常工作,占用约 2GB 内存和 80% 的 CPU, 在那之后,cpu 上升到 100%(内存没有改变)并且 postgres 似乎没有响应并且客户端无法连接到服务器

我检查 Postgres 日志并看到错误:

[2020-02-18 22:48:59 JST]  26344[16] WARNING:  worker took too long to start; canceled

此查询检查也没有锁定:

SELECT bl.pid                 AS blocked_pid,
         a.usename              AS blocked_user,
         ka.query               AS current_or_recent_statement_in_blocking_process,
         ka.state               AS state_of_blocking_process,
         now() - ka.query_start AS blocking_duration,
         kl.pid                 AS blocking_pid,
         ka.usename             AS blocking_user,
         a.query                AS blocked_statement,
         now() - a.query_start  AS blocked_duration
  FROM  pg_catalog.pg_locks         bl
   JOIN pg_catalog.pg_stat_activity a  ON a.pid = bl.pid
   JOIN pg_catalog.pg_locks         kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
   JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
  WHERE NOT bl.GRANTED;

在 pg_stat_activity 或 pg lock 中找不到慢 sql

所有内存、wal 或检查点配置都是默认配置

我还使用 postgresql ODBC 作为连接池 谁能建议我一种检测问题的方法?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如果INSERT 需要半秒钟,那么您有一个严重的问题。

    看起来您正在使数据库服务器上的 CPU 资源过载。解决方案是找到在数据库未处于负载下时花费太多时间的语句,并将它们调整为更快。然后,您可以使用可用的 CPU 处理更多的问题。

    【讨论】:

    • 但是为什么它可以在几个小时内以相同的CPU使用率正常运行,但在那之后突然增加到100%?
    • 我不能说,因为您的问题仅包含一般性观察,没有详细分析。 80% CPU 使用率太高。也许是一个随机事件把它弄得过头了,现在你正沉浸在上下文切换中。
    • 数据模型、外键、(缺少)索引、触发器。顺便说一句:插入客户端进程或 postmaster 需要 2GB?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2021-12-09
    • 2014-07-16
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多