사건 발생 개요
- 카프카 도입과 함께 스톰 1.0.x 로 버전업 함
- 문제를 심플하게 하기 위해 SSID 토폴로지랑 Signal 토폴로지 중에서 리얼타임 기능을 주석 처리 함
- 처음에는 카프카 머신에서 스톰을 구동했음
- CPU를 많이 쓰는 문제인지, 카프카도 죽고 스톰도 죽는 문제 발견
- 카프카가 죽으면 문제가 너무 복잡해지기 때문에 스톰 머신을 카프카 머신에서 빼서 새로 설정 했음
- 이전 docker 가 스톰 0.8.x에 맞춰서 설정 됐고, nimbus, supervisor 등 각 인스턴스 별로 이미지가 별도로 있어서 관리 이슈가 있었음. 특히 슈퍼바이저의 경우 kill 커멘드가 씹히는 문제가 있어서 도커 리드플로이도 잘 안되는 문제가 있었음. 그래서 새로운 도커 이미지를 만듬. deploy 프로젝트 참고
- 도커로 스톰 1.0.0을 디플로이 했으나 signal topology 가 10분~1시간 정도 작업을 돌다가 처리량이 0이되는 문제 발견 (좀비 상태)
- 스톰 1.0.1로 업그레이드 함 => 문제 계속 됨
- 카프카 lib를 cdh꺼랑 다른걸 쓰는 문제가 있어서 수정 해 봄 => 문제 계속 됨
- max spout pending 값을 조절해 봄 => 문제 계속 됨
- 카프카의 zk 타임아웃이나 기타 설정들을 마구 수정해 봄 => 문제 계속 됨
- 각 인스턴스 별로 로그를 봤는데 아무 로그가 안찍힘 => 디버그를 키고 서밋 함 => 로그가 찍히나 에러나 기타 정보를 얻을 수 없었음
- 도커가 문제인가 싶어 위에 도큐멘트 대로 app4-6에 수동으로 storm을 인스톨함 => 문제 계속 됨
- 처리량이 0가 됐을 때 top을 찍어 봤는데 이상하게도 CPU가 높은 부분을 확인, 메모리 사용량이 스톰 워커당 기본 값 768에 육박하는거 확인
- 메모리 사용량을 높혀보니 (1기가) 더 천천히 좀비 상태가 되는 것 확인
- 스톰 기본 설정 값을 확인해보니 아래와 같이 다른 부분 확인 ipv4 사용을 위해서 기존에 우리가 사용하던 설정:
worker.childopts: "-Djava.net.preferIPv4Stack=true"
스톰 github에 있는 최신 설정 기본 값:
worker.childopts: "-Xmx%HEAP-MEM%m -XX:+PrintGCDetails -Xloggc:artifacts/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=artifacts/heapdump"
(참고: https://github.com/apache/storm/blob/master/conf/defaults.yaml)
- 기본 설정 값에 GC에 관한 부분이나 Xmx 설정이 있는데 우리가 ipv4 쓴다고 덮어 쓴 것을 확인하고 아래와 같이 설정값을 세팅함
worker.childopts: "-Xmx%HEAP-MEM%m -XX:+PrintGCDetails -Xloggc:artifacts/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=artifacts/heapdump -Djava.net.preferIPv4Stack=true"
또한 워커와 supervisor 메모리 설정을 아래와 같이 세팅:
worker.heap.memory.mb: 2048
supervisor.memory.capacity.mb: 30720
15시간째 좀비 상태 안되는 것 확인