Daily CheckIn

This commit is contained in:
marcodn 2024-09-11 19:34:36 +02:00
parent 058472d1b4
commit 0e8b521f17
6 changed files with 80 additions and 27 deletions

View file

@ -10,18 +10,17 @@
Um die Messungen etwas zu vereinfachen wurde ein Skript erstellt um die Aufrufe gesammelt durchzuführen. Um die Um die Messungen etwas zu vereinfachen wurde ein Skript erstellt um die Aufrufe gesammelt durchzuführen. Um die
Messungen durchzuführen werden die Befehl, wie in \ref{lst:calling_script_exec} dargestellt aufgerufen. Messungen durchzuführen werden die Befehl, wie in \ref{lst:calling_script_exec} dargestellt aufgerufen.
Durch die nummerierten Präfixe können im Nachgang über die \textit{pgBadger}"=Berichte die SQL-Abfragen verglichen Durch die nummerierten Präfixe können im Nachgang über die \textit{pgBadger}"=Berichte die \ac{SQL}"=Abfragen verglichen
werden. Wichtig hierbei ist noch, dass vor dem ersten \textit{meascall}-Aufruf überprüft wird, ob die Docker-Container werden. Wichtig hierbei ist noch, dass vor dem \textit{measrun}-Aufruf überprüft wird, ob die Docker-Container
gestartet und initialisiert sind. Wenn dies nicht der Fall ist, laufen die Abfragen ins leere. Am einfachsten ist das gestartet und initialisiert sind. Wenn dies nicht der Fall ist, laufen die Abfragen ins leere. Am einfachsten ist das,
über die Statistik von Docker zu ermitteln, ob die CPU-Auslastung auf einen niedrigen Level gefallen ist. wie dargestellt, über die Statistik von Docker zu ermitteln. Nun wird überwacht, das die CPU-Auslastung auf ein
niedriges Level fällt, danach kann das Skript für die Messung gerufen werden.
\includecode[bash]{chapters/thesis/appendix04_calling_script.sh}{lst:calling_script}{Calling Script} \includecode[bash]{chapters/thesis/appendix04_calling_script.sh}{lst:calling_script}{Calling Script}
\begin{lstlisting}[language=Bash,caption={Aufrufe des Unterstützungsscriptes},label=lst:calling_script_exec] \begin{lstlisting}[language=Bash,caption={Aufrufe des Unterstützungsscriptes},label=lst:calling_script_exec]
callscript.sh measinit callscript.sh measinit
callscript.sh -rppf=_testname measres callscript.sh -rppf=_testname measres
callscript.sh -rppf=_testname meascall callscript.sh dcstats
callscript.sh -rppf=_testname -rppn=2 meascall callscript.sh -rppf=_testname measrun
callscript.sh -rppf=_testname -rppn=3 meascall
callscript.sh -rppf=_testname -rppn=4 meascall
\end{lstlisting} \end{lstlisting}

View file

