Skip to content

Latest commit

 

History

History
253 lines (194 loc) · 8.73 KB

File metadata and controls

253 lines (194 loc) · 8.73 KB

WarehousePG 7부터는 Linux cgroup v2(group-v2)를 공식적으로 지원하며, 기존 cgroup v1에 비해 향상된 I/O 제어(I/O Limit) 및 더욱 안정적인 메모리 제어 기능을 제공합니다.

cgroup v2 기반의 Resource Group을 설정하는 전체 과정은 1) OS 수준의 cgroup v2 활성화, 2) 디렉터리 권한 및 컨트롤러 설정, 3) Greenplum 데이터베이스 파라미터 적용, 4) Resource Group 생성 및 할당의 4단계로 나뉩니다.


1. OS 수준의 cgroup v2 활성화 (모든 노드)

클러스터의 모든 노드(Coordinator 및 모든 Segment 호스트)에서 Linux OS가 cgroup v1 대신 cgroup v2를 사용하도록 설정해야 합니다. (RHEL 8, Rocky 8 등 최신 OS에서 지원)

  1. 현재 cgroup v2가 활성화되어 있는지 확인합니다.
mount | grep cgroup2

아무런 결과가 출력되지 않거나 tmpfs on /sys/fs/cgroup type tmpfs 형태로 보인다면 커널 부팅 파라미터를 수정해야 합니다.

  1. /etc/default/grub 파일을 열고 GRUB_CMDLINE_LINUX 항목 끝에 다음 파라미터를 추가합니다.
cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1
  1. GRUB 설정을 업데이트하고 시스템을 재부팅합니다.
# RHEL/CentOS/Rocky 기반
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

2. cgroup v2 디렉터리 및 컨트롤러 설정 (모든 노드)

cgroup v2는 단일 계층(Unified Hierarchy) 구조를 가집니다. Greenplum(gpadmin 계정)이 리소스를 제어할 수 있도록 최상위 cgroup 아래에 전용 디렉터리를 만들고 권한을 부여해야 합니다.

  1. 루트 디렉터리에서 필수 컨트롤러(cpu, cpuset, io, memory)가 사용 가능한지 확인합니다.
cat /sys/fs/cgroup/cgroup.controllers
  1. 하위 cgroup으로 컨트롤러를 위임합니다.
echo "+cpu +cpuset +io +memory" | sudo tee -a /sys/fs/cgroup/cgroup.subtree_control
  1. WarehousePG 디렉터리를 생성하고 권한을 gpadmin 유저로 변경합니다.
sudo mkdir -p /sys/fs/cgroup/whpg
sudo chown -R gpadmin:gpadmin /sys/fs/cgroup/whpg
  1. gpadmin 계정으로 접속 후, 생성된 gpdb 디렉터리에서도 하위 리소스 그룹들을 위해 컨트롤러를 활성화합니다.
sudo -iu gpadmin
echo "+cpu +cpuset +io +memory" > /sys/fs/cgroup/gpdb/cgroup.subtree_control

(참고: 운영 환경에서는 노드 재부팅 시 위 설정이 날아가지 않도록 해당 작업을 수행하는 systemd 서비스 스크립트를 작성하여 자동화하는 것이 필수입니다.)


3. whpg cgroup 서비스 등록(Version 2)

root 계정

sudo vi /etc/systemd/system/whpg.service
[Unit]
Description=Greenplum Cgroup v2 Configuration Service
After=systemd-udevd.service
# (or Option) After=local-fs.target systemd-tmpfiles-setup.service

[Service]
# ============================================================================
# Use oneshot to simply create the cgroup path and exit, preventing systemd
# from killing or interfering with WHPG processes later.
# ============================================================================
# Type=oneshot
Type=simple
RemainAfterExit=yes
Slice=-.slice
Delegate=yes

# set hierarchies only if cgroup v2 mounted
ExecCondition=bash -c '[ xcgroup2fs = x$$(stat -fc "%%T" /sys/fs/cgroup) ] || exit 1'

ExecStartPre=bash -ec '\
echo "+cpuset +io +cpu +memory" > /sys/fs/cgroup/cgroup.subtree_control || true; \
mkdir -p /sys/fs/cgroup/whpg; \
echo "+cpuset +io +cpu +memory" > /sys/fs/cgroup/whpg/cgroup.subtree_control || true; \
chown -R gpadmin:gpadmin /sys/fs/cgroup/whpg; \
chmod a+w /sys/fs/cgroup/cgroup.procs; \
chmod u+w /sys/fs/cgroup/whpg/cgroup.procs;'

ExecStart=sleep infinity

ExecStartPost=bash -ec "echo $MAINPID > /sys/fs/cgroup/cgroup.procs;"

ExecStop=/bin/true

[Install]
WantedBy=basic.target
# WantedBy=multi-user.target

whpg cgroup 서비스 시작/확인.

sudo systemctl daemon-reload
sudo systemctl enable whpg.service
sudo systemctl start whpg.service
sudo systemctl status whpg.service

4. WarehousePG Database 파라미터 적용 (Coordinator 노드)

OS 및 디렉터리 설정이 완료되었다면, Greenplum 설정값을 변경하여 cgroup v2 엔진을 사용하도록 명시합니다.

  1. Coordinator 노드에서 gpadmin 유저로 gp_resource_manager 파라미터를 group-v2로 변경합니다.
gpconfig -c gp_resource_group_cgroup_parent -v 'whpg'
gpconfig -c gp_resource_manager -v 'group-v2'
  1. 데이터베이스를 재시작하여 설정을 반영합니다.
