| En

zram 메모리 압축으로 RAM 한계 극복

zram의 개념과 원리 zram(이전 명칭: compcache)은 리눅스 커널에서 제공하는 메모리 압축 기술이다. RAM의 일부를 압축해 가상 블록 장치로 사용하며, 2009년 Nitin Gupta가 처음 개발했다. 이후 리눅스 커널 3.14부터 정식으로 통합되어 지금까지 널리 사용되고 있다. 핵심은 디스크 기반 스왑 대신 압축된 RAM을 스왑 공간으로 활용해 디스크 I/O 부담 없이 메모리 사용 효율을 높이는 데 있다. 특히 메모리가 제한된 환경에서 효과적이다. zram 장치는 데이터를 메모리에 저장하기 전에 압축하고, 접근할 때 다시 압축을 해제한다. 이 과정에서 CPU 리소스를 일부 사용하지만 디스크 I/O를 피할 수 있어 전체 성능에 도움이 되는 경우가 많다. 일반적으로 zram은 LZO(Lempel-Ziv-Oberhumer), LZ4, ZSTD(Zstandard) 같은 고속 압축 알고리즘을 사용하며, 2:1에서 4:1 정도의 압축률을 기대할 수 있다. 압축 알고리즘은 시스템 요구사항에 따라 선택할 수 있고, Ubuntu 24.04에서는 기본적으로 속도와 압축률의 균형이 좋은 LZ4를 사용한다. ...

2025년 5월 2일 · 4 분 · 777 단어 · In-Jun

JPA N+1 쿼리 문제

N+1 문제란 N+1 문제는 ORM(Object-Relational Mapping)에서 자주 발생하는 성능 문제 중 하나로, 연관된 엔티티를 조회할 때 연관된 엔티티의 수(N)만큼 추가로 쿼리가 실행되어 결과적으로 쿼리의 수가 N+1개가 되는 문제이다. 이러한 쿼리의 수가 많아지면 데이터베이스와의 통신이 늘어나고 네트워크 왕복 시간이 증가하며 데이터베이스 커넥션 풀이 고갈될 위험이 있어 성능이 크게 저하될 수 있다. N+1 문제의 역사와 배경 N+1 문제는 ORM 프레임워크가 등장하면서 함께 나타난 고질적인 성능 문제다. 특히 Hibernate와 JPA에서 지연 로딩(Lazy Loading) 전략을 사용할 때 자주 드러난다. ORM은 객체 지향적으로 데이터를 다루기 위해 연관된 엔티티를 필요할 때까지 미뤄서 로딩한다. 이 방식은 불필요한 데이터 로딩을 줄이고 초기 조회 속도를 높인다는 장점이 있다. 하지만 개발자가 연관 관계를 의식하지 못한 채 반복문 안에서 연관 엔티티에 접근하면, 각 엔티티마다 개별 쿼리가 실행되면서 N+1 문제가 발생한다. 이 때문에 N+1 문제는 Hibernate 초기 버전부터 지금까지 계속 주의해야 할 대표적인 성능 이슈로 꼽힌다. ...

2024년 6월 8일 · 6 분 · 1101 단어 · In-Jun

JPA Lazy Loading과 Eager Loading 성능 비교

로딩 전략의 역사와 필요성 ORM(Object-Relational Mapping) 프레임워크는 객체지향 프로그래밍과 관계형 데이터베이스 사이의 불일치를 해결하기 위해 등장했다. 이 과정에서 연관관계를 가진 엔티티를 어떻게 효율적으로 로딩할 것인가는 중요한 과제가 되었다. 초기 ORM 구현체들은 모든 연관 엔티티를 즉시 로딩하는 방식을 사용했지만, 이는 불필요한 데이터까지 메모리에 적재해 성능 저하를 일으켰다. Hibernate는 이를 해결하기 위해 프록시 기반의 지연 로딩 메커니즘을 도입했다. Hibernate는 2001년 처음 공개된 이후 로딩 전략을 지속적으로 개선해왔다. 초기 버전에서는 단순한 지연 로딩만 지원했지만, 이후 fetch join, batch fetching, subselect fetching 등 다양한 최적화 기법이 추가되었다. 이러한 기능들은 2006년 공개된 JPA(Java Persistence API) 1.0 표준에 반영되었고, JPA 2.0(2009년)과 JPA 2.1(2013년)을 거치며 @EntityGraph 같은 선언적 페치 전략도 도입되었다. 현재는 JPA 표준과 Hibernate 구현체가 함께 발전하면서 개발자에게 다양한 로딩 전략을 제공하고 있다. ...

2024년 6월 8일 · 7 분 · 1341 단어 · In-Jun
[email protected]