Cassandra 로그분석을 하던 중,
Writing Memtable-local@974563919(0.342KiB serialized bytes, 2 ops, 0%/0% of on/off-heap limit), flushed range = (null, null]
위와 같은 로그가 있었다.
여기서 Memtable은 메모리에 있는 테이블이고 974563919는 메모리 테이블의 식별자일 것이다.
위 로그를 한 번 뜯어보자
Memtable은 각 Cassandra 테이블에 대해 생성된 메모리 내 캐시이다. 캐시이니 최근에 읽거나 수정한 데이터가 포함되어 있다. 따라서 노드에서 테이블의 데이터를 읽을 때마다 먼저 Memtable에 최신 데이터가 있는 지 확인한다. 최신 데이터가 없다면디스크에서 데이터를 읽고 MemTable에 캐시한다. 최대 크기, 시간 제한, 업데이트 수 등 정의된 기준이 충족되면 디스크에 flush된다.
on-heap은 일반적으로 자바 어플리케이션에서 객체를 생성하면 저장되는 메모리 영역(Java Heap)이다.
GC(Garbage collector)가 관리하는 영역이기도 하며, 따라서 객체의 생성, 소멸 또한 유저가 관여를 하지 않아도 된다. 하지만 GC작업을 하는 중에는 이른바 Stop the world로 GC 쓰레드를 제외한 다른 쓰레드는 실행 중지가 되며 메모리의 큰 객체를 처리 중에는 상당히 어플리케이션 성능 저하가 심하다.
Cassandra 2.1부터 offheap 메모리를 memtable에 사용할 수 있다.
off-heap는 Heap 바깥의 (즉, GC의 관리하에 있지않다) serialized objects가 저장되는 메모리 영역이다. GC가 관리하지 않는 대신 유저가 라이브러리를 통해서 관리할 수 있다. 유저가 관리하기에 GC의 Stop the world로 인한 어플맄이션 성능 저하를 방지할 수 있다.
따라서 로그 분석을 하면 974563919번 2회 연산된 메모리 캐시 테이블이 0.342KiB 크기의 직렬화된 데이터를 가지고 디스크의 SSTable에 플러시했다는 것이다. 이것이 또한 off heap, on heap 최대치의 0%를 차지한다는 것이다. 즉 크기가 매우 작다는 것. 이때 (null, null]은 특정 범위가 지정되지 않아 전체 범위가 플러시 대상일 수 있다.
https://stackoverflow.com/questions/6091615/difference-between-on-heap-and-off-heap
https://avdeo.com/tag/partition-summary/