gpstop -ra
  1. 정상적으로 적용되었는지 확인합니다.
SHOW gp_resource_manager;
-- 결과가 'group-v2'로 나와야 합니다.

5. Resource Group 테스트

대시보드 조회를 위한 사용자 그룹(dashboard_users)과 데이터 로딩을 위한 ETL 그룹(etl_users)을 나누어 리소스를 할당하는 예시입니다.

1단계: 리소스 그룹 생성 (CREATE RESOURCE GROUP) 먼저, 각 그룹의 리소스 제한을 정의하여 생성합니다.

dashboard_users_rg: 대시보드 사용자를 위한 그룹. 쿼리 5개가 동시에 실행될 수 있으며, 전체 CPU의 30%, 메모리의 20%를 사용하도록 제한합니다.

etl_users_rg: ETL 작업을 위한 그룹. 동시 실행은 2개로 제한하지만, 더 많은 CPU와 메모리(각각 50%)를 할당합니다.

-- 대시보드 사용자용 리소스 그룹 생성

CREATE RESOURCE GROUP dashboard_users_rg WITH (
    CPU_MAX_PERCENT=20,       -- CPU 사용률 30% 제한
    MEMORY_QUOTA=250,     -- 메모리 사용률 20% 제한
    CONCURRENCY=5           -- 동시 실행 쿼리 수 5개 제한
);

-- ETL 사용자용 리소스 그룹 생성

CREATE RESOURCE GROUP etl_users_rg WITH (
    CPU_MAX_PERCENT=20, 
    MEMORY_QUOTA=250, 
    CONCURRENCY=2
);

참고: MEMORY_SHARED_QUOTA 옵션을 사용하여 그룹 내 쿼리들이 공유할 메모리 비율을 정할 수도 있습니다.

-- 설정 확인.

SELECT * FROM gp_toolkit.gp_resgroup_config;

2단계: 역할(Role) 생성 및 리소스 그룹 할당 이제 이 리소스 그룹에 속할 사용자(Role)를 만들고, 해당 리소스 그룹을 할당합니다.

새로운 역할(사용자) 생성

SQL

CREATE ROLE dashboard_user WITH LOGIN PASSWORD 'your_password';
CREATE ROLE etl_user WITH LOGIN PASSWORD 'your_password';

역할에 리소스 그룹 할당 (ALTER ROLE) ALTER ROLE 명령어를 사용하여 각 역할을 해당 리소스 그룹에 배정합니다.

SQL

ALTER ROLE dashboard_user RESOURCE GROUP dashboard_users_rg;
ALTER ROLE etl_user RESOURCE GROUP etl_users_rg;

이제 dashboard_user로 접속하여 실행하는 모든 쿼리는 dashboard_users_rg에 설정된 리소스 제한(CPU 30%, 메모리 20%, 동시성 5)을 따르게 됩니다.

3단계: 설정 확인 ✅ 생성된 리소스 그룹과 역할 할당 상태를 아래 뷰(view)를 통해 확인할 수 있습니다.

리소스 그룹 설정 확인

SQL

SELECT * FROM gp_toolkit.gp_resgroup_config;

역할에 할당된 리소스 그룹 확인

SQL

SELECT rolname, rsgname
FROM pg_roles, gp_toolkit.gp_resgroup_config
WHERE pg_roles.rolresgroup = gp_toolkit.gp_resgroup_config.groupid
  AND rolname IN ('dashboard_user', 'etl_user');

이처럼 리소스 그룹을 사용하면, 다양한 워크로드가 서로 영향을 주지 않고 안정적으로 실행되도록 시스템 리소스를 효과적으로 통제하고 관리할 수 있습니다.


대시보드 사용자용 리소스 그룹 생성 예시.

CREATE RESOURCE GROUP rgroup1 WITH (
    CONCURRENCY=20, 
    CPU_MAX_PERCENT=20, 
    MEMORY_QUOTA=250, 
    CPU_WEIGHT=500, 
    MIN_COST=50, 
    IO_LIMIT='pg_default: wbps=1000, rbps=1000, wiops=100, riops=100'
);

ALTER RESOURCE GROUP rg_role_light SET CONCURRENCY 7;
ALTER RESOURCE GROUP exec SET MEMORY_QUOTA 30;
ALTER RESOURCE GROUP rgroup1 SET CPUSET '1;2,4';
ALTER RESOURCE GROUP sales SET IO_LIMIT 'tablespace1:wbps=2000,wiops=2000;tablespace2:rbps=2024,riops=2024';

DROP RESOURCE GROUP olap_rg; 

ALTER ROLE bill RESOURCE GROUP olap_rg;
CREATE ROLE mary RESOURCE GROUP etl_rt;

ALTER ROLE mary RESOURCE GROUP NONE;

SELECT * FROM gp_toolkit.gp_resgroup_config;
SELECT * FROM gp_toolkit.gp_resgroup_status;
SELECT * FROM gp_toolkit.gp_resgroup_status_per_host;

SELECT rolname, rsgname FROM pg_roles, pg_resgroup
WHERE pg_roles.rolresgroup=pg_resgroup.oid;

SELECT * FROM gp_toolkit.gp_resgroup_iostats_per_host;
SELECT query, rsgname,wait_event_type, wait_event FROM pg_stat_activity;

SELECT rolname, g.rsgname, pid, waiting, state, query, datname 
FROM pg_roles, gp_toolkit.gp_resgroup_status g, pg_stat_activity 
WHERE pg_roles.rolresgroup=g.groupid
AND pg_stat_activity.usename=pg_roles.rolname;

SELECT pg_cancel_backend(31905);