@ -12,6 +12,7 @@ script_path="/opt/docker/timing.sh"
pgbadger_out="/opt/docker/pgreport" pgbadger_out="/opt/docker/pgreport"
report_postfix="" report_postfix=""
report_postno="" report_postno=""
report_postmax="5"
docker_name=dcpgbatch docker_name=dcpgbatch
COMPOSE_FILE=/opt/docker/docker-compose.yaml COMPOSE_FILE=/opt/docker/docker-compose.yaml
@ -20,14 +21,33 @@ gflog() {
echo "follow the log: $domain_log" echo "follow the log: $domain_log"
tail -f $domain_log tail -f $domain_log
} }
gflogrm() {
echo "remove the log: $domain_log"
rm "$domain_log"
}
gfconf() { gfconf() {
nvim "$payara_config" nvim "$payara_config"
} }
gfscript() { gfscript() {
gflogcount=$(cat "$domain_log" | wc -l)
outPath=$pgbadger_out$report_postfix/bash.out outPath=$pgbadger_out$report_postfix/bash.out
touch "$outPath" touch "$outPath"
echo "" >>"$outPath"
echo "============================================================" >>"$outPath" echo "============================================================" >>"$outPath"
echo "calling number $report_postno / $report_postmax" >>"$outPath"
echo "" >>"$outPath"
bash $script_path | tee -a "$outPath" bash $script_path | tee -a "$outPath"
gflastlog=$(cat "$domain_log" | wc -l)
gfcnt=$(($gflastlog - $gflogcount))
printf "\n%-20s %+5s %+9s %+9s %+9s %+9s\n" "function" "Runs" "Min (ms)" "Avg (ms)" "Max (ms)" "1st (ms)" >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-create \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-create-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-build \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-buildr-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-loadData \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-loaddt-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-loadDataMap \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-loaddm-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-renderData \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-rdrdat-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-renderLoad \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-rdrlst-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
tail -$gfcnt $domain_log | awk '/PerformanceCounter-render \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-render-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
} }
pginit() { pginit() {
@ -68,9 +88,17 @@ pgrpres() {
rm -R $pgbadger_out$report_postfix* rm -R $pgbadger_out$report_postfix*
fi fi
} }
pgrpout() {
echo "Show bash output"
outPath=$pgbadger_out$report_postfix/bash.out
cat "$outPath"
}
dccreate() { dccreate() {
sudo docker compose -f $COMPOSE_FILE create --force-recreate sudo docker compose -f $COMPOSE_FILE create --force-recreate
} }
dcconf() {
nvim $COMPOSE_FILE
}
dcstart() { dcstart() {
sudo docker compose -f $COMPOSE_FILE start sudo docker compose -f $COMPOSE_FILE start
sleep 2 sleep 2
@ -85,11 +113,24 @@ dcres() {
dcstats() { dcstats() {
sudo docker stats sudo docker stats
} }
meascall() {
gfscript
pgrp
pglogrm
}
measrun() {
for i in $(seq 1 $report_postmax); do
report_postno=$i
meascall
done
}
for name in "$@"; do for name in "$@"; do
case $name in case $name in
-rppf=*) report_postfix="${name#*=}" ;; -rppf=*) report_postfix="${name#*=}" ;;
-rppn=*) report_postno="${name#*=}" ;; -rppn=*) report_postno="${name#*=}" ;;
-rppm=*) report_postmax="${name#*=}" ;;
gflog) gflog ;; gflog) gflog ;;
gflogrm) gflogrm ;;
gfconf) gfconf ;; gfconf) gfconf ;;
gfscript) gfscript ;; gfscript) gfscript ;;
gfrestart) pgrpinit ;; gfrestart) pgrpinit ;;
@ -101,7 +142,9 @@ for name in "$@"; do
pgrestart) pgrestart ;; pgrestart) pgrestart ;;
pgrp) pgrp ;; pgrp) pgrp ;;
pgrpres) pgrpres ;; pgrpres) pgrpres ;;
pgrpout) pgrpout ;;
dcinit) dccreate ;; dcinit) dccreate ;;
dcconf) dcconf ;;
dcstart) dcstart ;; dcstart) dcstart ;;
dcstop) dcstop ;; dcstop) dcstop ;;
dcres) dcres ;; dcres) dcres ;;
@ -110,6 +153,7 @@ for name in "$@"; do
pginit pginit
pgrpres pgrpres
pglogrm 0 pglogrm 0
gflogrm
dccreate dccreate
dcstart dcstart
;; ;;
@ -117,15 +161,13 @@ for name in "$@"; do
dcstop dcstop
pgrpres pgrpres
pglogrm 0 pglogrm 0
gflogrm
dcstart dcstart
pgrp pgrp
pglogrm pglogrm
;; ;;
meascall) meascall) meascall ;;
gfscript measrun) measrun ;;
pgrp
pglogrm
;;
help) help)
echo "CALLING: $0 <function> [ <function>]" echo "CALLING: $0 <function> [ <function>]"
echo "The overview of the functions of this script." echo "The overview of the functions of this script."
@ -136,9 +178,11 @@ for name in "$@"; do
echo "*** parameter ***" echo "*** parameter ***"
echo " -rppf=<val> Postfix name for the report-folder (used by gfscript, pgrp, pgrpres, measres, meascall)" echo " -rppf=<val> Postfix name for the report-folder (used by gfscript, pgrp, pgrpres, measres, meascall)"
echo " -rppn=<val> Postfix number for the report-folder (used by pgrp, measres, meascall)" echo " -rppn=<val> Postfix number for the report-folder (used by pgrp, measres, meascall)"
echo " -rppm=<val> Count of calling meascall (used by measrun)"
echo "" echo ""
echo "*** glassfish ***" echo "*** glassfish ***"
echo " gflog Show and follow the log of the glassfish server with $domain_name" echo " gflog Show and follow the log of the glassfish server with $domain_name"
echo " gflogrm Remove the log file of the glassfish server with $domain_name"
echo " gfconf Open the configuration file from glassfish server" echo " gfconf Open the configuration file from glassfish server"
echo " gfscript Calls the testscript for the website" echo " gfscript Calls the testscript for the website"
echo "" echo ""
@ -150,19 +194,22 @@ for name in "$@"; do
echo " pgconf Open the configuration file from postgresql" echo " pgconf Open the configuration file from postgresql"
echo " pgrestart Restart the postgresql" echo " pgrestart Restart the postgresql"
echo " pgrp Generate the pgbadger report from postgresql log files" echo " pgrp Generate the pgbadger report from postgresql log files"
echo " pgrpout Show the saved output of the bash scripts"
echo " pgrpres Resetet the output of pgbadger" echo " pgrpres Resetet the output of pgbadger"
echo "" echo ""
echo "*** docker ***" echo "*** docker ***"
echo " dcinit Docker erstellen" echo " dcinit Create the both docker container"
echo " dcstart Docker Container starten" echo " dcconf Open the configuration file for the docker container"
echo " dcstop Docker Container stoppen" echo " dcstart Start the both docker container"
echo " dcres Docker Container stoppen und loeschen" echo " dcstop Stop the both docker container stoppen"
echo " dcstats Docker live Statistik anzeigen" echo " dcres Stop and remote the both docker container"
echo " dcstats Show the docker live statistik"
echo "" echo ""
echo "*** combine cmds ***" echo "*** combine cmds ***"
echo " measinit Initialize everthing after start" echo " measinit Initialize everthing after start"
echo " measres reset data for new measuring" echo " measres reset data for new measuring"
echo " meascall execute one measure" echo " meascall execute one measure"
echo " measrun execute <rppm> calls of measure (default: 5 runs)"
;; ;;
*) *)
echo >&2 "Invalid option $name" echo >&2 "Invalid option $name"

