PostgreSQL 商用版本EPAS(阿里云ppas) HTAP功能之资源隔离管理 - CPU与刷脏资源组管理

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

标签

PostgreSQL , HTAP , PPAS , enterprisedb , 资源隔离 , cpu , io


背景

随着硬件发展,单机的能力越来越强,单个数据库可能服务于多个业务,或者服务于混合场景。例如即有分析型也有在线事务型处理(HTAP)。

资源隔离管理成为非常重要的需求。

对于Linux的用户,使用cgroup可以用来隔离进程的网络、CPU、IO、内存等。PostgreSQL为进程模型,使用cgroup可以实现资源隔离。

《Linux cgroup - memory子系统讲解》

《Linux cgroup - cpu与cpuset子系统讲解》

《cgroup告诉你如何计算 PostgreSQL 数据库实例用了多少内存》

在内核层面实现资源隔离也是一个不错的选择,可以实现库级、会话级、用户级的资源限制和隔离。例如Greenplum的resource queue。

《Greenplum 资源隔离的原理与源码分析》

《Greenplum 内存与负载管理(resource queue)最佳实践》

在PostgreSQL商用发行版本Enterprisedb中,提供了内核层面的resource queue功能,可以控制用户的IO和CPU使用。

阿里云PPAS商用版本(兼容Oracle)

pic

控制包括:

1、可以用多少个CPU CORE

2、每秒可以产生多少KB 的 dirty IO(实际上是shared buffer dirty page的产生速度,非dirty page都不算。通过pg_stat_statements.shared_blks_dirtied统计)

参数:

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.26.html#pID0E0DOF0HA

1、整个PG集群允许多少个活跃资源组(默认16),重启生效。

vi postgresql.conf   
   
edb_max_resource_groups = 16   

务必设置足够大,大于你需要创建的资源组个数。

2、设置当前会话使用哪个资源组,优先级如下:会话级 > 用户级 > 库级 > 集群级。

edb_resource_group = ''   

如何限制CPU和IO (DDL语法):

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.55.html#pID0E0MOC0HA

1、创建资源组

Command:     CREATE RESOURCE GROUP   
Description: define a new resource group   
Syntax:   
CREATE RESOURCE GROUP name   
postgres=# create resource group abc;   

2、配置资源组的限制,可以设置CPU和IO两种限制。

Command:     ALTER RESOURCE GROUP   
Description: change the definition of a resource group   
Syntax:   
ALTER RESOURCE GROUP name RENAME TO new_name   
ALTER RESOURCE GROUP name SET parameter { TO | = } { value | DEFAULT }   
ALTER RESOURCE GROUP name RESET parameter   
   
   
cpu_rate_limit   
dirty_rate_limit   
-- ABC这个组可以使用32个CPU核。   
alter resource group abc set cpu_rate_limit = 32;   
   
-- abc这个组,每秒最多产生 400MB dirty shared buffer.   
alter resource group abc set dirty_rate_limit =409600;   
   
-- 0表示不限制。   

3、查看系统中创建了多少资源组,以及资源组的限制。

postgres=# select * from edb_resource_group ;   
 rgrpname | rgrpcpuratelimit | rgrpdirtyratelimit    
----------+------------------+--------------------   
 b        |                0 |                  0   
 abc      |               32 |             409600   
(2 rows)   

4、设置当前会话资源组,当前会话生效。

postgres=# set edb_resource_group ='b';   
SET   

4.1、设置用户级资源组,使用这个用户连接时生效。

postgres=# alter role enterprisedb set edb_resource_group ='b';   
ALTER ROLE   

4.2、设置库级资源组,连接到这个库时生效。

postgres=# alter database postgres set edb_resource_group ='abc';   
ALTER DATABASE   

4.3、设置集群级资源组,集群级默认资源组。

vi $PGDATA/postgresql.conf   
   
edb_resource_group = 'abc'   

5、查看集群中的用户、数据库级资源控制配置参数。

postgres=#    
select    
  coalesce(datname,'ALL'),   
  coalesce(rolname,'ALL'),   
  setconfig    
from pg_db_role_setting t1    
left join pg_database t2    
  on (t1.setdatabase=t2.oid)    
left join pg_roles t3    
  on (t1.setrole=t3.oid);   
   
   
 coalesce |   coalesce   |       setconfig           
----------+--------------+------------------------   
 ALL      | enterprisedb | {edb_resource_group=b}   
(1 row)   

6、查看当前会话属于哪个资源组。

postgres=# show edb_resource_group ;   
 edb_resource_group    
--------------------   
 b   
(1 row)   

