Better timing of MaintenanceThread's tasks (uses less CPU)

Updated OpenSim.ini.example
afrisby-rexmerge
Tedd Hansen 2008-02-22 19:46:13 +00:00
parent 582964800c
commit 0fb4374c1a
2 changed files with 56 additions and 34 deletions

View File

@ -41,6 +41,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
{ {
//public ScriptEngine m_ScriptEngine; //public ScriptEngine m_ScriptEngine;
private int MaintenanceLoopms; private int MaintenanceLoopms;
private int MaintenanceLoopTicks_ScriptLoadUnload;
private int MaintenanceLoopTicks_Other;
public MaintenanceThread() public MaintenanceThread()
{ {
@ -63,6 +66,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
foreach (ScriptEngine m_ScriptEngine in ScriptEngine.ScriptEngines) foreach (ScriptEngine m_ScriptEngine in ScriptEngine.ScriptEngines)
{ {
MaintenanceLoopms = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopms", 50); MaintenanceLoopms = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopms", 50);
MaintenanceLoopTicks_ScriptLoadUnload = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopTicks_ScriptLoadUnload", 1);
MaintenanceLoopTicks_Other = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopTicks_Other", 10);
return; return;
} }
} }
@ -123,6 +129,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
long Last_maxFunctionExecutionTimens = 0; // DateTime.Now.Ticks; long Last_maxFunctionExecutionTimens = 0; // DateTime.Now.Ticks;
long Last_ReReadConfigFilens = DateTime.Now.Ticks; long Last_ReReadConfigFilens = DateTime.Now.Ticks;
long Last_MaintenanceRun = 0;
int MaintenanceLoopTicks_ScriptLoadUnload_Count = 0;
int MaintenanceLoopTicks_Other_Count = 0;
while (true) while (true)
{ {
try try
@ -132,15 +142,20 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
System.Threading.Thread.Sleep(MaintenanceLoopms); // Sleep before next pass System.Threading.Thread.Sleep(MaintenanceLoopms); // Sleep before next pass
//if (PleaseShutdown) //if (PleaseShutdown)
// return; // return;
MaintenanceLoopTicks_ScriptLoadUnload_Count++;
MaintenanceLoopTicks_Other_Count++;
foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines)) foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines))
{ {
lastScriptEngine = m_ScriptEngine; lastScriptEngine = m_ScriptEngine;
if (m_ScriptEngine != null) // Re-reading config every x seconds
if (m_ScriptEngine.RefreshConfigFilens > 0)
{ {
// Re-reading config every x seconds
if (m_ScriptEngine.RefreshConfigFilens > 0) if (MaintenanceLoopTicks_Other_Count >= MaintenanceLoopTicks_Other)
{ {
MaintenanceLoopTicks_Other_Count = 0;
// Check if its time to re-read config // Check if its time to re-read config
if (DateTime.Now.Ticks - Last_ReReadConfigFilens > if (DateTime.Now.Ticks - Last_ReReadConfigFilens >
m_ScriptEngine.RefreshConfigFilens) m_ScriptEngine.RefreshConfigFilens)
@ -150,29 +165,33 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
m_ScriptEngine.ReadConfig(); m_ScriptEngine.ReadConfig();
Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time
} }
}
// Adjust number of running script threads if not correct
if (m_ScriptEngine.m_EventQueueManager != null)
m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads();
// Check if any script has exceeded its max execution time // Adjust number of running script threads if not correct
if (EventQueueManager.EnforceMaxExecutionTime) if (m_ScriptEngine.m_EventQueueManager != null)
{ m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads();
// We are enforcing execution time
if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens > // Check if any script has exceeded its max execution time
EventQueueManager.maxFunctionExecutionTimens) if (EventQueueManager.EnforceMaxExecutionTime)
{ {
// Its time to check again // We are enforcing execution time
m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens >
Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time EventQueueManager.maxFunctionExecutionTimens)
{
// Its time to check again
m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check
Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time
}
} }
} }
// LOAD / UNLOAD SCRIPTS if (MaintenanceLoopTicks_ScriptLoadUnload_Count >= MaintenanceLoopTicks_ScriptLoadUnload)
if (m_ScriptEngine.m_ScriptManager != null) {
m_ScriptEngine.m_ScriptManager.DoScriptLoadUnload(); MaintenanceLoopTicks_ScriptLoadUnload_Count = 0;
// LOAD / UNLOAD SCRIPTS
if (m_ScriptEngine.m_ScriptManager != null)
m_ScriptEngine.m_ScriptManager.DoScriptLoadUnload();
}
} }
} }
} }

