Posts mit dem Label Optimization werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Optimization werden angezeigt. Alle Posts anzeigen

Service Failure Alert Email in "QlikView April 2020"

Kein SCOM oder Nagios um den Status der QlikView Services zu überwachen? In QlikView 12.50 gibt es eine Alternative.

Bisher zeigte die QlikView Management Console den aktuellen Service-Status der anderen QlikView Services am Reiter "Service Status Overview" an. Mit QlikView 12.50 kann man sich diese Information aktiv als Email schicken lassen. 

ServiceFailureAlert Email QlikView April 2020
Erkennt das Management Service ein "disconnected" Qlik Service, schickt es ein Email.


Die Doku dazu ist noch ausständig, aber folgende Informationen haben wir vom Qlik Support erhalten und lokal bei uns getestet:


Um diese Einstellung zu aktivieren, müssen Sie das QlikView Management Service stoppen. Unter C:\Program Files\QlikView\Management Service die QVManagementService.exe.config die folgenden XML-Tags ergänzen:

<add key="ServiceFailureAlertEmailAddresses" value="qlikviewadmins@heldendaten.net"/>
<add key="ServiceFailureAlertEmailSubject" value="PROD QlikView Server: [SERVICE-NAME] on URL [SERVICE-URL] is down."/>
<add key="ServiceFailureAlertEmailBody" value="PROD QlikView Server: [SERVICE-NAME] on [SERVICE-URL] is down. Go to http://yourserver:4780/QMC/ServiceStatusOverview.htm for details!"/>

Die Tags [SERVICE-NAME] und [SERVICE-URL] sind Platzhalter, und werden dynamisch für das betroffene QlikView Service in das Email eingesetzt.

Das QlikView Management Service nutzt den Mailserver, den Sie in der QMC unter "System/Mail Server" konfiguriert haben. Unter Umständen müssen Sie in der QVManagementService.exe.config auch noch das bestehende Setting von false auf true umstellen:
<add key="UseSSLForSMTP" value="true"/>
QlikView 12.50 Service Failure Alert Config
Zeile 5-7 ergänzen. UseSSLForSMTP müsste schon in der .config zu finden sein.

Wenn Sie nun das QlikView Management Service starten, ist die Überwachung aktiv. Wenn man zum Test den QVS, QVWS, DSC, QDS oder Service Dispatcher Service über services.msc stoppt, sollten Sie folgende Service Failure Email bekommen.


QlikView 12.50 Service Failure Alert
Service Failure Email: Der QlikView Webserver (QVWS) ist down

Leider bekommt man keine Email wenn das Service wieder "up" geht. Und natürlich bekommt man keine Fehlermeldung wenn das QlikView Management Service selbst betroffen ist.  Deswegen ist eine Überwachung via SCOM, Nagios, SNMP, etc. noch immer zu bevorzugen bzw. zusätzlich zu aktivieren.

Den QlikView Server  (und indirekt den QVWS) kann man auch weiterhin regelmäßig über einen http-Request auf  diese URL prüfen: http://yourserver/Qvajaxzfc/QvsStatus.aspx. Der Status Up ist gut. Alles andere deutet darauf hin, dass der Server für die Endanwender nicht erreichbar ist (keine Lizenz, Service Down).

QvsStatus.aspx QlikView
QvsStatus.aspx vom QVWS sagt "Up" wenn QVS gut läuft

Häufigster Problem mit inresponsive Qlik-Services - gerade bei Single Machine Installationen - ist meist, dass die Datenmenge von QlikView Server (QVS) und Publisher (QDS) gemeinsam den Server ins "Paging" bringen. Es wird mehr Arbeitsspeicher allokiert als auf der Maschine verfügbar.

Der QlikView Server meldet RAM-Ressourcenknappheit für sich selbst (also nur die QVS.exe) in seinem Event-Log unter Severity "Warning" als "WorkingSet" Meldungen. QVS.exe versucht zwar den internen Result-Caches zu leeren, wenn aber weiter neue Applikationen von Endanwendern angefordert werden, geht der Memoryverbrauch sowohl über das definierte WorkingSet Limit Low (default 70) als auch WorkingSet Limit High (default 90).

QlikView Working Set Warnings
QVS hat zuerst nur 1.8 GB WorkingSet Low. Aber auch 24 GB sind zu wenig RAM für seine .qvws.

