【greenplum 性能优化】greenplum 数据库集群 如何释放占用内存

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程

在Greenplum数据库集群中,进程的状态(即state)可以被分为以下几种:

active:进程正在执行任务,或者正在等待运行队列中的任务。

idle:进程正在等待任务,但是当前没有任务可用。

idle in transaction:进程正在等待提交或回滚事务。

idle in transaction (aborted):进程正在等待回滚一个已经被终止的事务。

fastpath function call: 进程正在执行一个短时间的快速执行函数。

disabled: 进程处于未被允许的状态或者处于非正常状态。

通常情况下,你会发现在Greenplum数据库中,大部分进程的状态会是“idle”,即等待任务状态。当有新任务出现时,这些“idle”状态的进程会被重新激活,进入到“active”状态。

需要注意的是,因为Greenplum是一个基于MPP架构的集群,其中有许多类型的进程,如segments、master、and utility,这些不同类型的进程有不同的作用以及状态转换。但无论何时,对于任意一个进程,都应该理解并考虑它们的状态,以便监视和调整集群的性能。

在这里插入图片描述

释放内存前,发现一台主节点 segment 内存很少,只有792M,正常来说应该10G左右,首先排查问题,主要定位在greenplum 上,因为这台只有这个最占用内存。

在Greenplum数据库集群中,数据存储在segment节点上,每个segment节点是一个单独的PostgreSQL实例。如果你需要释放segment节点上占用的内存,可以尝试以下几个方法:

  1. 主动触发PGC的垃圾回收机制:在segement节点的命令行界面中,可以输入SELECT
    pg_catalog.pg_gc()命令来触发垃圾回收。
  2. 调整work_mem和maintenance_work_mem参数:在Greenplum数据库中,work_mem和maintenance_work_mem参数控制着排序和聚合操作时使用的内存大小。可以通过修改这两个参数的值来适当控制内存占用情况。
  3. 优化查询语句:可能会出现查询语句效率不高导致内存占用过高的情况。可以通过优化查询语句的方式来减少内存占用。
  4. 终止不必要的查询进程:在Greenplum集群中,通过查询工具(如psql)连接到数据库后,可以使用pg_cancel_backend()或pg_terminate_backend()函数来终止指定的查询进程。终止不必要的查询进程可以释放占用的内存资源。

请注意,在进行上述操作时,需要对数据库的运行情况进行全面评估,并谨慎操作,以避免数据损坏或降低数据库的性能。

下面我们用pg_terminate_backend() 来优化性能。

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'byt'
AND pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
-- AND state_change < current_timestamp - INTERVAL '5' MINUTE; 

执行完毕之后,瞬间释放了10G,
在这里插入图片描述
这个SQL查询语句的作用是将指定数据库(这里是 byt)中未进行活动操作(即空闲状态)的进程关闭,以释放被这些进程占用的资源(例如内存、CPU等)。

具体来说,它执行以下操作:

选择Process组件的pg_terminate_backend()函数以终止后台进程(即postgresql数据库的一个后台进程)。

从Process组件的pg_stat_activity视图中选择pid列,该列包含每个与活动进程相关联的PostgreSQL进程的进程ID。

限定查询范围,只选择在指定数据库 byt 中运行,且活动状态是空闲或空闲状态下的事务连接,或已禁用连接。

在PostgreSQL中,pg_terminate_backend(pid)是一个用于终止指定进程(pid)的函数。当一个进程被终止后,它使用的内存空间将被操作系统回收,从而释放内存。

如果你想释放Greenplum数据库集群中占用的内存,可以使用类似下列SQL查询语句:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb'
  AND pid <> pg_backend_pid()
  AND state = 'idle'
  AND state_change < current_timestamp - INTERVAL '5' MINUTE;

这个SQL查询语句将会终止处于空闲状态的进程,并且这些进程的状态更改时间距现在超过5分钟。这将释放由这些进程占用的内存,从而使得系统能够更好地运行。请注意,在终止进程之前,一定要评估它们的作用和可能造成的影响,以免因误操作导致数据丢失或系统故障。

猜你喜欢

转载自blog.csdn.net/u013421629/article/details/131088163