본문 바로가기
MySQL별책부록

25. MySQL Ver. 5.7 NUMA 성능 지원 기능 추가

by 모모레 2016. 3. 24.

MySQL Ver. 5.7.9 부터 NUMA 아키텍쳐로 운영되는 서버에 대해 InnoDB의 buffer pool을 관리할 수 있게 설정할 수 있는 파라메터가 추가되었다. 

innodb_numa_interleave 라는 시스템 변수이다. 


MySQL의 지원 기능에 대해 알아보기 전에 NUMA에 대해서 간단히 알아보도록 하자.


NUMA는 SMP(Symmetric Multi-Processing)/UMA(Uniform Memory Access) 아키텍쳐의 문제점을 해결하기 위해 만들어진 아키텍쳐이다. 

SMP/UMA의 특징 

1. 모든 CPU가 모든 메모리에 접근이 가능하다. 

2. 한번에 하나의 CPU만 메모리에 접근하는 것이 가능하다. 

3. 적절한 알고리즘을 통해 메모리 접근 스케쥴링을 해야 한다. 

4. 현재 성능 상 메모리 작업이 CPU 내부 작업 보다 느리기 때문에 메모리 접근에 대한 시간 소비가 성능 저하로 나타나는 문제점이 있다. 


SMP/UMA 모델에서 위와 같은 특징을 가지는 이유는 CPU와 메모리를 연결하여 사용하는 메모리 버스를 하나의 CPU만 점유하여 다른 CPU가 대기하는 상황이 발생하기 때문이다. 이와 같은 단점을 보완하기 위해 메모리를 각각 CPU별로 나누어서 사용하게 하는 즉, 각 CPU 별 전용 메모리개념이 생기게 되었다. 


[참고]

처음에 SMP/UMA 모델을 구성했던 이유는 초기 컴퓨터의 성능이 메모리가 훨씬 빨랐기 때문이다. 즉, CPU보다 메모리의 성능이 좋았기 때문에 위 구조가 문제가 되지 않았다. 하지만, CPU가 메모리보다 비약적으로 발전하면서 CPU의 속도가 메모리의 작업 속도보다 빨라지면서 메모리 버스의 병목이 발생하게 되었고, 이것이 성능을 저하시키는 포인트가 된 것이다. 


NUMA는 위에서 말한 것처럼 CPU별 전용 메모리 개념을 추가한 아키텍쳐이다. 즉 물리 메모리를 각각의 노드로 나누고, 각 노드들을 CPU 소켓별로 할당하여 로컬 메모리로 사용하게 하는 방식이다. 여기에서 원격 메모리와 지역메모리 개념이 발생한다. 


-- 원격 메모리(Remote Memory)

나에게 할당 받지 못한 메모리 노드 영역, 즉, 다른 CPU가 할당 받은 메모리 영역   

-- 지역 메모리(Local Memory) 

현재 내가 할당 받은 메모리 노드 영역을 말한다. 


이 구조는 현재 CPU가 사용하는 데이터가 자신의 지역 메모리에 모두 할당되어있어야 성능이 가장 좋다. 즉, 각각의 CPU에 사용하는 노드에 데이터가 올라가게끔 하여 사용하는 것이 중용한다. 원격 메모리에 대한 접근이 지역 메모리에 대한 접근보다 훨씬 느리기 때문이다. 


주로 사용하는 NUMA 메모리 할당 정책은 다음과 같다. 

-- NODE LOCAL

-- INTERLEAVE


NODE LOCAL은 현재 실행되는 프로세스가 점유한 cpu의 로컬 메모리를 할당 받아 사용하는 정책을 말한다. 


INTERLEAVE는 간단히 축약하면 Round-Robin 방식으로 사용하는 정책을 말한다. 즉, 메모리를 할당 받아야 할 때마다 처음에는 node 0, 두번째는 node1, 세번째는 node2에서 받고, 다시 네번째는 node0에서 할당 받는 형식을 말한다. 그래서, INTERLEAVE는 멀티 cpu core 프로세서를 사용할 수 있는 프로세스가 사용하기에 효과적이다. 


두가지 외에도 특정한 경우에 사용할 수 있는 다양한 메모리 할당 정책이 있다. 하지만, 위의 두 가지 정책이 가장 일반적인 경우에 사용할 수 있는 정책이므로, 두가지만 알고 있어도 운영에 큰 문제는 되지 않는다. 특히, 우리가 현재 알고자 하는 innodb_numa_interleave 시스템 변수 동작 방식의 이해를 위해서 이 정도만 알아도 충분하다. 


MySQL Ver. 5.7.9 부터 추가된 innodb_numa_interleave 시스템 변수는 MySQL의 InnoDB 버퍼풀에 대한 메모리 할당 정책에 대해서 NUMA 정책 중 interleave 정책을 사용하고자 할 때 설정하여 사용할 수 있다. 즉, innodb_numa_interleave 시스템 변수를 활성화 하면 mysqld 프로세스가 NUMA 정책으로  MPOL_INTERLEAVE를 설정하여 동작하게 한다. 그리고 InnoDB의 버퍼풀 할당이 완료되면, NUMA 메모리 정책을 MPOL_DEFAULT로 바꿔서 사용한다. 


[참고]

innodb_numa_interleave 시스템 변수는 NUMA 가 활성화된 시스템에서만 설정하여 사용하는 것이 가능하다. 


여기서 설명하는 MPOL_DEFAULT와 MPOL_INTERLEAVE는 리눅스에서 지원하는 메모리 할당 정책으로 간단히 다음과 같이 설명이 가능하다. 


MPOL_DEFAULT : 직접 설정할 수 없고, API를 통해서만 설정할 수 있는 값으로 이 값으로 설정되면 아무런 정책도 정해진게 없다는 뜻이된다. 즉, MPOL_DEFAULT로 설정되면 내부적으로 NULL이라고 판단하고 리눅스 OS에서 기본으로 선택한 NUMA 정책으로 동작하게 된다. 


MPOL_INTERLEAVE : 어떤 규칙에 따라 설정된 여러 메모리 노드들에 돌아가면서 메모리를 할당 받는 정책이다. 


참고 자료 : https://www.kernel.org/doc/Documentation/vm/numa_memory_policy.txt

참고 자료 : http://queue.acm.org/detail.cfm?id=2513149

참고 자료 : https://technet.microsoft.com/ko-kr/library/ms178144(v=sql.105).aspx

참고 자료 : http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_numa_interleave


실제 기능 테스트를 해보려고 해보니...

mysql 5.7.11과 5.7.12는innodb_numa_interleave 시스템 변수가 생성되지 않는 현상을 보이고 있습니다. 

버그 패치 과정에서 문제가 있어서 해당 기능이 비활성화 되게 구현되어있다고 합니다. 

MySQL Ver. 5.7.10에서는 문제없이 활성화 됩니다. 

테스트 하실때 참고하세요~