Eine Aussage wieviel Arbeitsspeicher der Publisher mit seinen Task-Executions (qvb.exe) gerne hätte, kann man mit dem QVS Log nicht treffen. Wenn Sie Ressourcen-Knappheit im Nachgang analysieren, und den Memory-Verbrauch des Publisher mit einbezieht möchten, dann ist es besser auf das Event 2004 im Windows System Event Log zu sehen.

Hier listet Microsoft bei "Resource-Exhaustion" die Prozesse mit dem höchsten Memory-Consumption in Bytes. Das ist für gewöhnlich der QVS.exe, oder bei großen Reload-Tasks, die entsprechende qvb.exe des Publishers. 

Das Schöne ist, dass man die ProcessID des Events 2004 auch in den TaskLog.txt unter C:\ProgramData\QlikTech\DistributionService\1\Log findet kann. Damit lässt sich das Problemskript des Publishers leicht identifizieren.

QlikView Event 2004 QVB.exe Finden
Die ProcessID 7332 ist der Task "RT_Wawi_DatenmodellVertrieb" und belegt knapp 60GB RAM


Unter Qlik Sense gibt es keine qvb.exe mehr, sondern die Engine.exe übernimmt Endanwender-Anfragen als auch die Reload-Tasks. Entsprechend ist dort die Unterscheidung woher der Ressourcenbedarf kommt schwieriger. Das spricht dafür, dass man auch in Qlik Sense einen eigenen "Scheduling" Server aufsetzt, der die Beladungen übernimmt.

Qlik Sense Event 2004
Engine.exe in Qlik Sense ist QVS.exe und QVB.exe in einem gemeinsamen Prozess. 



 


Qlik Server Eastereggs Sammlung

Die Qlik Knowledge Base zieht gerade um. Ich mochte die alte Qlik Knowledge Base eigentlich immer ganz gerne, wenn man eine konkrete Problemstellung/Logentry hatte. Die Suche hat stets sehr gut funktioniert. In der neuen Knowledge Base darf man zu den Artikeln Kommentare verfassen, um so direkt mit dem Qlik Support Mitarbeitern diskutieren und direktes Feedback geben zu können.


Die neue Qlik Support Section auf der Qlik Community
Die neue Qlik Support Section auf der Qlik Community


Wofür die Knowledge Base meiner Meinung nach nicht sehr gut funktioniert: sich einen Überblick über mögliche Einstellungen zu verschaffen. Man muss also zuerst auf ein Problem gestoßen sein, bevor man in der Knowledge Base etwas dazu finden kann. 

Sowohl in der alten als auch in der neuen Knowledge Base ist mir kein Eintrag bekannt, der alle Easter Egg Settings für den QlikView Server bzw. die Qlik Sense Engine auflistet. Über die letzten Jahre haben wir hier einige Einträge gesammelt und - wenn vorhanden - den jeweiligen Knowledge Base Artikel verlinkt. 

Die Liste ist ziemlich sicher nicht vollständig, aber über folgende Easteregg - die man in der Settings.ini manuell eintragen muss - sind wir bisher "gestolpert".


User Selektion im AJAX Client Excel Export

SelectionStampInBIFFExport=1

https://support.qlik.com/articles/000002517


QlikView 12.20 Fibre Loop Event Log entries

DisableCacheQueue=1

https://support.qlik.com/articles/000059269

 

AAALR Message in QlikView Server EventLog

DisableNewRowApplicator=0

https://support.qlik.com/articles/000019323

 

Lizenzinformationen von QVS auch als XML Datei

PgoAsXmlAlso=1

https://support.qlik.com/articles/000052992

 

Altes QlikView Set Analysis Verhalten (vor QlikView 12.20)

EnableSingleQuoteExactSearch=0

https://support.qlik.com/articles/000063567

 

QlikView Server Cache leeren

ClearCacheTimesPerDay=1
http://blog.heldendaten.net/2017/05/qlikview-server-das-gerucht-vom.html

 


QlikView 12.50 und Qlik Sense Sept 2019 Overload Protection

Dieses Setting ist so geheim, das hat nicht einmal einen Knowledge Base Artikel. Folgende Infos von R&D:

The new timeout setting is called OverloadExpireTimeSeconds.

 

It triggers before the working set parameter low (Min memory usage setting) is reached and it works "retroactively", so that a document that hasn't been used for that period of time is removed from memory the instant an overload situation is detected. The purpose is to preserve the QIX Engine's ability to cache results.

 

Please note: a worst-case scenario what happens with this setting on a server that is fundamentally overloaded, is that a document that is really needed could theoretically be unloaded over and over again, creating even greater load on the server.


