이것은 매우 혼란 스럽습니다. 특정 작업의 경우, 한 대의 실제 시스템이 약 49 분 내에 작업을 완료합니다. 다른 실제 머신을 추가하면 두 머신이 각각 작업을 수행하므로 53 분 이상 소요됩니다! 두 기계 모두 세 번째 기계에있는 데이터베이스에서 작동합니다.
이 문제의 원인은 무엇일까요?
이 3 윈도우를 포함 : 나는 MS SQL Server를 사용하는 Wildfly : 한 대의 컴퓨터보다 두 대의 컴퓨터에서 작업을 처리하는 데 시간이 더 걸리는 이유는 무엇입니까?
Wildfly 10 인스턴스가 각 시스템에서 실행됩니다.
온라인 서버 - 컴퓨터 1 : - 사용자가 웹 인터페이스를 통해이 컴퓨터와 상호 작용합니다.
*이 컴퓨터는 SQL Server에서 데이터베이스를 호스팅합니다.
* 사용자가 특정 작업을 실행하도록 요청하면 코드는 작업을 작은 작업으로 나눕니다. 각 작업에는 ID가 할당됩니다. JMS 메시지는 각 작업에 대해 이이 시스템의 대기열로 전송됩니다. 메시지에 id라는 작업이 있습니다.
* 기본적으로 작업이 분할되어 정보가 DB에 쓰여지고 이 작업을 수행해야합니다. 그들은 어떤 순서로도 실행될 수 있습니다.
배치 서버 - 기계 2 및 배치 서버 - 기계 3 (두 개의 별도의 기계).
* 각 컴퓨터에는 Wildfly 10 인스턴스가 실행됩니다.
* 각 서버는 온라인 서버 (시스템 1)에 정의 된 원격 대기열 의 메시지를 사용하도록 구성됩니다.
* 원격 커넥터를 사용하는 풀링 된 연결 팩토리를 사용하여 MDB를 통해 연결합니다.
* 두 시스템의 MDB는 maxSessions = 10 (8 개 시도)으로 구성됩니다.
* onMessage 메서드에서 메시지를 받으면 코드는 메시지에서 작업 ID를 얻은 다음 온라인 서버 (컴퓨터 1)에있는 DB (작업 서버)에서 작업 정보를 가져와 과 관련된 작업을 수행합니다 이 작업 ID.
관찰 :
- 기계 (3)가 오프라인 상태이며 작업의 모든 작업은 (는) 작업을 완료 49 분 정도 걸립니다 기계 (2)에 의해 실행되는 경우.
- 두 대의 컴퓨터 2와 3이 관련되어 있으면 작업을 완료하는 데 53 분이 걸립니다. (중 기계의 제이보스 콘솔) 대상 데이터 소스를 보면
- alsways 쇼 :
가능한 Conenctions : 248
활성 : 3
최대 중고 : 17 - 평균 시간을 컴퓨터 2에 작업을 완료하는 데 이상 기계 2와 3이 모두 작업을 처리 할 때보다 기계 2만이 작업을 수행 할 때.
- 작업은 두 개의 배치 서버간에 매우 균등하게 분산됩니다.
온라인 서버 (데이터베이스 서버이기도 함)는 CPU 사용률이 거의 비슷하지 않습니다.
<datasource jndi-name="java:/jdbc/dbconn" jta="true" pool-name="MSSQLDS1" enabled="true" use-ccm="false" use-java-context="true" statistics-enabled="true"> <connection-url>jdbc:sqlserver://wilxs185458-ftx:1433;DatabaseName=K11.2N;selectMethod=direct</connection-url> <driver>sqlserver1</driver> <pool> <min-pool-size>100</min-pool-size> <max-pool-size>250</max-pool-size> </pool> <security> <user-name>sa</user-name> <password>password</password> </security> <statement> <track-statements>true</track-statements> <prepared-statement-cache-size>1000</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource>
제가 또한 MDB (얼마나 많은 스레드를 병렬로 작업을 처리)의 구성 maxSessions 실험과에 실행 한 다음과 같이
데이터 소스 제이보스에 구성된 하나의 배치 기계.
maxSessions 2, 4 또는 8 중 어느 것을 사용하는지에 따라 전체 작업 시간이 거의 같은 양으로 완료됩니다.
스레드가 maxSessions (예상대로)에 따라 병렬로 실행 중임을 알 수 있습니다. 완료되면 즉시 각 메시지가 onMessage 처리 시간을 기록하고 다른 메시지가 할당됩니다. 완료).
작업 처리를 완료하는 데 걸리는 평균 시간 (onMessage 메서드를 처리하는 데 걸리는 시간)은 maxSessions에 비례합니다.
도움을 주시면 감사하겠습니다.
정보 추가 2017년 11월 1일는 :
나는 YourKit 자바 프로파일 러 (성능 분석기)를 사용하고 두 번 같은 작업을 실행했습니다. 두 경우 모두 Batch Server 시스템 1 만 포함되었습니다. 처음으로 maxSessions = 8 및 두 번째 maxSessions = 4로 주석이 달린 MDB로 실행했습니다.
도이 방법은 작업을 처리하는 동안 312k 번 호출 된
메소드 java.lang.String.toLowerCase()을 살펴보면, 그러나 총 시간은 55174 밀리 초 대 3003 밀리 초 (8 개 스레드 대 4였다 스레드). 따라서 스레드 수를 두 배로 늘리면이 방법의 속도가 느려집니다!
아마도 실제 작업에 따라 다릅니다. 예를 들어 한 작업이 SQL Server가 다른 작업을 차단하는 페이지 잠금이나 테이블 잠금을 해제하도록하는 많은 데이터를 업데이트하는 경우 더 많은 컴퓨터를 추가하면 작업이 느려질 수 있습니다. –
어떻게 볼 수 있습니까? 실시간으로 잠금 상황을 표시하는 SQL Server 명령이 있습니까? – inor