일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- minimum path sum
- Unique Paths
- LongestPalindromicSubstring
- leetcode
- 아마조니언
- 프로그래머스
- 독후감
- mysql #numa #swap #memory
- 동적 프로그래밍
- 리트코드
- 나는 아마존에서 미래를 다녔다
- 기술적 채무
- 와썹맨
- 리스트의 리스트
- 규칙없음
- Python
- No Rules Rules
- 블린이
- 그거봤어?
- BFS
- 삼성인 아마조니언 되다
- Dynamic Programmin
- 파이썬
- technical debt
- 김태강
- 알고리즘
- 삼성역량테스트
- list of list
- 트리
- Envoy
- Today
- Total
개발자가 되고 싶은 준개발자
[MySQL] swap 사용률 낮추기 위해 NUMA 정책 interleave로 바꾸기 본문
# 문제
여유 메모리가 있음에도 불구하고 swap이 사용되는 현상이 발생했다.
먼저 메모리와 swap 상태를 확인해 보았다.
free -h
메모리는 125기가 중에 71기가만 사용 중인데 벌써 swap 을 사용하고 있다.
numactl -H
NUMA 구성을 살펴보면 노드 2개로 구성되어 있다.
vi /etc/my.cnf
버퍼 풀은 63기가로 잡혀있다. 문제는 NUMA 노드당 메모리가 약 63GB 잡혀있는데, 버퍼 풀이 이미 63GB를 사용해서 다른 프로세스가 NODE 0에 작업을 할당받으면 메모리를 사용할 수 없어 NODE 1에 여유 메모리가 있음에도 swap을 사용하게 된다.
ps -ef | grep mysql
numastat -p 39697
mysql 프로세스의 PID로 프로세스에서 NUMA NODE를 어떻게 쓰나 보면 더 확실하다. 확실히 NODE 0에 편중되어 있다.
이런 일이 발생하는 이유는 mysql 프로세스의 특성과 연관이 있다.
DB는 단일 프로세스에서 큰 메모리 공간을 사용하게 된다. NUMA 특성 상 단일 프로세스를 NODE에 분배할 수 없기 때문에 DB의 메모리 관련 변수들을 잘 설정하지 못하면 NUMA의 메모리 제한에 부딪히게 될 수 있다.
NUMA 정책 변경 작업
# 사전 확인
-DB 재기동이 필요하므로 DB 관련 모니터링 채널 및 알림 중지한다.(안 그러면 구성원들이 알림 폭탄을 받을수 있다!)
-DB 중에 백업과 같이 long-running 작업이 있다면 시간이 겹치는지를 사전에 확인한다.
-DB 상태를 확인한다.
show engine innodb status \G
show processlist;
show slave statuis \G
SELECT USER, HOST, DB, TIME, COMMAND, STATE
FROM information_schema.processlist
WHERE command NOT IN ('Sleep')
AND user NOT IN ('system user', 'root')
AND time >= 0
ORDER BY time DESC
LIMIT 50;
# 본 작업
innodb_numa_interleave 변수를 켜준다. DYNAMIC 변수가 아니므로 DB 재기동이 필요하다.
vi /etc/my.cnf
innodb_numa_interleave = 1
HA 구성이 되어 복제를 하고 있다면 복제를 중단시킨다.
show slave status \G
stop slave;
show slave status \G
DB를 shutdown한다.
mysqladmin -uroot -p shutdown
DB가 꺼지면, memory와 swap에서 DB가 잡고 있던 영역이 free 되었는지 확인한다.
free -h
DB를 재기동한다.
mysqld_safe --user=mysql &
tail mysql.err
DB가 켜지만 변수 설정이 잘 적용되었는지 확인한다.
show global variables like '%numa%';
메모리와 swap의 변화를 확인한다.
swap 사용량이 109MB로 이전(2.5GB)에 비해 줄었고, NUMA 노드의 메모리도 NODE 0과 1에 균등하게 배분이 되었다.
# 후 작업
꺼놨던 알람을 원상복귀한다.
'MySQL > mysql' 카테고리의 다른 글
[MySQL] PK, unique key 컬럼 선정 방법 (aka. 복제 지연 예방 방법) (0) | 2023.07.17 |
---|---|
[MySQL] Delete 쿼리 하나로 수십시간의 복제 지연 발생 원인 분석 (0) | 2023.05.04 |
MySQL 데이터베이스 이관 시 고려할 점 (0) | 2023.01.31 |
[mysql] DDL 지연 현상 해결 방법 (0) | 2023.01.03 |
mysql 쿼리 튜닝 기본 (0) | 2022.12.14 |