In Qlik Sense we can't set the timeout per document. In Qlikview there is a document property that can specify the document's timout. By default this is not set, but it can be changed.

If this document timeout is set in the document, it still applies--overload or not. Which makes sense really, as it's an admin decision to set this timeout, with the purpose of controlling document life-time.

 

Bookmarks / Mail Bookmark as Link – wann verschwindet das Lesezeichen

ServerTempBookmarkDayTimeout=N

https://support.qlik.com/articles/000002746

 

Qlikview 12.30 SKIA Rendering back to GDI+

GraphicsBackEnd=0

https://support.qlik.com/articles/000063181

 

QlikView Server Debug Logging

Verbosity=900
SystemLogVerbosity=5

 https://support.qlik.com/articles/000003953

 

AJAX Container Box Darstellung – Labels abgeschnitten

NavigationAreaSizedOnlyByLabels=1
https://support.qlik.com/articles/000059276

 

Excel Export Settings

https://support.qlik.com/articles/000040322

 

Option Name

Meaning

Default Value

SELOG_Export

if print out log message related to Export function.

0: disable

1: enable

1

SendToExcelLegacyFormat

default "Send To Excel" behavior.

1: Legacy mode, export to xls

0: new mode, export to xlsx

0

QvExportTimeLimitSec

Time limit for exporting object to Xlsx. Integer number in seconds.

Use -1 if you don't want time limit;

Server: 180

Desktop: -1

QvExportMemoryLimitMB

Memory limit for exporting object to Xlsx. Integer number in MB.

Use if you don't want memory limit;

0

 

ExcelExportMixedAsText = 1
https://support.qlik.com/articles/000004098

 

Files/Pics aus dem Internet (zB Google Maps) werden nicht geladen

https://support.qlik.com/articles/000036107

 

WebFileUseWinAPI = 1 für Server und QVB.exe in Settings.ini ergänzen

AllowGeneralAccessToImagesThroughURL =1

https://support.qlik.com/articles/000023882

WebFileConnectorProxyServer=http://proxy server address
WebFileConnectorProxyPort=proxy server port

 

AJAX Hide Print und Export für neue Tables

PrintAndXLIconsForNewTables=0

https://support.qlik.com/articles/000003846

 

No/some mapping between account names and security IDs was done

 TranslateNameDisabled=1

https://support.qlik.com/articles/000002530

 

 

Session Recovery Bookmark ohne Layout

EnableApplyLayoutState=0

QlikView 11.20 SR13 introduces a server side setting that allows disabling layout state information from the session recovery bookmark. With the layout state disabled, only selections are saved in the session recovery bookmark. This means that a session will not recover to the sheet where the session was close, but instead to the application's default sheet. A bookmark without layout state information is smaller and will not require as much CPU time to be processed.

 

https://support.qlik.com/articles/000102075

https://support.qlik.com/articles/000036135

https://support.qlik.com/articles/000007868

 

Thumbnail am Accesspoint schneller aktualisieren

QvThumbnailCacheUpdateInterval=2

https://support.qlik.com/articles/000038326

ChartLegendCutoff=5000

QvMetaInterval=5

If QvMetaInterval is set to 0, preloads are performed every time the folders are scanned. QvMetaSecondsToWaitBetweenScans

Bevor in der Current Selection Box "9 von 123" Werten steht kann man hier den Wert erhöhen

MaxCurSelEntries=100

 

QixPerformanceLogVerbosity=3

 

Enter desired values for the four measurement levels

WarningProcessTimeMs=30000
ErrorProcessTimeMs=60000
WarningPeakMemory= 1073741824
ErrorPeakMemory= 2147483648

MaxRecurLevelForDefaultMissingAggr=nnn

ServerTempSecTimeout=15

RemoveExcelAfterDownload=1

MaxActionLevel=N

Aus den QlikView 12.20 SR1 Release Notes

For AJAX clients, it is now possible to change the default value for who is allowed to see a note connected to an object.

 

To change the sharing settings, you must modify the following entry in the settings.ini file:

NoteSharingDefaultAccess=0 Only the creator can see the note.

NoteSharingDefaultAccess=1 The note visibility is set to public and anyone can see the object (Default setting).

NoteSharingDefaultAccess=2 Visibility is restricted to specific user

SilentErrorInChart=1

 

 

PS: für den QlikView Publisher haben wir eine ähnliche Liste. Diese kann ich auch bei Gelegenheit gerne posten.

