cubrid
cubrid copied to clipboard
[CBRD-25414] The phenomenon of heap memory usage increasing each time utilities are executed
http://jira.cubrid.org/browse/CBRD-25414
Purpose
-
문제 상황
- memmon 유틸리티를 반복적으로 실행 시 힙메모리가 1160bytes씩 증가하는 문제
- 세션 생성 후 정상적인 종료가 아닌 kill 명령어를 통한 강제 종료 시 힙메모리가 1160bytes 증가된채로 정리되지 않는 문제
-
1번 문제 원인
- 유틸리티 실행 시 세션을 생성하게 되는데, 이 때 세션 파라미터값을 저장하기 위한 힙메모리 1160bytes를 할당받습니다.
- 하지만 세션 종료 시, 위에서 할당받았던 힙메모리 영역을 반환시켜주지 않고 종료하고 있기 때문에 발생하는 문제입니다.
- 따라서 memmon 유틸리티 뿐만 아니라 세션을 생성하는 모든 유틸리티에서 발생하는 문제임을 확인하였고, 세션을 할당받는 모든 유틸리티 대상으로 세션을 반환하도록 수정하였습니다.
-
2번 문제 원인
- 유틸리티가 세션을 생성한 후 강제로 종료하여 세션이 만료되면 만료된 세션을 처리하는 daemon에서 세션을 free 시켜줘야하는데 hashmap에서만 삭제처리를 진행하고 세션을 free시켜주지 않아 발생하는 문제입니다.
- 따라서, 해당 함수 내부에 세션이 할당받은 힙메모리 영역을 반환하도록 수정하였습니다.
주요 함수 및 변수
- states_hashmap<SESSION_ID, session_state>
- session state를 저장하는 해시맵
- lockfree hashmap
- db_find_or_create_session()
- 세션을 생성하는 함수, 해당 함수를 호출하게 되면 세션파라미터 저장을 위한 힙메모리 영역을 생성하게 됩니다.
- 따라서 db_end_session()을 사용하여 해당 영역을 정리해주는 작업이 필요합니다.
- db_end_session()
- 클라이언트가 서버에게 세션 종료를 요청하는 함수
- 해당 함수를 호출하면 서버에게 net_request를 사용하여 서버 종료를 요청하게 됩니다.
- session_Control_daemon
- 만료된 세션이 있는지 확인하고 제거하는 daemon
- 60초 간격으로 session_remove_expired_sessions() 함수 호출
- session_remove_expired_sessions()
- hashmap에서 session 정보를 불러와 session_check_timeout() 함수를 통해 현재 시간과 session에 저장되어있는 active_time을 비교하여 그 둘의 차이가 timeout 값 이상이면 만료된 세션이라고 판단하여 session_states_hashmap에서 erase 하는 함수
- 세션을 free 시켜주진 않고 있어 해당 함수 내부에 세션을 free시켜주도록 코드를 추가
- css_connection_handler_thread
- client와 server 간의 connection을 handling하는 thread
- error가 발생하면 net_server_conn_down 함수를 호출
- net_server_conn_down()
- 클라이언트와의 연결이 끊어졌을 때 사용되는 함수
- 연결이 끊어진 session과 관련된 transaction과 thread가 다 끝날 때 까지 기다린 후 connection 정보 초기화와 session에 남아있는 query entry를 제거한다.
Implementation
- db_shutdown 함수 내부에 db_end_session 함수를 추가하여 shutdown 이전 세션이 할당받은 힙메모리 영역을 반환하도록 수정하였습니다.
- 만료된 세션을 hashmap에서 제거하는 데몬에서 만료된 세션을 free해주도록 수정하였습니다.
- db_shutdown 함수 내부에 db_end_session이 추가됨에 따라 db_shutdown 함수 호출 전 db_end_session을 호출하는 코드를 제거하였습니다.