2017-10-31 2 views
1

이것은 매우 혼란 스럽습니다. 특정 작업의 경우, 한 대의 실제 시스템이 약 49 분 내에 작업을 완료합니다. 다른 실제 머신을 추가하면 두 머신이 각각 작업을 수행하므로 53 분 이상 소요됩니다! 두 기계 모두 세 번째 기계에있는 데이터베이스에서 작동합니다.
이 문제의 원인은 무엇일까요?
이 3 윈도우를 포함 :
나는 MS SQL Server를 사용하는 Wildfly : 한 대의 컴퓨터보다 두 대의 컴퓨터에서 작업을 처리하는 데 시간이 더 걸리는 이유는 무엇입니까?

이 좀 더 세부 설정을 설명하자 ... 하나의 기계가 (그래서 약 25 분) 소요 시간의 절반 가까이에서 작업을 완료하기 위해이 기계를 기대했을 것이다 7 대의 컴퓨터 (3 대의 물리적 컴퓨터). 각각 8 개의 코어가 있습니다.
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였다 스레드). 따라서 스레드 수를 두 배로 늘리면이 방법의 속도가 느려집니다!

  • +1

    아마도 실제 작업에 따라 다릅니다. 예를 들어 한 작업이 SQL Server가 다른 작업을 차단하는 페이지 잠금이나 테이블 잠금을 해제하도록하는 많은 데이터를 업데이트하는 경우 더 많은 컴퓨터를 추가하면 작업이 느려질 수 있습니다. –

    +0

    어떻게 볼 수 있습니까? 실시간으로 잠금 상황을 표시하는 SQL Server 명령이 있습니까? – inor

    답변

    0

    그것은 네트워크와 관련된 문제로 밝혀졌습니다. 데이터베이스를 호스팅하고 있던 세 번째 머신은 벽면 콘센트에 연결되어 더 나쁜 네트워크 나 그와 같은 장소에 설치했을 것입니다. 일단 전선을 다른 콘센트로 바꿨을 때 잘 작동했습니다. (기술 용어에 대해 확실하지 않음). 중요한 것은 데이터베이스를 실행 한 시스템이 네트워크 대역폭이 좋지 않다는 것을 발견했습니다. 두 개의 Wildfly 호스팅 시스템 중 하나에서 원격 데스크톱을 사용하는 데이터베이스 호스팅 시스템에 연결하고 큰 파일을 데이터베이스 시스템에서 wildfly 시스템으로 전송하고 자원 모니터에서 네트워크 성능을 감시했습니다. 나는 최대 약 10Mbs를 관찰했다. 그것은 붉은 깃발이었다. 데이터베이스 시스템의 물리적 인 연결을 수정 한 후,이 파일 전송은 약 100Mbs에서 수행 중이었습니다 ... 그리고 위의 문제도 해결되었습니다

    관련 문제