"Qlik on Steroids" für Admins - QIX & Audit Log

Mit dem November 2018 Release hat auch QlikView den QIX-Log bekommen. Bisher war das Verhalten der Qlik Engine eine ziemliche Blackbox. Warum und wodurch wieviel RAM benutzt wird, war sehr schwer zu sehen. Mit dem neuen QIX-Log plus einem aktiven Audit Log können Qlik-Administratoren jetzt tief eintauchen und genau sehen was auf ihren Servern so vor sich geht!

Jedes Objekt und Dokument das bestimmte CPU- oder Memory-Grenzen übersteigt wird im QIX Log protokolliert. Auf Basis dieser Daten kann ein Dashboard gebaut werden, welches die teuren Dashboards & Objekte der gesamten Umgebung aufzeigt, und durch welche Userinteraktionen viel Leistung verbraucht wird.

Heldendaten Analyse QIX und Audit Log
Analyse Applikation zum QIX Log

Der QIX Log wird über die settings.ini des QlikView Servers aktiviert. Eine genaue Beschreibung der Felder und Einstellungsmöglichkeiten finden sich in der QIX Perfomance Log Hilfe

In unserem Beispiel haben wir sehr niedrige Grenzen gewählt. Ein QIX Logeintrag entsteht, wenn:

- Warning wenn Object Process Time > 2 Sekunden
- Error wenn Object Process Time > 4 Sekunden
- Warning Peak Memory wenn mehr als ~500 MB
- Error Peak Memory wenn mehr als ~1GB

Diese Parameter müssen Sie entsprechend Ihrer Umgebung anpassen. Bei 2 Sekunden bekommen Sie wahrscheinlich zu viele Warnings.

QlikView Server settings


Im Beispiel sehen wir, dass das Chart CH454 bis zu 763MB für die Berechnung benötigt.

Heldendaten QIX Analyse
Problemobjekte pro Qlik Anwendung


Das allein ist eine interessante Information, die ohne QIX Log am Server bisher nicht ersichtlich war. Noch spannender wird es, wenn man in der QMC den AuditLog aufgedreht hat. Audit Log und QÍX Log lassen sich nämlich über das gemeinsame Feld "SessionId" verschneiden.


Qlik Audit Log
Audit Log in der QMC


Somit sieht man welcher User in welcher Session mit welchen Selektionen das "teure" Chart verursacht hat. Im "QIX Warnings und Errors" Diagramm am Screenshot unterhalb sieht man, dass der User in der Session das Objekt dreimal aufgerufen hat, und es jedes Mal zu einem QIX-Error geführt hat.


Wählt man nun die betroffene SessionId, kann man sich den genauen Verlauf des Problems ansehen.
In unserem Fall sind die Einträge des QIX-Log rot, die Einträge des AuditLog blau.

Man sieht, dass der User  im Feld "Segment_Long_Name_Filter" "Austria" gewählt hat. Darauf hin rechnet das CH454 für 19 Sekunden und verbraucht 464MB RAM. Danach wählt der User im Feld "Month_Filter" den Wert "Jun", das Chart rechnet 34 Sekunden und verbraucht 763MB RAM.

QIX Audit Log Zeitverlauf einer Session
QIX und Audit Log im Zeitverlauf verschnitten

Im rechten Balkendiagramm sieht man auch, dass am Anfang der Session sehr viele Selektionen getroffen werden (Blaue Balken des Audit Logs). Dies sind wahrscheinlich viele initiale Selektionen die in der QlikView App definiert sind. Danach kommen viele QIX-Alarme (rote Balken). In der Applikation dürfte es also mehrere Objekte auf einem Dashboard geben, die viel Rechenleistung benötigen.

Das QlikView Dashboard finden Sie hier.



Für Qlik Sense existiert ein ähnliches Dashboard. Siehe Video unterhalb. Der Download findet sich auf Github.


QIX und Audit Log bilden eine neue Sicht auf die Performance des Qlik Servers. Mit der gewonnenen Information kann der Qlik Administrator gezieht auf die Entwickler des Dashboards zugehen und auf gewisse Objekte aufmerksam machen. Oft können durch einfache Anzeigebedingungen, oder Überarbeitung der Formeln die größten Performancefresser schnell beseitigt werden.

QlikView Server - Das Gerücht vom Memoryleak und wie man den Cache zurücksetzt

Über das Memory & Cache-Verhalten des QlikView Servers wurde schon viel geschrieben. Trotzdem bleibt das Gerücht hartnäckig, dass der QlikView Server ein Memory Leak hat.