View file

@ -65,9 +65,9 @@ weitere Relationen notwendig sind.
\includecode[SQL]{chapters/thesis/chapter03_documentlist.sql}{lst:documentlist}{Generische Abfrage der Dokumentenliste} \includecode[SQL]{chapters/thesis/chapter03_documentlist.sql}{lst:documentlist}{Generische Abfrage der Dokumentenliste}
\includecode[SQL]{chapters/thesis/chapter03_documentlist_sub.sql}{lst:documentlist_sub}{Sub-Abfrage pro Dokument} \includecode[SQL]{chapters/thesis/chapter03_documentlist_sub.sql}{lst:documentlist_sub}{Sub-Abfrage pro Dokument}
Nach aktuellem Stand beinhaltet die Datenbank circa 5400 Briefe, für die jeweils 2-7 eingescannte Faksimile gespeichert Nach aktuellem Stand beinhaltet die Datenbank circa 5400 Briefe, für die jeweils zwei bis sieben eingescannte Faksimile
werden. Diese Graphik-Dateien werden im TIFF-Format abgespeichert und benötigen zwischen 1 und 80 MB Speicherplatz. gespeichert werden. Diese Graphik-Dateien werden im TIFF-Format abgespeichert und benötigen zwischen 1 und 80 MB
Dadurch kommt die Datenbank aktuell auf circa 3,8 GB. Speicherplatz. Dadurch kommt die Datenbank aktuell auf circa 3,8 GB.
Wie im Kapitel \ref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die Wie im Kapitel \ref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die
PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher gehen wir nun weiter nach oben in den Schichten PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher gehen wir nun weiter nach oben in den Schichten

View file

