2012-10-31 5 views
12

ActivePivot 응용 프로그램을 새 서버 (Intel Xeon 4 소켓, 512GB 메모리)로 마이그레이션하고 있습니다. 배포 한 후 응용 프로그램 벤치 마크 (실시간 트랜잭션과 동시에 대규모 OLAP 쿼리가 혼합 됨)를 시작했습니다. 측정 된 성능은 비슷한 프로세서를 사용하지만 코어가 두 배 줄어들고 메모리가 두 배 줄어든 이전 서버보다 거의 두 배 느립니다.NUMA 아키텍처는 ActivePivot의 성능에 어떤 영향을 줍니까?

우리는 두 서버 간의 차이점을 조사했으며 큰 서버는 NUMA 아키텍처 (비 균일 메모리 액세스)을 가지고있는 것으로 보입니다. 각 CPU 소켓은 물리적으로 메모리의 1/4에 가깝지만 나머지 부분에서는 더 멀리 떨어져 있습니다 ... 우리의 응용 프로그램을 실행하는 JVM은 큰 전역 힙을 할당합니다. 각 NUMA 노드에 해당 힙의 무작위 비율이 있습니다. 우리의 분석은 메모리 액세스 패턴이 꽤 임의적이며 CPU 코어가 원격 메모리에 액세스하는 데 종종 시간을 낭비한다는 것입니다.

NUMA 서버에서 ActivePivot을 활용하는 것에 대한 피드백을 찾고 있습니다. ActivePivot 큐브 또는 스레드 풀을 구성하고 쿼리를 변경하고 운영 체제를 구성 할 수 있습니까?

답변

13

Peter는 현재 NUMA 아키텍처의 성능 영향을 줄이기 위해 사용할 수있는 일반 JVM 옵션에 대해 설명했습니다. NUMA 인식 JVM은 NUMA 노드와 관련하여 힙을 분할하며, 스레드가 새 객체를 만들면 해당 스레드를 실행하는 코어의 NUMA 노드에 객체가 할당됩니다 (동일한 스레드가 나중에 사용하는 경우). 객체는 로컬 메모리에 저장됩니다). 또한 힙을 압축 할 때 NUMA를 인식하는 JVM은 노드간에 큰 데이터 청크를 이동하는 것을 방지합니다 (정지 이벤트의 길이를 줄입니다).

NUMA 하드웨어 및 모든 Java 응용 프로그램에서 -XX : + UseNUMA 옵션이 활성화되어 있어야합니다.

그러나 많은 도움이되지 않는 ActivePivot의 경우 : ActivePivot은 메모리 내장 데이터베이스입니다. 실시간 업데이트가 있지만 대부분의 데이터는 응용 프로그램의 수명주기 동안 주 메모리에 있습니다. JVM 옵션이 무엇이든간에 데이터는 NUMA 노드로 나뉘며 쿼리를 실행하는 스레드는 임의로 메모리에 액세스합니다. ActivePivot 쿼리 엔진의 대부분 섹션이 메모리만큼 빠르게 실행된다는 것을 알면 NUMA 영향이 특히 눈에.니다.

그래서 NUMA 하드웨어에서 ActivePivot 솔루션을 최대한 활용할 수 있습니까?

ActivePivot 응용 프로그램이 일부 리소스 만 사용하는 경우 쉽게 솔루션을 사용할 수 있습니다 (여러 ActivePivot 솔루션이 동일한 서버에서 실행되는 경우가 많음). 예를 들어 ActivePivot 솔루션은 64 개 중 16 개 코어 만 사용하고 TeraByte는 256 개 밖에 사용하지 않습니다. 이 경우 JVM 프로세스 자체를 NUMA 노드로 제한 할 수 있습니다.

리눅스에 다음과 같은 옵션 (http://linux.die.net/man/8/numactl)와 JVM 출시 앞에 : 전체 서버가 하나 개 ActivePivot 솔루션에 전념하는 경우

numactl --cpunodebind=xxx 

을, 당신은 데이터를 분할하는 ActivePivot 분산 아키텍처를 활용할 수 있습니다. 4 개의 NUMA 노드가있는 경우 4 개의 ActivePivot 노드를 호스팅하는 4 개의 JVM을 시작합니다. 각 노드는 해당 NUMA 노드에 바인딩됩니다. 이 배포를 통해 쿼리가 노드 사이에 분산되며 각 노드는 올바른 NUMA 노드 내에서 최대 성능으로 작업 공유를 수행합니다.

+0

numactl을 사용할 때, 그 노드에 메모리를 제한하기 위해'--cpunodebind = nodes, -N nodes' 스위치에'--membind = nodes, -m nodes' 스위치를 추가하는 것을 권장합니다. 그렇지 않으면 메모리의 작은 부분은 대개 외부 노드에 할당됩니다 ('-XX : + UseNUMA'로조차도) –

5

이 당신이 특정 소켓에 JVM을 잠글 수 taskset를 사용하여 효율적으로 네 개의 기계에 서버를 중단해야 할 수도 있습니다 기대하는 결과를 얻을 수없는 경우 당신은 -XX:+UseNUMA

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

를 사용하여 시도 할 수 있습니다 각각 하나의 JVM이 있습니다.

더 많은 소켓이있는 머신은 메모리 (심지어 로컬 메모리)에 대한 액세스 속도가 느리고 결과로 원하는 성능을 언제나 얻을 수있는 것을 관찰했습니다.

관련 문제