데이터베이스 CPU 사용률이 높은 문제

2025년 1월 8일 수요일

Today I Learned

날짜

2024년 1월 8일 수요일

내용

데이터베이스가 이상하다.

여전히 쇼피파이 웹훅이 주기적으로 크게 실패하는 모양새를 보인다.

1

저렇게 주기적으로 크게 몰아서 실패하는 모양새다.

오류의 원인은 다양하지만 대개

400: error in update_shopify_product_by_webhook(psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint “shopify_product_pkey”

이렇다. 쇼피파이에서 상품에 붙는 고유 ID를 우리 데이터베이스에서도 unique로 해놨다. 말그대로 고유한 값이므로 전혀 문제될 게 없다.

1
2
3
4
5
6
7
8
9
10
11
12
db_shopify_product = get_shopify_product_by_origin_id_and_service_id(
    shopify_store=shopify_store,
    origin_id=data["origin_id"],
    db=db,
)

if not db_shopify_product:
    res = create_shopify_product(
        shopify_store=shopify_store,
        data=data,
        db=db,
    )

코드는 이렇게 되어있다. origin_id 가 쇼피파이에서 붙이는 고유한 값이다. 그 값으로 찾아서 없으면 생성해준다. 애초에 이 웹훅이 “상품 업데이트” 웹훅이기 때문에 없는 상품에 관한 정보가 들어올리가 없다. 들어왔다면 우리 쪽에 문제가 있어 데이터가 유실된 것이니 만들어주도록 작성해놨다.

create_shopify_product 함수에서 오류가 발생하고 있는데, 그렇다는 건 저 origin_id 로 데이터베이스에서 찾은 값이 없다는 의미다. 따라서 중복 키 문제가 발생할 수가 없는데… 도대체 원인이 뭔지 모르겠다. 저번에 유휴 트랜잭션을 싹 다 처리해주었는데도 데이터베이스에 원인이 있는걸까?

2

실제로 데이터베이스의 CPU 사용률 수치가 심상치 않았다. 그럼 RDS 인스턴스를 바꿔서 CPU의 성능을 높여야 할까? GPT 에게 물었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
📌 CloudWatch 및 Performance Insights에서 아래 지표를 확인하세요:
	•	CPU Utilization (CPU 사용률)
	•	WriteIOPS (디스크 쓰기 작업)
	•	DB Connections (연결 수)
	•	FreeableMemory (사용 가능한 RAM 크기 )
	•	Swap Usage (스왑 사용량이 높은지 확인)

📌 Swap Usage란?

Swap Usage란 운영체제(OS)가 RAM(메모리)이 부족할 때, 일부 데이터를 디스크로 옮겨서 사용하는 것을 의미합니다.
AWS RDS에서도 메모리가 부족할 경우 디스크 기반의 가상 메모리(Swap)를 사용하게 됩니다.

📌 Swap이 필요한 이유
	•	RAM이 부족하면 OS가 자주 사용하지 않는 데이터를 Swap 영역(디스크)으로 이동시켜 RAM을 확보함.
	•	CPU는 빠르게 작동해야 하지만, RAM이 부족하면 어쩔 수 없이 느린 디스크에서 데이터를 가져와야 함.
	•	이 과정이 많아질수록 DB 성능이 저하되고 CPU 부하가 증가함.

말해준대로 나머지 것들을 확인해봤다.

3

writeIOPS

4

SwwapUsage

5

FreeableMemory

가장 뒤는 인스턴스 변경 후의 수치니 무시하자.

나는 “요청이 몰리는 시점에 메모리가 부족해져 Swap Usage 사용이 증가했고, 이로 인해 CPU 부하가 증가했으며, 결국 데이터 읽고 쓰기에 문제가 생겼다”고 판단했다. 우선 인스턴스를 한단계 높여 메모리를 늘려줬다. 이것도 아니면 어떡하지..

회고

페이스북은 일주일에 5번 이상 검수를 실패하면 일주일간 못하게 한다. 너희들이 잘못해놓고 왜!