@ -260,6 +260,8 @@ abfragt.
\section{Caching im \ac{JPA}} \section{Caching im \ac{JPA}}
\label{sec:performance-investigation-application:caching-jpa} \label{sec:performance-investigation-application:caching-jpa}
%hier ein test vom acf: \acf{JPA}. aber ich seh ihn nicht
\mytodos{muss noch umgebaut werden, falsche Konfiguration erwischt} \mytodos{muss noch umgebaut werden, falsche Konfiguration erwischt}
%Die Cache-Einstellungen von \ac{JPA} werden über mehrere Einstellungen konfiguriert. Anhand von %Die Cache-Einstellungen von \ac{JPA} werden über mehrere Einstellungen konfiguriert. Anhand von
@ -650,11 +652,6 @@ Nach dem Anpassungen haben sich dann die Werte aus \ref{tbl:measure-materialized
\mytodos{prüfen ob ms oder msec die richtige SI-Einheit ist} \mytodos{prüfen ob ms oder msec die richtige SI-Einheit ist}
Bei der Verwendung des Hints \textit{openjpa.FetchPlan.FetchBatchSize} kann die Abfrage enorm verschlechtern. Wenn
dieser Wert zu klein oder groß definiert ist, wird die Laufzeit verschlechtert. Bei einem zu großen Wert wird die
Laufzeit der Datenbankanfrage auf circa 20 ms verlängert. Wenn der Wert zu gering gewählt ist, dann wird zwar die
Laufzeit der Datenbankanfrage minimal verkürzt, aber die \textit{map}"=Funktion wird dadurch verlängert.
Da bei der Materialized View das laden der Daten und das wandeln in die Java"=Objekte getrennt programmiert wurde, Da bei der Materialized View das laden der Daten und das wandeln in die Java"=Objekte getrennt programmiert wurde,
können hier eigene Zeitmessungen für die zwei Schritte eingebaut werden. Hierfür wird die Zeit vor dem können hier eigene Zeitmessungen für die zwei Schritte eingebaut werden. Hierfür wird die Zeit vor dem
\textit{map}"=Aufruf und der \textit{map}"=Aufruf gemessen. Für den ersten Aufruf, wurde ein \textit{SearchDocument} \textit{map}"=Aufruf und der \textit{map}"=Aufruf gemessen. Für den ersten Aufruf, wurde ein \textit{SearchDocument}
@ -665,6 +662,16 @@ erzeugt, noch ohne eine Konvertierung der ermittelten Daten in das Objekt, steig
Wenn man nun noch die Konvertierung der Daten wieder einbaut, steigt die Laufzeit nochmal auf nun 82 ms. Wenn man nun noch die Konvertierung der Daten wieder einbaut, steigt die Laufzeit nochmal auf nun 82 ms.
Dies zeigt, alleine das erzeugen der Objekt kostet die meiste Zeit. Dies zeigt, alleine das erzeugen der Objekt kostet die meiste Zeit.
Bei der Verwendung des Hints \textit{openjpa.FetchPlan.FetchBatchSize} kann die Abfrage enorm verschlechtern. Wenn
dieser Wert zu klein oder groß definiert ist, wird die Laufzeit verschlechtert. Bei einem zu großen Wert wird die
Laufzeit der Datenbankanfrage auf circa 20 ms verlängert. Wenn der Wert zu gering gewählt ist, dann wird zwar die
Laufzeit der Datenbankanfrage minimal verkürzt, aber die \textit{map}"=Funktion wird dadurch verlängert.
Das aktivieren der Cache-Optionen wie in \ref{sec:performance-investigation-application:caching-openjpa} oder in
\ref{sec:performance-investigation-application:caching-query} dargestellt, haben keine Auswirkung auf die Performance.
Dies ist dadurch erklärbar, da keine Objekte durch das OpenJPA"=Framework erstellt werden, sondern erst in der
\textit{map}"=Funktion des eigenen Codes.
Nun wird noch geprüft, welche Performance das parsen der Json-Informationen im Server benötigt. Im ersten Schritt wird Nun wird noch geprüft, welche Performance das parsen der Json-Informationen im Server benötigt. Im ersten Schritt wird
die Parse-Funktion auskommentiert und die Seite nochmal aufgerufen. Durch diese Umstellung fällt die Laufzeit der die Parse-Funktion auskommentiert und die Seite nochmal aufgerufen. Durch diese Umstellung fällt die Laufzeit der
Datenermittlung auf circa 4 ms ab. Nun muss noch geprüft werden, welche Zeit nun der Client zum parsen der Datenermittlung auf circa 4 ms ab. Nun muss noch geprüft werden, welche Zeit nun der Client zum parsen der

View file

@ -12,7 +12,7 @@
\chapter*{Abk\"{u}rzungsverzeichnis} \chapter*{Abk\"{u}rzungsverzeichnis}
% Insert your acronyms here (Das Kürzel mit der längsten Bezeichnung sollte in den eckigen Klammern eingetragen werden) % Insert your acronyms here (Das Kürzel mit der längsten Bezeichnung sollte in den eckigen Klammern eingetragen werden)
\begin{acronym}[API] \begin{acronym}[HTML]
\acro{EJB}{Enterprise Java Beans} \acro{EJB}{Enterprise Java Beans}
\acro{JSF}{Java Server Faces} \acro{JSF}{Java Server Faces}
\acro{ORM}{Object Relational Mapping} \acro{ORM}{Object Relational Mapping}

Binary file not shown.