기본 콘텐츠로 건너뛰기

Drools Fusion "Steam mode" Issue and Solution

ESP(Event Stream Processing)

센서, CCTV등 다양한 소스(Source)에서 들어오는 실시간 이벤트를 이벤트 스트림이라고 한다. 그리고 이벤트 스트림을 받아서 이를 실시간으로 처리하는 것을 Event Stream Processing이라고 한다. 처리라는 것은 대부분 특정 이벤트에 대해서 사용자가 원하는 동작 또는 알람을 보내는 작업을 말한다.

이슈 발생

대용량 이벤트 처리 기술은 항상 퍼포먼스와 안정성이 중요하다. 지금은 서버에서 Drools Fusion을 사용하고 있다. 이전 버전에서 Esper를 사용하였으나 라이센스 문제로 인해서 Drools Fusion으로 옮겨왔다.
문제는 성능 테스트 중에 발생하였는데 메모리 leak 문제였다. “Always” 문제였기 때문에 문제점 파악은 쉽게 되었다.



테스트 방법

* 5대의 서버를 준비
* JMeter _를 이용하여 throughput을 조절해가며 이벤트 발생
* 1대의 서버에 서버 App 실행
* JConsole을 이용하여 JVM Heap 사이즈를 모니터링

결론

최종적으로 이벤트가 고속이든, 저속이든 Heap 사이즈가 늘어난다는 판단

분석 방법

JMap을 이용하여 Memory Dump하였다. 그리고 메모리 덤프 분석툴인 MAT를 이용하여 Dump 분석 결과를 확인

분석 결과

모든 이벤트 오브젝트가 Drools hashmap에 reference되어 있었다.

문제 해결 과정(How to solve)

우선은 내 코드들을 의심해봤다. 이벤트 수신, Pooling, 처리, 저장, DB Access 부분을 모두 훓어 보았다. 그러나 문제가 될 만한 부분은 찾지 못했다. 이건 뭐지? 내 상식 이상의 뭔가가 있나 한참을 고민했다. 결국은 소스 코드를 링크해서 디버깅을 해야하나, 소스 코드 분석을 해야하나 고민하면서 Drools 메뉴얼을 훓어 보다가 머리 속에서 스파크가 팍 튀었다. 다음은 Drools Fusion User Manual이다.

 The engine will make this analysis for the whole rulebase and find the offset for every event type. Whenever an implicit expiration offset clashes with the explicit expiration offset, then engine will use the greater of the two.

Drools Fusion은 ESP를 위해서 “STREAM.MODE”를 지정해야 한다. 이 때, Event를 정의하여 사용한다.
위의 메뉴얼 내용은 언제 이벤트가 제거되는지에 대한 설명인데 engine will use the greater of the two.
즉, 둘다 없을 경우에는 비교되는 값이 없기 때문에 사라지지 않는다는 것이다.
그러나 그것은 말이 안된다. 둘다 없을 경우에는 사실은 들어오자마자 사라져야 하는 것이 맞다. 아무래도 코드 상에서 두 케이스 모두 없을 경우에 대한 예외 처리가 없는듯하다.

해    결(Solution)

그래도 어찌되었건, 오픈 소스 디펙이 있더라도 문제를 해결해야 하는 것이 프로그래머 아니던가.
결국에는 다음과 같이 해결하기로 했다.
사실 Temporary condition을 쓰지 않는다면 SteamMode를 사용할 필요가 없다. 그러나 우리 시스템 특성상 평소에 설정이 없을 경우에는 CloudMode처럼 사용하다가 설정이 추가될 경우에는 StreamMode로 동작하게 되니 우회적으로 해결해야겠다는 생각이 들었다.
SteamMode에서 시간 관련 함수를 쓰지 않는다면, 명시적(explicit)으로 expired time을 설정해줘야지 이벤트가 GC에서 사라진다. 그러나 이것은 확실히 버그 같다.

댓글

이 블로그의 인기 게시물

AWS ELB 504 Error

