Esiste un modo per determinare il consumo di memoria di un singolo lavoro su iSeries?
-
22-07-2019 - |
Domanda
Abbiamo una combinazione di app .Net che si connettono tramite ODBC e DB2 Connect a una iSeries LPAR che è in V5R4. Abbiamo anche alcuni lavori batch eseguiti nativamente sulla macchina (principalmente COBOL, RPG e CL diritto). Durante alcuni periodi della giornata, si verificano errori di pagina elevata e stiamo cercando di determinare quali app potrebbero causare il problema.
Senza acquistare una delle dozzine di strumenti costosi sul mercato (cioè iDoctor), esiste un modo per vedere la quantità di memoria consumata da ciascun lavoro. La maggior parte dei nostri lavori sta esaurendo il pool 2 e notiamo prestazioni migliori quando aggiungiamo memoria a quel pool e semplicemente osservando wrksyssts non aiuta molto. Vorremmo isolare i lavori problematici e vedere se è possibile apportare alcune modifiche per migliorare le prestazioni e ridurre l'utilizzo della memoria non necessario.
Soluzione
Se non ti dispiace Java o jvm o stai facendo un po 'di codice ...
Ottieni quanto segue (tutti disponibili per Windows, Linux, AIX, Solaris, ecc ... Mac?):
- Groovy per odio un po 'di Java wordiness
- JTOpen che è la versione open source di IBM di IBM Toolbox per Java fornito con System i Access e che avresti dovuto ricevere con il tuo server
Tieni presente che JTOpen è semplicemente una vecchia libreria Java in modo da poter utilizzare qualsiasi linguaggio jvm che può accedere alle normali librerie Java. Sto usando Groovy perché ci sto provando qualcosa. Non preoccuparti, Groovy è simpatico.
Ecco qui.
import com.ibm.as400.access.*
// how many seconds to run
secs = 20
sys = new AS400("theserver", "paulg", "dotnet4evah")
job = new Job(sys, "jobname", "jobusername", "jobnumber")
job.load()
println "Stats for ${job.toString()}"
// this might look horrible
println "total CPU time\tpage faults/sec\tdisk IO ops/sec"
while (secs--) {
job.loadStatistics()
print "${job.getCPUUsed()/1000}\t\t"
print "${job.getValue(Job.ELAPSED_PAGE_FAULTS)}\t\t"
println "${job.getValue(Job.ELAPSED_DISK_IO)}"
job.resetStatistics()
Thread.sleep(1000)
}
sys.disconnectAllServices()
Questo è tutto. Ci sono molti altri valori di lavoro in gioca con . Non ho mai dovuto preoccuparmi di queste statistiche di lavoro, quindi non so se ripristinare le statistiche sia la cosa giusta.
È difficile conoscere effettivamente il numero del lavoro e altri dettagli sul lavoro per creare l'oggetto Lavoro. Ecco perché JobList è così bello. Puoi anche esegui comandi CL dal tuo script se ciò è utile.
Penso che IBM usi questa libreria per creare Ops Navigator, quindi forse lo stai già usando da un po '.
Altri suggerimenti
Questo sembra aiutare un po ':
- In iSeries Navigator, espandi Collegamenti personali > connessione > Gestione del lavoro > Pool di memoria > Pool attivi o Pool condivisi. - Fare clic con il pulsante destro del mouse sul pool di memoria che si desidera utilizzare e fare clic su Lavori. - Personalizza la vista per includere la colonna Errori di pagina
Almeno posso vedere quali lavori presentano problemi di errore. La prossima volta che si presenta il problema, vedremo se aiuta a trovare le app offensive.