7、查看当前资源组的资源使用情况。

per_process_cpu_rate_limit表示这个组内,当前平均每个进程的CPU核数使用限制。

per_process_dirty_rate_limit表示这个组内,当前瓶颈每个进程限制的产生dirty page的速度(KB/s)

随着进程数的加减,平均值会有变化。每个进程的限制并不是平均数,组内的进程可以相互抢资源,如果只有一个活跃进程在组内,则这个活跃进程可以使用这个组的所有资源。

postgres=# select * from edb_all_resource_groups ;   
   
 group_name | active_processes | cpu_rate_limit | per_process_cpu_rate_limit | dirty_rate_limit | per_process_dirty_rate_limit    
------------+------------------+----------------+----------------------------+------------------+------------------------------   
 b          |                1 |              0 |                   16777216 |                0 |                     16777216   
 abc        |                0 |             32 |                            |           409600 |                                
(2 rows)   

组与组之间没有牵制,所以多个组可以配置超过机器的总资源限制(类似云计算的超卖),但是繁忙时,可能相互抢占。

CPU 限制,原理:

周期性的统计组内进程的资源使用情况,并限制资源(sleep)的使用。

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.56.html#pID0E0JJC0HA

PostgreSQL 代码中,getrusage是来获得CPU资源的使用情况的。

IO 限制,原理:

(仅限制shared buffer中的dirty page产生速度)

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.57.html#pID0E0CCC0HA

动态视图与参数:

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.88.html#

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.92.html#

查看集群中的用户、数据库级资源控制配置参数。

postgres=#    
select    
  coalesce(datname,'ALL'),   
  coalesce(rolname,'ALL'),   
  setconfig    
from pg_db_role_setting t1    
left join pg_database t2    
  on (t1.setdatabase=t2.oid)    
left join pg_roles t3    
  on (t1.setrole=t3.oid);   
   
   
 coalesce |   coalesce   |       setconfig           
----------+--------------+------------------------   
 ALL      | enterprisedb | {edb_resource_group=b}   
(1 row)   

查看当前资源组的资源使用情况。

per_process_cpu_rate_limit表示这个组内,当前平均每个进程的CPU核数使用限制。

per_process_dirty_rate_limit表示这个组内,当前瓶颈每个进程限制的产生dirty page的速度(KB/s)

随着进程数的加减,平均值会有变化。每个进程的限制并不是平均数,组内的进程可以相互抢资源,如果只有一个活跃进程在组内,则这个活跃进程可以使用这个组的所有资源。

postgres=# select * from edb_all_resource_groups ;   
   
 group_name | active_processes | cpu_rate_limit | per_process_cpu_rate_limit | dirty_rate_limit | per_process_dirty_rate_limit    
------------+------------------+----------------+----------------------------+------------------+------------------------------   
 b          |                1 |              0 |                   16777216 |                0 |                     16777216   
 abc        |                0 |             32 |                            |           409600 |                                
(2 rows)   

查看当前会话属于哪个资源组。

postgres=# show edb_resource_group ;   
 edb_resource_group    
--------------------   
 b   
(1 row)   

参考

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/toc.html

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.56.html#pID0E0JJC0HA

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.57.html#pID0E0CCC0HA

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.55.html#pID0E0MOC0HA

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.26.html#pID0E0DOF0HA

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.88.html#

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.92.html#

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.54.html#

阿里云PPAS商用版本(兼容Oracle)

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
移动开发 Linux
Linux下如何查看哪些进程占用的CPU内存资源最多
Linux下如何查看哪些进程占用的CPU内存资源最多
321 0
|
5月前
|
存储 人工智能 关系型数据库
阿里云AnalyticDB for PostgreSQL 入选VLDB 2025:统一架构破局HTAP,Beam+Laser引擎赋能Data+AI融合新范式
在数据驱动与人工智能深度融合的时代,企业对数据仓库的需求早已超越“查得快”这一基础能力。面对传统数仓挑战,阿里云瑶池数据库AnalyticDB for PostgreSQL(简称ADB-PG)创新性地构建了统一架构下的Shared-Nothing与Shared-Storage双模融合体系,并自主研发Beam混合存储引擎与Laser向量化执行引擎,全面解决HTAP场景下性能、弹性、成本与实时性的矛盾。 近日,相关研究成果发表于在英国伦敦召开的数据库领域顶级会议 VLDB 2025,标志着中国自研云数仓技术再次登上国际舞台。
564 0
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
294 6
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
NoSQL MongoDB 索引
MongoDB 占用CPU资源过高
MongoDB 占用CPU资源过高
231 0
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
406 5

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多