windows - Wildfly bruger MS SQL Server: Hvorfor tager det to maskiner mere tid til at behandle et job end en maskine?

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er meget forbløffende. For et givet job afslutter en fysisk maskine jobbet om cirka 49 minutter. Hvis jeg tilføjer en anden fysisk maskine, så nu begge maskiner hver gør dele af jobbet, tager det endnu længere - 53 minutter!
Begge maskiner arbejder på en database, der er på en tredje maskine.

Hvad kunne der være for dette? Jeg ville have forventet de 2 maskiner til at afslutte jobbet på næsten halvdelen af ​​den tid, en enkelt maskine tager (så ca. 25 minutter) ...


Lad mig beskrive opsætningen i flere detaljer:

Dette indebærer 3 Windows 7-maskiner (3 separate fysiske computere). Hver har 8 kerner.

En Wildfly 10-forekomst kører på hver maskine.


Online server - Maskine 1: - brugeren interagerer med denne maskine via en webgrænseflade.

   * Denne maskine er også vært for databasen på en SQL Server.

   * Når brugeren foretager en anmodning om at køre et bestemt job, bryder koden op
   arbejde i mindre opgaver. Hver opgave er tildelt et id. En JMS-besked er da
   sendt til en kø på denne maskine for hver opgave. Meddelelsen indeholder opgaven
   id.

   * Så grundlæggende er jobbet opdelt, information er skrevet til DB, og
   nu skal noget udføre disse opgaver. De kan udføres i enhver rækkefølge.


Batch Server - Maskine 2 og Batch Server - Maskine 3 (to separate maskiner).

   * Hver af disse maskiner har sin egen Wildfly 10-forekomst, der kører på den.

   * Hver er konfigureret til at forbruge meddelelser fra fjernkøen
   defineret i Online sever (maskine 1).

   * Det gøres via MDB ved hjælp af en pooled-connection-fabrik ved hjælp af en fjernstik.

   * MDB'en i begge maskiner er konfigureret med maxSessions=10 (også forsøgt 8).

   * Når du modtager en besked i onMessage-metoden, får koden den
    opgave id fra beskeden, den får derefter opgaveoplysningerne fra DB (som er på online serveren (maskine 1))
    og udfører arbejdet i forbindelse med denne opgave id.


Observationer:



  • Hvis maskine 3 er offline, og alle jobets opgaver udføres af maskine 2, tager det 49 minutter at fuldføre jobbet.

  • Hvis begge maskiner 2 og 3 er involverede, tager det 53 minutter at fuldføre jobbet.

  • Se på målet DataSource (i wildfly-konsollen på en af ​​maskinerne), somways viser:

    Tilgængelige sammenhænge: 248

    Aktiv: 3

    Maks brugt: 17

  • Gennemsnitlig tid til at fuldføre en opgave på maskine 2 er længere, når begge maskiner 2 og 3 behandler jobbet, end når kun maskine 2 gør det.

  • Opgaverne fordeles meget godt - omtrent lige mellem de to batch-servere.

  • Online-serveren (som også er databaseserveren) er ikke engang tæt på fuld CPU-udnyttelse.

  • Datakilden er konfigureret i Wildfly som følger:


             <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>
    



Jeg har også eksperimenteret med konfigurationen maxSessions i MDB (hvor mange tråde behandler opgaverne parallelt) og kører på kun en batchmaskine.

Jeg observerede, at om jeg bruger maxSessions 2, 4 eller 8, er det samlede arbejde afsluttet på omtrent samme tid.

Jeg kan også se fra logfilerne, at trådene kører parallelt i henhold til maxSessions (som det var forventet), og når man afslutter det, får man straks en anden meddelelse (da hver tråd logger den tid, den begynder at behandle onMessage og den tid, den fuldender ).

Den gennemsnitlige tid det tager at afslutte behandlingen af ​​en opgave (den tid det tager at behandle en onMessage-metode) er proportional med maxSessions.


Enhver hjælp ville blive meget værdsat.


Oplysninger tilføjet den 11/1/2017:

Jeg brugte YourKit Java Profiler (Performance Analyzer) og kørte det samme job to gange. I begge tilfælde var kun Batch Server maskine 1 involveret. Første gang jeg kørte det med MDB noteret med maxSessions=8 og anden gang maxSessions=4.


Ser selv på metoden java.lang.String.toLowerCase ()

Denne metode blev kaldt 312k gange under forarbejdning af jobbet, men den samlede tid var 55174 millisekunder mod 3003 millisekunder (8 tråde versus 4 tråde). Så fordobling af antallet af tråde har bremset denne metode med en størrelsesorden!

Bedste reference


Det viste sig, at problemet var relateret til netværket. Den tredje maskine, der netop var vært for databasen, var forbundet til en stikkontakt, som måske placerede den på et værre netværk eller sådan noget. Når jeg skiftede sin ledning til en anden stikkontakt, virkede det godt. (ikke sikker på de tekniske vilkår). Den vigtigste ting er, at den maskine, som jeg kørte databasen på, havde dårlig netværk båndbredde. Måden jeg opdagede, er dette: Jeg har forbindelse fra en af ​​de to Wildfly-hosting-maskiner til den database-hosting-maskine ved hjælp af fjernbetjening og kopieret en stor fil fra database maskine til wildfly maskine og overvågede netværks ydeevne i ressource monitoren. Jeg observerede maksimalt ca. 10 MB. det var det røde flag. Efter korrektion af databasens fysiske forbindelse udførte denne filoverførsel på omkring 100 MB ... og det løste også problemet ovenfor