Speicherüberwachung

Die Java System Property dle.server.error.memoryLimitReached kann dazu verwendet werden, um bei Überschreiten eines bestimmten Speicherlimits eine Fehlermeldung zu protokollieren.
Als Wert erhält die Property die Größe in Bytes, bei der gewarnt werden soll.
Die Java System Property dle.server.error.memoryLimitSetSyslogLevel kann dazu verwendet werden, den allgemeinen Loglevel im Falle einer Überschreitung des Speicherlimits anzupassen.
Als Wert erhält die Property den neuen Loglevel.
Wird der Speicher wieder unterschritten, wird der Loglevel wieder auf den vorher eingestellten Wert gesetzt.
Bei erneutem Überschreiten des Limits wird wieder eine Fehlermeldung protokolliert und er Loglevel unter Umständen angepasst.

Angegeben werden können die Properties beim Start des DLE Servers, z.B.:

java -Ddle.server.error.memoryLimitReached=250000000 -Ddle.server.error.memoryLimitSetSyslogLevel=debug -jar dlestart.jar –server

Alternativ können natürlich auch entsprechende Einträge in der startupParams.xml gesetzt werden:

<startParams>
<environmentVars>
<var name="LANG" value="de"/>
</environmentVars>
<runtimeParams>
<param value="Xms128M" />
<param value="Xmx512M" />
<param value="Ddle.server.error.memoryLimitReached=250000000" />
<param value="Ddle.server.error.memoryLimitSetSyslogLevel=debug" />
</runtimeParams>
</startParams>

Protokolliert wird im Falle eines Überschreitens des Limits zusätzlich eine genaue Liste der im Moment aktiven Verbindungen, Bricks und Threads in XML Format.

Beispielhaft sieht dies so aus:

12.03.12 10:39:38.631 DLE client 12 INFO DLE-statistics - Execution finished - folder=DLETEST:OrderEntry result=1 duration=0.234 wait=0.015 memory=27807744 workers=10 workersBusy=6 backlog=0 connections=51
12.03.12 10:39:38.633 DLE client 4 INFO DLE-statistics - Memory warning limit reached (27807744).
<ServerInfo server="DefaultServer" logDate="Mon Mar 12 10:39:38 CET 2012">
<Started>Mon Mar 12 10:39:32 CET 2012</Started>
<Workers>10</Workers>
<BusyWorkers>6</BusyWorkers>
<Backlog>0</Backlog>
<UsedMemory>17327560</UsedMemory>
<FreeMemory>10480184</FreeMemory>
<TotalMemory>27807744</TotalMemory>
<MaxMemory>259522560</MaxMemory>
<Connections count="10">
<Connection id ="20120312103910000029">
<User>DLE client 5</User>
<Login>Mon Mar 12 10:39:38 CET 2012</Login>
<Locale>de_AT</Locale>
<IdleMs>291</IdleMs>
<Config>testdata/sessionConfig/DateConvertConfig.xml</Config>
<IsInternal>false</IsInternal>
<IsInUse>true</IsInUse>
<SessionOutOfDate>false</SessionOutOfDate>
<IsExecuting>false</IsExecuting>
<ExecutionInfo>null</ExecutionInfo>
<FolderOrBrickName>null</FolderOrBrickName>
</Connection>
<Connection id ="20120312103910000030">
<User>DLE client 49</User>
<Login>Mon Mar 12 10:39:38 CET 2012</Login>
<Locale>de_AT</Locale>
<IdleMs>265</IdleMs>
<Config>testdata/sessionConfig/DateConvertConfig.xml</Config>
<IsInternal>false</IsInternal>
<IsInUse>true</IsInUse>
<SessionOutOfDate>false</SessionOutOfDate>
<IsExecuting>true</IsExecuting>
<ExecutionInfo>DLE client 49 execute test 0</ExecutionInfo>
<FolderOrBrickName>DLETEST:OrderEntry</FolderOrBrickName>
</Connection>
</Connections>
<Threads>
<ThreadGroup name="system">
<Thread name="Reference Handler" alive="true"/>
<Thread name="Finalizer" alive="true"/>
<Thread name="Signal Dispatcher" alive="true"/>
<Thread name="Attach Listener" alive="true"/>
<ThreadGroup name="main">
<Thread name="main" alive="true"/>
<ThreadGroup name="DefaultAdapter worker group">
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
<Thread name="DLESocket/127.0.0.1" alive="true"/>
</ThreadGroup>
<ThreadGroup name="DLE workerPool">
<Thread name="DLE workerPool (worker 1)" alive="true"/>
<Thread name="DLE workerPool (worker 2)" alive="true"/>
<Thread name="DLE workerPool (worker 3)" alive="true"/>
<Thread name="DLE workerPool (worker 4)" alive="true"/>
<Thread name="DLE workerPool (worker 5)" alive="true"/>
<Thread name="DLE workerPool (worker 6)" alive="true"/>
<Thread name="DLE workerPool (worker 7)" alive="true"/>
<Thread name="DLE workerPool (worker 8)" alive="true"/>
<Thread name="DLE workerPool (worker 9)" alive="true"/>
<Thread name="DLE workerPool (worker 10)" alive="true"/>
<Thread name="DLEExecution" alive="true"/>
<Thread name="DLEExecution" alive="true"/>
<Thread name="Brick_2_2V" alive="true"/>
</ThreadGroup>
<ThreadGroup name="DLE HTTP Console">
<Thread name="DLE HTTP Console (worker 1)" alive="true"/>
<Thread name="DLE HTTP Console (worker 2)" alive="true"/>
<Thread name="DLE HTTP Console (worker 3)" alive="true"/>
</ThreadGroup>
<ThreadGroup name="DLE clients">
<Thread name="DLE client 0" alive="true"/>
<Thread name="DLE client 1" alive="true"/>
<Thread name="DLE client 2" alive="true"/>
<Thread name="DLE client 3" alive="true"/>
<Thread name="DLE client 4" alive="true"/>
<Thread name="DLE client 5" alive="true"/>
<Thread name="DLE client 6" alive="true"/>
<Thread name="DLE client 7" alive="true"/>
<Thread name="DLE client 8" alive="true"/>
<Thread name="DLE client 9" alive="true"/>
</ThreadGroup>
</ThreadGroup>
</ThreadGroup>
</Threads>
</ServerInfo>