개발자가 되고 싶은 준개발자

[MySQL] swap 사용률 낮추기 위해 NUMA 정책 interleave로 바꾸기 본문

MySQL/mysql

[MySQL] swap 사용률 낮추기 위해 NUMA 정책 interleave로 바꾸기

준개발자 2023. 2. 23. 00:14

# 문제

여유 메모리가 있음에도 불구하고 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에 균등하게 배분이 되었다.


# 후 작업

꺼놨던 알람을 원상복귀한다.