본문 바로가기
반응형

전체 글179

Spring Batch에서 Bulk Insert로 전환하기 회사에서 혼자 관리하고 있는 배치가 40개가 넘는다.... 허허... 특정 기존 배치가 너무 느려 성능 최적화를 일정을 잡고 진행하기로 했다. 최적화를 한 번 해본 경험이 도움이 되었는지 첫 번째로 구조적으로 문제가 없는가?를 판단했다. 처리해야 하는 데이터는 볼륨이 얼마나 되는지, 읽어오는 쿼리가 최적화가 되어있는지, 메모리 누수는 없는지 등등... 정확하게 파악해 나갔다. 특정 Step에서 대략 2500만 데이터를 읽어서 10개가 넘는 테이블에 적재해야 하는 작업이 발생했다. 이 시점에 정말 느려 최적화가 필요했다. 일단 이 Step에서 병렬처리(Parallel)로 진행하도록 변경했다. 메모리 사용량도 증가시켰다. 병렬처리의 키가 될 수 있는 데이터를 분석해서 thread를 20개로 적용해 놨다. 기.. 2024. 2. 3.
docker: 'compose' is not a docker command. 터미널에서 docker-compose를 사용할 일이있어 homebrew로 깔아서 사용하려다가 커맨드가 안먹혔다. 뭐지... sudo brew install docker-compose docker-compose -v sudo mkdir -p /usr/local/lib/docker sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins /usr/local/lib/docker/cli-plugins 요로케 작성하면 플러그인을 직접 설정해주면된다. 끝! 참고자료 2023. 11. 26.
Spring Batch Partitioner를 이용해서 병렬처리할 때 주의점! 배치에서 여러 개의 하위 Step에 OOM이 발생했다. 원인이 무엇일까? 해당 배치에 Heap Dump를 분석했다. 특정 배치가 뒤로 갈수록 메모리 사용률이 90%가 넘는 것을 확인했다. 다시 확인해 봤다. 특정 Step에서 병렬처리하기 위해 partitioner를 사용해서 병렬처리를 하고 있는데 이 방식이 잘못된 것을 인지했다. 보편적으로 병렬처리 할 Setp이 실행되기 전 partition을 구하고 병렬처리하는 것이 일반적이다. 해당 배치는 병렬처리하는 Step이 많아 파티션을 공통으로 사용하도록 설계되었다. public class StepUtil { public static Map context; ~~~~~하위 코드작성~~~~~~ } 이런 정적(static) 클래스로 파티션이 될 모수를 미리 구해놓.. 2023. 9. 28.
Spring Batch(+Mybatis)에서 Commit하기 전 실행된 SQL 문의 개수를 확인하고싶으면? 정말 간단한 배치를 만들고 있었다. 복잡하지 않아서 Tasklet방식으로 만들었다. 간단히 설명하자면 하나의 Step에서 자료를 밀어 넣고 넣은 총개수를 다른 테이블에 넣어주는 작업이 있었다. 물론 step을 나눠서 하는 방법도 있었지만, 정말 간단한 배치고 일 년에 한 번 정도로 사용 빈도도 적어 하나의 Step에서 처리하고 싶었다. insert를 하고 commit 하기 전에 개수를 확인할 수 있는 방법은 없을까? 찾아보니 확인할 수 있는 방법이 있었다. import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springf.. 2023. 7. 15.
ConcurrentHashMap의 get(), put() 분석 동시성 문제를 해결할 수 있는 ConcurrentHashMap이 있습니다. 동시성을 지원하며, 여러 스레드가 동시에 안전하게 접근할 수 있는 해시 맵입니다. 내부적으로 세그먼트라고 하는 여러 개의 부분 맵으로 나뉘어져 있습니다. 각 세그먼트는 서로 독립적으로 동작하며, 동시에 여러 스레드가 각각의 세그먼트에 접근할 수 있습니다. 각 세그먼트는 독립적인 잠금을 가지고 있으므로, 동시에 여러 스레드가 다른 세그먼트에 접근하여 작업을 수행할 수 있습니다. public V get(Object key) { Node[] tab; Node e, p; int n, eh; K ek; int h = spread(key.hashCode()); if ((tab = table) != null && (n = tab.length).. 2023. 7. 2.
Objects.requireNonNull은 왜 사용할까? https://github.com/pinpoint-apm/pinpoint GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed systems. APM, (Application Performance Management) tool for large-scale distributed systems. - GitHub - pinpoint-apm/pinpoint: APM, (Application Performance Management) tool for large-scale distributed sys... github.com 오픈소스인 pinpoint의 코드를 분석하던 중 중간중.. 2023. 6. 1.
EC2를 사용하다가 용량이 꽉찼을 때 해결방법 Elastic Beanstalk을 사용하다가 용량이 꽉 찼다. 원인은 서비스의 로그 파일이 꽉 찼던 것 그래서 EC2와 연결된 볼륨의 크기를 올렸다. 프리티어 기준 AWS EBS는 30GB까지 사용할 수 있다. 이 내용은 아래 설명서를 참조했다. https://aws.amazon.com/ko/ebs/pricing/ 고성능 블록 스토리지 – Amazon EBS 요금 – Amazon Web Services 범용 SSD(gp3) 볼륨의 볼륨 스토리지에 대해서는 해당 스토리지를 종료할 때까지 매월 프로비저닝하는 용량(GB)을 기준으로 요금이 청구됩니다. 모든 gp3 볼륨에는 프로비저닝된 IOPS 3,000(초당 입력/ aws.amazon.com 해당 EC2에 터미널로 들어가서 사용량을 확인해 보자 df -h 8.. 2023. 5. 21.
서버가 죽었다!.... 502....(100 % of root file system is in use. 0 MB free.) 주말 동안 삽질을 오지게 했다... 정리할 겸... 작성해 보자... 현재 Amazon Elastic Beanstalk, EC2로 서버를 운영하고 있다. 물론 인스턴스는 t2.micro로 무료버전을 쓰고 있다. 잘 사용하다가 갑자기 배포가 안된다... Git-Actions로 배포파이프라인을 구축해서 사용하고 있다. EC2의 볼륨을 8GB로 사용하고 있어서 부족한 걸까?.... 확인해 보자! 100 % of root file system is in use. 0 MB free. 예상이 맞았다. 어떤 파일이 용량을 잡아먹고있는지 확인해 보니 로그 파일이 원인이었다. https://stackoverflow.com/questions/50847838/running-out-of-disk-space-in-amazon-.. 2023. 5. 6.
회사에서 Spring batch 짜면서 삽질한거 정리 요즘 배치 작업을 하면서 항상 벽에 막힌다... 데이터 양이 많아 일반적인 처리방식으로는 평생 안 끝날 것 같다... 그래서 DB 테이블을 업무에 맞춰서 파티션을 나누기도 하고 인덱스를 어떻게 잡아야 하는지도 많이 고민했었다. 혼자 끙끙 앓고 있었는데 유튜브에서 아주 좋은 영상을 봤다. https://www.youtube.com/watch?v=2IIwQDIi3ys 직접 겪어보니 더 재미있었다. 병렬 처리 할 때는 파티션을 나누는 기준부터 각 데이터 순서를 보장해야 하는 작업은 별도로 청크방식으로 작업하고 순서를 보장 안 해줘도 되는 작업은 병렬처리를 통해 속도를 개선하고 있다. 특히 병렬 처리 할 경우 스레드 안정성도 고려해야 하고 서버 자원의 대한 이해가 있어야 한다... 암튼... 성능 최적화가 더 .. 2023. 4. 5.
반응형