View File

@ -171,8 +171,8 @@ msgformat = "PRIVMSG {0} : {3} - {1} of {2}"
; Refresh ScriptEngine config options (these settings) every xx seconds ; Refresh ScriptEngine config options (these settings) every xx seconds
; 0 = Do not refresh ; 0 = Do not refresh
; Set it to number of seconds between refresh, for example 30. ; Set it to number of seconds between refresh, for example 30.
; Will allow you to change ScriptEngine settings while server is running just by editing this file. ; Will allow you to change ScriptEngine settings while server is running just by using "CONFIG SET" on console
; For example to increase or decrease number of threads. ; For example to increase or decrease number of threads: CONFIG SET NumberOfScriptThreads 10
; NOTE! Disabled for now. Feature does not work. ; NOTE! Disabled for now. Feature does not work.
RefreshConfig=0 RefreshConfig=0
@ -184,14 +184,6 @@ NumberOfScriptThreads=2
; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest ; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest
ScriptThreadPriority=BelowNormal ScriptThreadPriority=BelowNormal
; Should the script threads be private for each region?
; true: Each region will get <NumberOfScriptThreads> dedicated to scripts within that region
; Number of threads will be <NumberOfScriptThreads>*<NumberOfRegions>
; false: All regions share <NumberOfScriptThreads> for all their scripts
; Note! If you run multiple script engines based on "OpenSim.Region.ScriptEngine.Common" then all of them will share the same threads.
; *** This setting will not work until you restart OpenSim
PrivateRegionThreads=false
; How long MAX should a script event be allowed to run (per event execution)? ; How long MAX should a script event be allowed to run (per event execution)?
; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function ; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function
; There is also a small speed penalty for every kill that is made ; There is also a small speed penalty for every kill that is made
@ -222,11 +214,22 @@ ScriptsPerAppDomain=1
; How long load/unload thread should sleep if there is nothing to do ; How long load/unload thread should sleep if there is nothing to do
; Higher value makes it respond slower when scripts are added/removed from prims ; Higher value makes it respond slower when scripts are added/removed from prims
; But once active it will process all in queue before sleeping again ; But once active it will process all in queue before sleeping again
ScriptLoadUnloadLoopms=30
; Loading and unloading of scripts is queued and processed by a separate thread.
; This thread can either be shared among all regions, or private (one thread per region) ; MaintenanceLoop
PrivateScriptLoadUnloadThread=false ; How often to run maintenance loop
; Maintenance loop is doing: script compile/load, script unload, reload config, adjust running config and enforce max execution time
MaintenanceLoopms=50
; How many maintenanceloops between each of these.
; (if 2 then function will be executed every MaintenanceLoopms*2 ms)
; Script loading/unloading
MaintenanceLoopTicks_ScriptLoadUnload=1
; Other tasks
; check if we need to reload config, adjust running config and enforce max execution time
MaintenanceLoopTicks_Other=10
; Maximum number of items in load/unload queue before we start rejecting loads ; Maximum number of items in load/unload queue before we start rejecting loads
; Note that we will only be rejecting load. Unloads will still be able to queue. ; Note that we will only be rejecting load. Unloads will still be able to queue.