Cassandra 자바 더미 외 메모리 검사 경험 기록

배경
최근 온라인 카 산 드 라 라 라 는 제품 을 준비 하고 있 으 며, 동료 들 은 작은 규격 의 ECS (8G) 의 압력 측정 을 하고 있다.압력 측정 시 OOM Killer 를 촉발 시 켜 카 산 드 라 프로 세 스 를 제거 하기 쉽다.문 제 는 8G 라 는 규격 으로 제 가 설정 한 힙 (Xmx) 이 높 지 않 습 니 다 (약 6.5g). 시스템 에 충분 한 공간 을 남 겼 습 니 다.자바 더미 의 외부 메모리 사용 이 예상 을 초과 하여 RES 가 증가 할 수 있어 야 OOM 을 실행 할 수 있 습 니 다.
조사 과정
0. DirectBuffer 유출 이나 JNI 라 이브 러 리 문제 가 어디 있 는 지 초보 적 으로 의심 합 니 다.
1. 관례 에 따라 구 글 perftools 를 통 해 외부 메모리 비용 을 추적 하지만 뚜렷 한 이상 은 발견 되 지 않 았 다.
2. 그리고 자바 NMT 로 한 번 보 았 지만 별 다른 이상 이 발견 되 지 않 았 다.
3. 여기 서 생각 이 끊 어 진 것 같 습 니 다. DirectBuffer 와 는 상 관 없 는 것 같 습 니 다.이때 나 는 프로 세 스 의 가상 메모리 가 매우 높 아서 이미 ECS 메모 리 를 초과 했다 는 것 을 알 았 다.여기에 문제 가 좀 있다 고 의심 하 다.
4. 프로 세 스 메모리 주소 공간 분 포 를 / proc / pid / smaps 를 통 해 확인 한 결과, 많은 mmap 파일 이 있 음 을 발견 합 니 다.이 파일 들 은 카 산 드 라 의 데이터 파일 입 니 다.
이 때 이 mmap file 가상 메모 리 는 2G 이지 만 물리 적 메모 리 는 0 입 니 다.
분명히 mmap 의 메모리 소 비 는 JVM hep 에 의 해 제어 되 지 않 는 다. 즉, 외부 메모리 이다.mmap 의 파일 데이터 가 디스크 load 에서 물리 적 메모리 (RES 증가) 에 들 어가 면 자바 NMT 와 google perftool 은 감지 할 수 없습니다. 이것 은 kernel 의 스케줄 링 과정 입 니 다.
5. 압력 측정 을 할 때 문제 가 발생 한 것 을 고려 하여 저 는 이 파일 들 을 읽 고 RES 가 증가 하 는 지, 얼마나 증가 하 는 지, 왜 증가 하 는 지 살 펴 보면 문제 가 여기에 있 는 지 추측 할 수 있 습 니 다.아래 명령 을 통 해 이전에 가 져 온 데 이 터 를 간단하게 읽 습 니 다.
cassandra-stress read duration=10m cl=ONE -rate threads=20 -mode native cql3 user=cassandra password=123 -schema keysp
ace=keyspace5 -node core-3

6. 압력 측정 기간 sar -B 을 관찰 할 수 있 습 니 다. major page fault 는 데이터 가 실제 디스크 에서 로드 되 어 메모리 에 들 어 갔 기 때 문 입 니 다.
동시에 mmap file 물리 메모리 가 20MB 로 증가 하 는 것 을 관찰 합 니 다.
최종 프로 세 스 RES 는 7.1 g 정도 올 라 약 600 M 증가 했다.
압력 (50 스 레 드) 이 증가 하면 mmap file 마다 물리 적 메모리 가 20MB 에서 40MB 로 증가 합 니 다.
7. Root cause 는 카 산 드 라 인식 시스템 이 64 인지 32 인지 mmap 를 사용 할 지 여 부 를 확인 합 니 다. ECS 는 모두 64 이지 만 실제 작은 규격 의 ECS 메모리 가 많 지 않 습 니 다.
결론.
1. 문제 의 원인 은 mmap 에서 메모리 비용 을 고려 하지 않 았 기 때문에 구체 적 인 조정 방법 은 매우 많다.작은 규격 의 ECS 에 대하 여 힙 설정 을 낮 추거 나 mmap 특성 을 닫 을 수 있 습 니 다 disk_access_mode=standard.
곽 택 휘
원문 을 읽다
본 고 는 운 서 지역사회 의 오리지널 내용 으로 허락 없 이 전재 할 수 없다.

좋은 웹페이지 즐겨찾기