mongoDB에 4 천만 데이터가 있습니다. 그 데이터를 컬렉션에서 병렬로 읽고, 처리하고 다른 컬렉션으로 덤핑합니다.Java 멀티 스레딩 성능이 스레드 풀 크기가 증가함에 따라 최악입니다.
작업 초기화를위한 샘플 코드. 2 CPU 1 개 코어 각각 :
ExecutorService executor = Executors.newFixedThreadPool(10);
int count = total_number_of_records in reading collection
int pageSize = 5000;
int counter = (int) ((count%pageSize==0)?(count/pageSize):(count/pageSize+1));
for (int i = 1; i <= counter; i++) {
Runnable worker = new FinalParallelDataProcessingStrategyOperator(mongoDatabase,vendor,version,importDate,vendorId,i,securitiesId);
executor.execute(worker);
}
각 스레드는 데이터로드가 다음 쿼리
mongoDB.getCollection("reading_collection").find(whereClause).
.skip(pagesize*(n-1)).limit(pagesize).batchSize(1000).iterator();
기계 구성을 사용하여 페이지 매김
public void run() {
try {
List<SecurityTemp> temps = loadDataInBatch();
populateToNewCollection(temps);
populateToAnotherCollection(temps);
} catch (IOException e) {
e.printStackTrace();
}
}
다음과 같은 일을하고
병렬 구현은 순차와 거의 동일한 성능을 제공합니다. 데이터의 부분 집합에 통계 (319,568 기록)
No. of Threads Execution Time(minutes)
1 16
3 15
8 17
10 17
15 16
20 12
50 30
방법이 응용 프로그램의 성능을 향상시키기 위해?
스레드 수를 늘리면 자동으로 성능이 향상되지 않으며 너무 많은 스레드로 인해 오버 헤드 문제가 발생할 수 있습니다. 왜 당신은 1 - 10 Threads에 대해 동일한 성능을 가지고 있다고 말하기가 힘들겠습니까? 병목 현상은 db입니까? 로컬 DB입니까? – JohnnyAW
JVM 구성 일 수도 있습니다. 하나의 코어에만 액세스 할 수있는 격리 된 환경에서 실행되는 경우 많은 개선이 이루어지지 않을 수도 있습니다. – Gimby
예 로컬 db입니다. – omkar1707