Wenn man sich jedoch einmal mit dem WorkingSetLimit-Setting in der QMC beschäftigt hat, wird einem  klar, dass der QlikView Server einfach gerne aggressiv cached. (Fast) jedes gerechnete "Chart", welches sich aus einer Userselektion ergibt, will der QlikView Server cachen, sofern er noch Memory (<= WorkingSetLimit Low) dafür zur Verfügung hat. Damit braucht ein QlikView Server immer weniger CPU-Zeit, "frisst" aber für gewöhnlich im Verlaufe eines Tages das Memory des Servers auf (und gibt es auch nicht mehr frei, sofern er das WorkingSetLimit Low getroffen hat).

Dieses Verhalt kann nerven - speziell wenn man am gleichen Server auch noch den Publisher/ServerReload laufen hat, und jemand zusätzlich mit dem QlikView Developer entwickelt. Dieses Deployment trifft auf  viele Testserver bei unseren Kunden zu!

Abhilfe kann ein Easteregg schaffen, das in der settings.ini des QlikView Servers gesetzt werden kann.

ClearCacheTimesPerDay=1

Das Setting löscht um Mitternacht den Cache des QlikView Server Services. Das bedeutet:
  •  Memory das von den Daten der .qvws belegt wird, bleibt belegt
  • Alle  gecachten Berechnungen werden gelöscht, und der QlikView Server gibt diesen Teil des Memorys wieder an das Betriebssystem frei.

Das Interessante an diesem Setting: man kann definieren wie oft der Cache geleert werden soll. Immer ausgehend von Mitternacht ergibt sich somit:

ClearCacheTimesPerDay=1Einmal am Tag um Mitternacht 00:00
ClearCacheTimesPerDay=200:00 und 12:00
ClearCacheTimesPerDay=300:00 08:00 16:00
...usw.
ClearCacheTimesPerDay=24jede Stunde 


Die Teststellung

Wir haben ClearCacheTimesPerDay=24 auf einer Teststellung bei uns überprüft.Und tatsächlich - zu jeder vollen Stunde wurde wieder das Memory des Caches freigegeben! Unterhalb unsere Vorgehensweise.

Server

Wir haben auf einem Win2016 Server mit 8GB RAM getestet. Das Workingset des Serves ist auf  50% beschränkt, damit sollte der QlikView Server Prozess bis maximal 4GB Daten cachen.

Workingset des QlikView Server Service auf 50% = 4GB

Das Testscript

Die .qvw für den Test ist recht simple. Das Script lautet:

load
  'A'&rowno() as row,
  rand() as value
autogenerate(1000000)

Im Layout gibt es eine einfache Tabelle. Wenn man einige Werte auswählt und dann Rechtsklick "Select excluded" wählt, füllt man mit jeder neuen Selektion den Server-Cache mit einigen Dutzend Megabytes.

Viele distinkte Daten füllen den Cache ganz gut!


Konfiguration & Test

  1. QlikView Server Service stoppen. Settings.ini ändern, Service starten
  2. Bis 09:43 haben wir den Cache des Servers durch "Klicken" in unserer Testapplikation  auf  2 Gigabyte hochgetrieben
  3. Um 10:00 sieht man im Performance Monitor eine steile Flanke nach oben. Memory wird also freigegeben!  Die Größe des QlikView Server Prozesses ist im Taskmanager auf 192 Megabyte gefallen! Das Setting hat also 1,98 GB Cache geleert! Die restlichen 192 MB sind die Daten in unserer Testapplikation plus ein wenig Overhead des QlikView Server Prozesses.
  4. Gleiches Spiel bis 10:40, nur dass wir mehr Zeilen im autogenerate()-Script der .qvw generiert haben  (ca 900 MB Daten im Memory). Damit füllt sich mehr Cache mit weniger Klick ;-)

    Diesmal haben wir den Cache bis an das Maximum von 4 Gigabytes hochgetrieben (wegen des definierten Workingset Low 50% von 8GB geht auch nicht mehr).

  5. Um 11:00 dann wieder der Drop auf 900 MB

Conclusio

Das Setting ClearCacheTimesPerDay funktioniert, und ist eleganter als ein net stop/start des QlikViewServer Services (bei dem alle Online-User aus ihrer QlikView Session fliegen). Für den Testserver kann es also sehr nützlich sein. Für den Produktiven Server ist es nicht zu empfehlen - da muss man schon ein sinnvolles HardwareSizing durchführen (gerne auch mit uns!).





