성능 시뮬레이션 - ① DB 커넥션 에서 테스팅 하였던 내용을 토대로 버츄얼 쓰레드 테스트를 진행해보았습니다. '성능 시뮬레이션 - ① DB 커넥션 - 2) 서버 스펙보다 과도한 요청 넣기'에서톰캣 스레드 개수를 변경시켜서 테스트를 해보았고,200개일때 속도가 제한이 TPS가 많이 제한되었던것을 확인 할 수 있었습니다.그러면 현재 Java 21에 도입된 버츄얼쓰레드(경량쓰레드) 를 사용해서 측정해보면 어떻게 될까궁금하게 되어 측정하게 되었습니다. 1) 가상 스레드 사용 및 테스트- CPU: 2 Core- Ram: 1G- Connection: 20 - 500로 설정하였고,Spring Property에 다음과 같이 설정을 추가했습니다.spring: threads: virtual: enabl..
데이터 베이스 접근을 모니터링을 해보기모니터링 툴로는 Prometheus - Grafana으로 작동하였습니다. 1) 슬로우 쿼리(조회)로 인한 현상을 확인해보기SELECT * FROM shop_order WHERE seq_shop_order = 1 AND SLEEP(10) = 0 // QueryDsl queryFactory .select(Projections.constructor(OrderDetail.class, orderEntity.orderName, orderEntity.price, orderEntity.regId)) .from(orderEntity) .where(orderEntity.id.eq(seqOrderId) ..
Integer 128 != Integer 128 ??앞서 String Pool에서 문자열의 동일비교에 대해 공부해보았는데,이번엔 흥미로운 숫자에 대해서도 동일비교가 문제가 되는 상황이 있다. Integer a1 = 1;Integer a2 = 1;Integer a3 = 128;Integer a4 = 128;Integer a5 = 256;Integer a6 = 256;System.out.println(a1 == a2); //trueSystem.out.println(a3 == a4); //falseSystem.out.println(a5 == a6); //false 왜 이러한 상황이 나오는 것일까? 아시다시피 Integer Class는 Object객체이다. 기본형타입과는 다른 비교가 필요하다.그렇다면 a1,a2..
Garbage Collection (가비지 컬렉션) 이란?Java에서 Heap메모리영역에서 자동으로 더 이상 참조(사용)되지 않는 인스턴스(메모리 영역)들을 관리 및 청소해주고 메모리 파편화를 줄여주는 JVM 프로세스의 일부분입니다.(PS. C와 같은 일부 언어에서는 이 작업을 수동으로 관리해주어야합니다.) 어떠한 원리로 작동하는가?작동 원리는 간단합니다.1. 인스턴스 생성시 메모리를 할당합니다. (힙)2. 사용되는 메모리 영역과 사용되지 않는 메모리 영역을 식별합니다.3. 사용되지 않는 메모리를 회수하여 운영체제에 다시 전달합니다. 왜 기존 GC는 Young영역 과 Old 영역을 나누었을까? (Z GC 제외) 위는 객체 수명에 대한 분포도에 대한 그림입니다.시간이 오래될 수록 살아있는 객체들이 짧은..
Java의 String Pool 이란 ?문자열 리터럴이 저장되는 Java Heap의 영역이다.(Java 7 이전까지는 Perm영역이었으나, OOM 문제로 인해 Heap으로 이동하였습니다.String Intern Pool 혹은 String Constant Pool이라고도 불립니다.. 문자열 리터럴?Java에서 문자열을 생성하는 방식의 차이입니다.String literal = "리터럴"; --> 리터럴 생성 방식String object = new String("object"); --> 생성자 생성 방식 왜 String Pool 이 필요할까?문자열을 만들때마다 문자열 객체를 힙메모리에 매번 생성되는것을 방지하기 위해서입니다..--> 이를 위해 문자열 객체 생성시 문자열 리터럴을 사용하는 것을 추천합니다.. ..
레디스의 중요 포인트 정리 싱글 스레드 레디스에서 클라이언트 커맨드를 처리하는 부분은 이벤트 루프를 이용한 싱글 스레드로 동작한다. 싱글 스레드로 동작하는 것은 다른 사용자가 오래 걸리는 커맨드를 수행하면, 다른 사용자는 그 쿼리가 완료될 때 까지 대기할 수 밖에 없으므로 느린 커맨드 사용에 주의를 해야한다. 다만 모든 작업에서 싱글 스레드로 처리되는 것은 아니고,일부 비동기 작업에 대해서 백그라운드 스레드가 작동한다. (EX: UNLINK, FLUSHALL ASYNC, FLUSHDB ASYNC) 네트워크 I/O 병목 현상을 해결하기 위해서 I/O스레딩이라고 하는 핵심 네트워크 모델에 멀티스레딩을 6.0버전에서부터 도입하였는데 설정파일을 통해 멀티스레딩을 사용할 수 있다. (이전보다 2배정도의 성능 향..
Java Archive(JAR)은 메니페스트 파일로 설명할 수 있는데, JAR파일 형식은 Java클래스 파일과 리소스 및 메타데이터를 단일 파일로 패키지하는 데 사용되는 압축 파일 형식이다. 매니페스트 파일은 JAR파일 자체에 대한 메타 데이터를 제공하는데 사용된다. 매니페스트 파일은 다음과 같은 정보가 포함되어있다. 1. Main-class: JAR 파일 실행시 애플리케이션 진입 메인 클래스 지정 2.Class-Path: JAR파일에 대한 클래스 경로 종속성 지정 (애플리케이션에 필요한 클래스가 포함된 다른 JAR혹은 디렉토리를 포함할 수 있음) 3. Manifest-Version: 매니페스트 파일 형식의 버전 4. 작성자: JAR 파일을 생성하는데 사용된 도구, 버전, 작성자 , 시스템 식별 해당 파..
카프카 커넥트카프카 커넥트는 데이터 파이프라인 생성 시 반복 작업을 줄이고 효율적인 전송을 이루기 위한 애플리케이션이다.카프카 프로듀서-컨슈머 애플리케이션과 유사하지만 해당 애플리케이션은 세밀한 제어, 고유한 요구 사항의 경우 사용하고 커넥트의 경우 표준화된 접근방식에 대해 사용하게 된다. (템플릿) 파이프 라인 생성시 자주 반복되는 값(토픽 이름, 파일 이름, 테이블 이름)등을 파라미터로 받는 커넥터를 코드로 작성후에 파이프라인을 실행할 때는 코드 작성할 필요가 없기 때문이다. 카프카 커넥터는 프로듀서 역할을 하는 '소스 커넥터' 와 컨슈머 역할을 하는 '싱크 커넥터' 로 나뉜다.일정한 프로토콜을 가진 소스 애플리케이션이나 싱크 애플리케이션이 있다면 커넥터를 통해 카프카로 데이터를 보내거나데이터를 가져..