【问题标题】:CPU 100% usage caused by unknown postgres query [duplicate]未知 postgres 查询导致的 CPU 100% 使用率[重复]
【发布时间】:2018-03-18 22:39:46
【问题描述】:

我在 16.04 Linux 机器上为 PostgreSQL (v9.6) 安装了 timescaledb 扩展 (v.5.0) 并观察到 ​​Postgres 进程占用 100% CPU:

这是top 命令的结果:

PID   USER      PR  NI    VIRT    RES    SHR S %CPU %MEM   TIME+   COMMAND
19885 postgres  20   0  192684   3916   1420 S 98.3  0.1   5689:04 x3606027128                                     

我运行查询 SELECT pid, datname, usename, query FROM pg_stat_activity 并找到两个奇怪的查询

pid   datname   username  query
19882 postgres  postgres  select Fun013301 ('./x3606027128 &')
19901 postgres  postgres  select Fun013301 ('./ps3597605779 &')

函数 Fun013301 在 postgres 数据库中不存在。我不知道./x3606027128 命令是什么!?

【问题讨论】:

  • 我认为您的问题会在dba.stackexchange.com 得到更多关注;)。
  • 你应该打开一个问题 - 但我看到你已经这样做了。
  • 它可能是一种恶意软件,它以某种方式潜入您的 postgres 安装,因为它隐藏在生成的名称下并在后台执行占用 CPU 的程序。我会检查您最近安装任何东西的来源,而不仅仅是 timescaledb。
  • 看起来使用 SQL 注入来保存恶意软件文件 x3606027128,创建了一个函数 Fun013301,该函数使用 shell 运行来自参数的命令,并运行该函数来启动恶意软件。我怀疑对使用数据库集群的应用程序的攻击。您可能使用超级用户帐户 (postgres) 连接到数据库,这是一种非常糟糕的做法,并且会使此类攻击更容易 - 您应该为该帐户创建一个特殊的用户帐户和专用数据库。

标签: postgresql timescaledb


【解决方案1】:

我遇到了类似的问题。这是由于 - 一些事务被卡住并运行了很长时间。因此,CPU 利用率一直为 100%。以下命令有助于找出运行时间最长的连接:

SELECT max(now() - xact_start) FROM pg_stat_activity
                           WHERE state IN ('idle in transaction', 'active');

此命令显示自连接运行以来的时间。这个时间不应超过一个小时。因此,终止长时间运行或在任何时候卡住的连接对我有用。我关注this post 来监控和解决我的问题。 Post 包含许多有用的命令来监控这种情况。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2020-10-08
    • 1970-01-01
    • 2012-06-06
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多