Information Density bei Concatinierter Faktentabelle

Zu jedem Feld kann man sich in QlikView und Qlik Sense die Information Density anzeigen lassen. Das ist eine wichtige Information, um die Datenqualität Ihrer App zu überprüfen.

Hier ein Beispiel: im Kundenstamm haben nur 75,8% aller Kunden eine Telefax Nummer gepflegt. Das könnte bei Ihrer nächsten Telefax-Marketing Kampagne (falls es soetwas noch gibt :-)) störend, für Ihre nächste Rechnungslegung unter Umständen sogar sehr ärgerlich sein!

Information Density in Qlik
Information Density - links in Qlik Sense, rechts in QlikView

Jedes einzelne Feld zu überprüfen ist einigermaßen zeitaufwendig, weswegen wir in unserem Heldendaten Applikationstemplate gerne den Data Profiler von quickintelligence.co.uk nutzen. Dort sieht man die "Null Values" eines Feldes auf einem Blick.

Telefax hat 22 Null Values, was die Information Density von 75,8% ergibt
Auch andere Felder im Kundenstamm haben eine Information Density < 100 %

Information Density bei Concatinierter Faktentabelle

Schwieriger wird es mit der Information Density-Kennzahl, wenn Sie ein Datenmodell mit mehreren Faktentabellen bauen. Das passiert sehr häufig: Ihre Applikation hat mehrere Faktentypen (IST-Zahlen und Budget-Zahlen) oder Sie verheiraten die ERP-Altdaten mit Daten ihres aktuellen ERPs. Steht ist es wichtig zu wissen, welche Spalten wie gut gefüllt sind. Vor allem wenn man sicherstellen möchte, dass der Anwender mit seinen Selektionen die Daten aus allen Quellsystemen wählt (also die Information Density 100% ist)


Zur Veranschaulichung, hier ein Beispiel wie in  Qlik solche Faktentabellen aussehen:

Concat Fakten in gemeinsame Faktentabelle
Für den Faktentype Procurement Cost gibt es das Feld Region  in der Quelle nicht. Damit ist die Information Density für diese Feld  jetzt nur noch 14 (befüllte Zeilen) /20 (Zeilen insgesamt) = 70%. Viel interessanter wäre es aber zu wissen, dass das Feld Region folgende Information Densities hat:

  • Sales: 100%
  • Plan Yearly: 100%
  • Procurement Cost: 0%
Wählt ein Anwender einen Eintrag im Feld Region an der Oberfläche, so sieht er keine Procurment Costs mehr. Das kann gewünscht sein, oder ein fehlerhaftes Mapping/fehlende Daten sein. Eine Information Density pro Faktentyp ist also Notwendig für eine umfassende Problemanalyse.
Dafür benötigen wir zuallererst ein Feld Source um zu wissen aus welcher Quelle welche Datensatzzeile ursprünglich kommt. Das Aufbauen Ihrer Faktentabelle Facts sollte also etwa so aussehen (je nachdem ob aus Datenbank/QVD/resident)

Facts:
load
*,
'Sales' as Soure
from/resident Sales;

concatenate (Facts)
load
*,
'Plan Yearly' as Soure
from/resident Plan Yearly;

concatenate (Facts)
load
*,
'Procurement Cost' as Soure
from/resident [Procurement Cost];
 
 
Als nächsten Schritt müssen NullCounts() für alle Felder im Script berechnet werden. Wenn Sie ein 3-Schichtenmodell nutzen, würde ich das Script im Datenmodell hinzufügen. Bei großen Datenmengen und vielen Faktenspalten kann das Skript schon mal länger rechnen - fügen Sie sich vielleicht einen Variablen-Schalter ein, damit das Skript beim Entwickeln nicht ständig ausgeführt wird.

//config
let tFactTableName = 'Facts';
let tSourceTable_Field = 'Source';


//Generate Fields that are in Facttable
let vAggregations = '';
for i = 1 to nooffields('$(tFactTableName)')

 let vField = Fieldname($(i),'$(tFactTableName)');
 if (vField <> '$(tSourceTable_Field)') then
   let vAggregations = vAggregations & 'nullcount([$(vField)])  as [$(vField)] ,';
 end if
 
 
 
next
trace *************** Check for fields: $(vAggregations);

ttFactsInfo:
load
   $(tSourceTable_Field), 
   $(vAggregations)
   1 as dummy
