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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介:

标签

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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
8天前
|
存储 智能硬件
CPU的定义与功能与架构
CPU(中央处理器)是计算机的核心部件,负责执行程序指令、控制数据传输和进行运算。它能处理算术与逻辑运算,并协调其他硬件协同工作。x86架构源于英特尔,适用于PC和服务器,采用复杂指令集;ARM架构则由Acorn等公司开发,广泛用于移动设备和嵌入式系统,采用精简指令集,功耗低且能效比高。
43 5
|
2月前
|
SQL 关系型数据库 MySQL
vb6读取mysql,用odbc mysql 5.3版本驱动
通过以上步骤,您可以在VB6中使用ODBC MySQL 5.3驱动连接MySQL数据库并读取数据。配置ODBC数据源、编写VB6代码
72 32
|
3月前
|
关系型数据库 MySQL Linux
MySQL版本升级(8.0.31->8.0.37)
本次升级将MySQL从8.0.31升级到8.0.37,采用就地升级方式。具体步骤包括:停止MySQL服务、备份数据目录、下载并解压新版本的RPM包,使用`yum update`命令更新已安装的MySQL组件,最后启动MySQL服务并验证版本。整个过程需确保所有相关RPM包一同升级,避免部分包遗漏导致的问题。官方文档提供了详细指导,确保升级顺利进行。
403 16
|
4月前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
127 5
|
4月前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
93 1
|
5月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
483 1
|
5月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
327 5
|
5月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
5月前
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
133 5
|
6月前
|
关系型数据库 MySQL 数据库
MySQL高级篇——MVCC多版本并发控制
什么是MVCC、快照读与当前读、隐藏字段、Undo Log版本链、ReadView、举例说明、InnoDB 解决幻读问题

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版