AWS EC2  운영 중 가끔씩 볼 수 있는 에러가 있습니다. 대표적으로 다음의 세가지 502, 503, 504 입니다. 이 중에서 이번에 알아볼 문제는 HTTP 504 에러입니다 .  타임 아웃이 되어   Request 를 처리하지 못하는 상황이 됩니다 .   해결 방법부터 이야기 하자면 다음과 같이 웹서버의 Time-out 시간을 60 초 이상으로 늘리는 것입니다 . Web Server & Application Time-out >= 60 sec 그 이유는 다음과 같은 ELB의 특성 때문입니다. ELB는 클라이언트와 EC2 서버 양쪽으로 커넥션을 유지하고 있습니다. ELB는 클라이언트와  EC2 서버간의 커넥션을 관리하는 역할을 맡고 있습니다. 그래서 유효한 커넥션만을 남겨놓습니다. 이를 위해서 Time-out 시간을 가지고 이 시간동안 데이터가 송수신되지 않으면 연결을 끊습니다.  기본적으로 Elastic Load Balancing는 두 연결 모두에 대해 Time-out(유휴 시간) 시간을 60초로 되어 있습니다. 그렇기 때문에 HTTP 또는 HTTPS를 사용할 경우 "KeppAlive" 옵션을 사용하여 커넥션을 재활용해야 합니다. 이 때  ELB 커넥션도 재사용되기 때문에 CPU 사용률을 줄일 수 있습니다. Browser Time-out Opera 11.11 120 sec IE 9 60 sec Chrome 13 300 sec FireFox 4 115 sec 서버 로직 중에서 60초 이상 실행될 수 있는 부분이 있는 경우 504 에러를 자주 볼 수 있을 것입니다. 문제 해결을 위해서는 Web Server는 물론  Tomcat 설정 또한 60초 이상으로 변경해주어야 합니다. ...

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j comparison

번역 작업 원문 NoSQL DB 비교 분석 자료 MongoDB 구현 : C++ 특징 : 몇가지 SQL과 비슷한 속성을 가짐(Query, index 등) 라이센스 : AGPL 프로토콜 : Custom, binary(BSON) 특징 Master/slave replication(auto failover with replica sets) Sharding built-in Queries are javascript expressions Run arbitrary javascript functions server-side Better update-in-place than CouchDB Uses memory mapped files for data storage Performance over features Journaling (with --journal) is best turned on On 32bit system, limited to 2.5Gb An empty database takes up 192Mb GridFS to store big data + metadata (not actually an FS) Has geospatial indexing 주요 사용처 만약 다양한 쿼리가 필요하다면 map/reduce 함수가 아니라 인텍스를 선호한다면 big DB에서 좋은 성능을 바란다면  CouchDB를 사용하길 원하지만, filling up disks에 너무 많은 데이터 변화가 있다면 사용예 For most things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back. CouchDB 구현 :  Erlang 주요특징 : DB consistency, 쉬운 사용 라이센스 : Apache 프로토콜 : HTTP/REST 상세특징 Bi-directional r...

Cron expression

초 0-59 , - * / 분 0-59 , - * / 시 0-23 , - * / 일 1-31 , - * ? / L W 월 1-12 or JAN-DEC , - * / 요일 1-7 or SUN-SAT , - * ? / L # 년(옵션) 1970-2099 , - * / * 모든 값 ? 특정 값 없음 - 범위 지정에 사용 , 여러 값 지정 구분에 사용 / 초기값과 증가치 설정에 사용 L 지정할 수 있는 범위의 마지막 값 W 월~금요일 또는 가장 가까운 월/금요일 # 몇 번째 무슨 요일 2#1 => 첫 번째 월요일 예제) Expression Meaning 초분시일월주(년) "0 0 12 * * ?" 아무 요일, 매월, 매일 12:00:00 "0 15 10 ? * *" 모든 요일, 매월, 아무 날이나 10:15:00 "0 15 10 * * ?" 아무 요일, 매월, 매일 10:15:00 "0 15 10 * * ? *" 모든 연도, 아무 요일, 매월, 매일 10:15 "0 15 10 * * ? 2005" 2005년 아무 요일이나 매월, 매일 10:15 "0 * 14 * * ?" 아무 요일, 매월, 매일, 14시 매분 0초 "0 0/5 14 * * ?" 아무 요일, 매월, 매일, 14시 매 5분마다 0초 "0 0/5 14,18 * * ?" 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 "0 0-5 14 * * ?" 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 "0 10,44 14 ? 3 WED" 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 "0 15 10 ? * MON-FRI" 월~금, 매월, 아무 날이나 10:15:00 "0 15 10 15 * ?...