resident $(tFactTableName) group by $(tSourceTable_Field);

drop field dummy;


//Transform table to get all Fieldnames in a single column
tFactsInfo:
CrossTable (FieldName,NullCount,1)
load
  *
resident ttFactsInfo;
drop table ttFactsInfo;
 
  
//Check how many rows each "Source Table" has
MappingFactsSourceCount:
mapping
load
 $(tSourceTable_Field),
 count($(tSourceTable_Field))  as AllCount
resident $(tFactTableName) group by $(tSourceTable_Field);


//Generate FactsInfo
FactsInfo:
load
 $(tSourceTable_Field),
 FieldName,
 applymap('MappingFactsSourceCount',$(tSourceTable_Field), -99) 
           as AllCount,
 NullCount,
 applymap('MappingFactsSourceCount',$(tSourceTable_Field), -99)-NullCount 
          as FoundCount
resident tFactsInfo;

drop table tFactsInfo;

//optional drop table Facts;


let tFactTableName = ;
let tSourceTable_Field = ;


Das Skript erzeugt einen neue Tabelle FactsInfo mit den Feldern NullCount und FoundCount für jeden Fieldname pro Source-Tabelle. Damit lässt sich dann eine Pivottabelle bauen, die Ihnen die Information Density pro Feld zeigt. Unterhalb sehen Sie ein beladenes Beispiel in Qlik Sense
Information Density Example Concat Facts
Information Density für die Fakten: Buget, ORDERS und VBRP
Die Gesamtwerte-Spalte zeigt die Information Density wie sie Qlik im Datenmodell anzeigen würde. Daneben sehen wir die Befüllung in den Faktenquellen. Man sieht zum Beispiel auf einen Blick, dass das Feld PRODH (Produkthierarchie) in einigen ORDERS-Faktenzeilen nicht befüllt ist, da die Information Density dort nur 99,98% ist. Das Feld %KUNNR hat leere Einträge in ORDES und VBRP. Die Spalte NetSalesBudget hat nur eine Information Density von 1,94% - das ist aber OK weil es nur in der Source-Tabelle Budget befüllt ist (und dort dafür mit 100% immer einen Wert hat)

Als keines Gimmick sei auch noch das Sortieren der Pivot-Tabelle genannt. Sowohl die Sortierung nach Information Density, als auch eine alphabetische Sortierung der Feldnamen kann Sinn machen. Mit einer Variable kann die Sortierung hin- und hergeschalten werden. Siehe Screenshot mit alphabetisch sortierten Feldnamen - jetzt mit QlikView:

Information Density alphabetisch sortiert

Das komplette Beispiel für QlikView und Qlik Sense finden Sie unter content.heldendaten.eu/InformationDensity.zip









QlikView Publisher - Monitoring mit Perfmon

Häufig wird bei Hardware Sizing nur über das Qlik Server Service gesprochen. Die harte Arbeit der Datenaufbereitung übernimmt in der Nacht jedoch das Publisher Modul. Viele kleinere bis mittlere Qlik Installationen nutzen für diese (nächtliche) Beladung die gleiche Maschine. Das geht oft gut, doch kämpfen Server und Publisher dann häufig um die gleichen Memory- und CPU-Ressourcen, was über die Zeit bei wachsenden Datenmengen zu unerwünschten Verhalten führt. Um die notwendigen Ressourcen für den Publisher besser monitoren zu können, installiert Qlik - gut versteckt - einige Indikatoren in Microsoft Perfmon.

Das QlikView Server Service ist sehr aggressiv in seiner Memory-Consumption. Ähnlich eines Datenbankservers reserviert es Memory (WorkingSet) vor, da es annimmt, das wichtigste Service am ganzen System zu sein. Auch in der Nacht hält das  QlikView Server Service sein Memory (vor allem wenn es das untere Workingset schon einmal erreicht hat), was dazu führt, dass für die Reloads nur wenig freier Speicher zur Verfügung steht. Laufen dann noch mehrere Reloads gleichzeitig, kann es mit Memory auf einer einzelnen Maschine schnell knapp werden.

Für QMC-Administratoren ist es oft schwierig zu sagen, wann wieviel Tasks gleichzeit laufen und wieviel Last vom Publisher (bzw den qvb.exe des Distribution Services) dabei produziert wird. Seit QlikView 11.20 SR7 kann man sich zwar in jedem TaskLog eine Summary zeigen lassen, das gibt aber kein vollständiges Bild wie sich die Beladungen über einen vollen Nacht-Zyklus inklusive aller Abhängigkeiten verhält.

