DB/PostgreSQL

CPU Skew

박쿠리 2024. 8. 6. 23:04

CPU Skew 가 과도하게 높은 경우

CPU skew는 데이터가 클러스터의 노드 간에 고르게 분배되지 않아서 특정 노드가 과도하게 높은 CPU 사용률을 보일 때 발생한다. 이는 성능 저하를 유발할 수 있으며, 여러 원인이 있을 수 있다.

 

특정 인스턴스에 데이터가 몰려있으면 작업을 처리할 때까지, master 에선 결과를 계속 기다린다. 결국 전체가 하향평준화되는 느낌을 받는다.

 

몰려있을 경우 영향

1. 데이터 분포의 불균형

  • 테이블의 데이터가 고르게 분포되지 않은 경우: 특정 노드에 데이터가 집중되어 있는 경우, 해당 노드가 다른 노드보다 더 많은 작업을 처리하게 된다. 이는 데이터 분할 키(distribution key) 선택이 적절하지 않은 경우에 발생할 수 있다.
  • 잘못된 분할 키: 분할 키가 특정 값에 집중되어 있는 경우, 예를 들어, 특정 값이 매우 빈번하게 나타나는 경우, 데이터가 특정 노드에 집중될 수 있다.

2. 쿼리 실행 계획의 문제

  • 해시 조인: 조인 작업 시 해시 테이블이 특정 노드에만 생성되는 경우, 해당 노드가 과도한 로드를 처리해야 할 수 있다.
  • 잘못된 테이블 스캔: 특정 테이블 스캔이 한 노드에서만 수행되는 경우, 해당 노드의 CPU 사용률이 급격히 증가할 수 있다.

3. 리소스 할당 및 관리의 문제

  • 리소스 큐 설정 문제: 리소스 큐(Resource Queue)가 잘못 설정된 경우, 특정 쿼리가 과도한 리소스를 소비하여 다른 노드가 과부하에 걸릴 수 있다.
  • 워크로드 관리: 특정 노드에만 집중된 작업이 계속해서 할당되는 경우, 해당 노드가 과부하 상태가 될 수 있다.

4. 하드웨어 및 네트워크 문제

  • 네트워크 병목 현상: 네트워크 대역폭이 특정 노드에서 제한되는 경우, 해당 노드의 작업이 지연될 수 있다.
  • 하드웨어 불균형: 클러스터 내 노드 간의 하드웨어 성능이 균일하지 않은 경우, 성능 차이로 인해 CPU skew가 발생할 수 있다.

데이터 분포 확인 및 재분배

  • 분할 키 재검토: 데이터가 고르게 분포되도록 적절한 분할 키를 선택한다.
  • 데이터 재분배: 필요 시 데이터 분포를 고르게 하기 위해 테이블을 다시 분할(rebalance)한다.
  • 참고:분산키 변경 작업은 테이블 사용을 못하게 락이 걸리기 때문에 영향도 파악해서 작업해야 한다.

 

분산키 변경은 언제?

인스턴스 별로 데이터 차이가 20% 이상 차이날 경우

 

 

Skew Table 검색 방법

 

SELECT gp_segment_id, COUNT(*)
FROM 테이블명
GROUP BY gp_segment_id
ORDER BY 1

 

 

Skew 확인

 

$ cat skew_base.sql 
select 'SELECT '''||a.schemaname||'.'||a.tablename||''' tb_nm, Avg(Row_Count), max(Row_Count),(1-
(Avg(Row_Count)/Max(Row_Count)))*100 as Skew_Pct FROM (SELECT gp_segment_id, count(*) as Row_Count FROM 
'||a.schemaname||'.'||a.tablename||' GROUP BY gp_segment_id ) A;' qry
from pg_tables a
 	left outer join pg_partitions b
 	on a.tablename = b.tablename
 	left outer join pg_class c
 	on a.tablename = c.relname
where b.tablename is null 
and relstorage <> 'x'
group by a.schemaname, a.tablename
order by 1
$ psql -AXtf skew_base.sql > skew_all.sql
# Background 실행
$ nohup psql -ef skew_all.sql > skew_rslt.log 2>&1 &

 

50만건 이상이면서, 분산도가 5% 이상인 리스트 확인 방법

 

 grep "|" skew_rslt.log | grep -v tb_nm | awk -F"|" '$4>10 {print$0}' | awk -F"|" '$3>25000 {print$0}'

 

반응형

'DB > PostgreSQL' 카테고리의 다른 글

쿼리 튜닝용 파라미터  (0) 2024.08.24
수동으로 데이터 재분배  (0) 2024.08.06
GPDB -> HDFS -> GPDB 로드  (0) 2024.08.05
Greenplum PXF  (0) 2024.08.05
MPP (Massively Parallel Processing) 시스템  (0) 2024.08.04