Um zu verstehen was nächtens bei den Reloads am Server so passiert, gibt es ein gut verstecktes Feature: Das QlikView Distribution Service registriert einige Performance Counter Indikatoren in Microsoft's PerfMon Tool das in jeder Windows Version zur Verfügung steht.

PerfMon - Performance Counter Indikatoren vom QlikView Distribution Service

Nicht alle Indikatoren sind ganz verständlich (und werden wohl nur vom Qlik Support genutzt), aber um sich einen Überblick zu verschaffen, benutze ich gerne

  • # of running tasks .. wieviele Tasks (qvb.exe) laufen gerade
  • Current QVB CPU Load .. CPU Zeit die von den Reload Tasks verbraucht wird.
  • Current QVB memory Usage .. den absoluten Wert kann ich nicht ganz nachvollziehen, aber er zeigt Arbeitsspeicher-Ausreißer bei großen JOINs usw.
Zusätzlich kann man einige Standard Windows-Indikatoren wie Arbeitsspeicher und Prozessorzeit (%) dazuhängen, um das Gesamtsystem zu überwachen.

Die nächsten Sceenhshots zeigen ein Beispiel wie Perfmon den Verlauf über die Zeit mitprotokolliert.



Die hellgrüne Linie zeigt die 4 gerade laufenden Tasks der QMC. Die Dunkelgrüne zeigt die Summe der verbrauchte CPU Zeit dieser Tasks (in Summe vier qvb.exe, in Screenshot sieht man nur eine qvb.exe im Taskmanager, da alle anderen gerade keine CPU verbrauchen). Rot+Blau gestrichelt zeigen den Zustand des gesamten Servers. Die gelbe Linie "Current QVB memory usage" kann ich in absoluten Zahlen nicht deuten, ist aber eine interessante Information um ressourcenfressende Skripte zu entdecken.

Werden die Reloads nach der Reihe fertig abgearbeitet, fallen auch die zwei grünen Linien entsprechend. Siehe unterhalb Screenshot mit nur noch einem laufenden Reloadtask.





Bei größeren Installationen - oder falls Sie viele untertägige Reloads fahren - empfehlen wir immer das Aufteilen der zwei Services "QlikView Server Service" und "QlikView Distribution Service (aka Publisher)".  Im Zeitalter der Virtualisierung und noch immer fallender Memory-Preise ist ein Deployment mit zwei Maschinen vorzuziehen. Beide Services können die vollen Ressourcen Ihrer Maschine nutzen, und kommen sich auch unter hoher Last nicht in die Quere.


Ein exemplarisches Deployment auf  zwei Maschinen für "PRODUKTIV"

 Wo das ManagementService und der Webserver läuft, ist zu vernachlässigen. Manchmal setzt man dafür auch eine dritte Maschine ein.

QlikView Master Summit - Drop Fields Diskussion

Rob Wunderlich hat sich in seinem aktuellen Blogpost einer unserer Diskussionen vom MasterSummit for QlikView in Barcelona angenommen.

Falls Sie Rob's Document Analyzer benutzen, um Felder am Ende des Skripts zu droppen, hier nochmals meine Beobachtung.

Attached a small example that shows the issue:

- 01_testDatabase.qvw produces a .qvw with about 350MB on disk
- 02_testDatabaseBinaryDrop400fields.qvw does a BINARY Load and then drops 400 fields --> it's about 18 MB on disk (136 MB in Memory including QV.exe)

So one would expect that 18 MB is the final size of the .qvw!
However when I do an additional RESIDENT-Load after dropping fields, the .qvw gets much smaller:

- 03_testDatabaseBinaryDrop400fields_Resident does a BINARY Load, then drops 400 fields and THEN makes a RESIDENT LOAD on the table, dropping the original table

--> suddenly the .qvvw is only 1.2 MB on disk (26 MB in Memory including qv.exe)!
Download Example

Rob hat dies nun weiter analysiert und bemerkt, dass die  Record pointers nicht freigegeben werden.  Erst mit einem weiteren RESIDENT-Load wird tatsächlich der komplette DISK/MEMORY-Space freigegeben.

  • Im Moment ist es besser die nicht benutzen Felder im Skript auszukommentieren, anstatt Sie erst am Ende des Skripts zu droppen!
  • Falls dies nicht möglich ist, sollte man nach den Drop Fields Statement die (Fakten)-Tabelle nochmals resident laden.


heldendaten GmbH,2020