aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs13
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs80
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs19
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs18
-rw-r--r--bin/OpenSimDefaults.ini40
5 files changed, 60 insertions, 110 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 103ec66..494cb0c 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -181,9 +181,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
181 m_maxRTO = maxRTO; 181 m_maxRTO = maxRTO;
182 182
183 // Create a token bucket throttle for this client that has the scene token bucket as a parent 183 // Create a token bucket throttle for this client that has the scene token bucket as a parent
184 m_throttleClient = new AdaptiveTokenBucket(parentThrottle, rates.TotalLimit); 184 m_throttleClient = new AdaptiveTokenBucket(parentThrottle, rates.Total, rates.AdaptiveThrottlesEnabled);
185 // Create a token bucket throttle for the total categary with the client bucket as a throttle 185 // Create a token bucket throttle for the total categary with the client bucket as a throttle
186 m_throttleCategory = new TokenBucket(m_throttleClient, rates.TotalLimit); 186 m_throttleCategory = new TokenBucket(m_throttleClient, rates.Total);
187 // Create an array of token buckets for this clients different throttle categories 187 // Create an array of token buckets for this clients different throttle categories
188 m_throttleCategories = new TokenBucket[THROTTLE_CATEGORY_COUNT]; 188 m_throttleCategories = new TokenBucket[THROTTLE_CATEGORY_COUNT];
189 189
@@ -194,7 +194,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
194 // Initialize the packet outboxes, where packets sit while they are waiting for tokens 194 // Initialize the packet outboxes, where packets sit while they are waiting for tokens
195 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>(); 195 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>();
196 // Initialize the token buckets that control the throttling for each category 196 // Initialize the token buckets that control the throttling for each category
197 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetLimit(type)); 197 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetRate(type));
198 } 198 }
199 199
200 // Default the retransmission timeout to three seconds 200 // Default the retransmission timeout to three seconds
@@ -341,12 +341,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
341 task = Math.Max(task, LLUDPServer.MTU); 341 task = Math.Max(task, LLUDPServer.MTU);
342 texture = Math.Max(texture, LLUDPServer.MTU); 342 texture = Math.Max(texture, LLUDPServer.MTU);
343 asset = Math.Max(asset, LLUDPServer.MTU); 343 asset = Math.Max(asset, LLUDPServer.MTU);
344 state = Math.Max(state, LLUDPServer.MTU);
345 344
346 int total = resend + land + wind + cloud + task + texture + asset + state; 345 int total = resend + land + wind + cloud + task + texture + asset;
347 346
348 //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}", 347 //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, Total={8}",
349 // AgentID, resend, land, wind, cloud, task, texture, asset, state, total); 348 // AgentID, resend, land, wind, cloud, task, texture, asset, total);
350 349
351 // Update the token buckets with new throttle values 350 // Update the token buckets with new throttle values
352 TokenBucket bucket; 351 TokenBucket bucket;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
index aaf6e26..c9aac0b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
@@ -52,30 +52,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
52 public int Texture; 52 public int Texture;
53 /// <summary>Drip rate for asset packets</summary> 53 /// <summary>Drip rate for asset packets</summary>
54 public int Asset; 54 public int Asset;
55 /// <summary>Drip rate for state packets</summary> 55
56 public int State;
57 /// <summary>Drip rate for the parent token bucket</summary> 56 /// <summary>Drip rate for the parent token bucket</summary>
58 public int Total; 57 public int Total;
59 58
60 /// <summary>Maximum burst rate for resent packets</summary> 59 /// <summary>Flag used to enable adaptive throttles</summary>
61 public int ResendLimit; 60 public bool AdaptiveThrottlesEnabled;
62 /// <summary>Maximum burst rate for land packets</summary> 61
63 public int LandLimit;
64 /// <summary>Maximum burst rate for wind packets</summary>
65 public int WindLimit;
66 /// <summary>Maximum burst rate for cloud packets</summary>
67 public int CloudLimit;
68 /// <summary>Maximum burst rate for task (state and transaction) packets</summary>
69 public int TaskLimit;
70 /// <summary>Maximum burst rate for texture packets</summary>
71 public int TextureLimit;
72 /// <summary>Maximum burst rate for asset packets</summary>
73 public int AssetLimit;
74 /// <summary>Maximum burst rate for state packets</summary>
75 public int StateLimit;
76 /// <summary>Burst rate for the parent token bucket</summary>
77 public int TotalLimit;
78
79 /// <summary> 62 /// <summary>
80 /// Default constructor 63 /// Default constructor
81 /// </summary> 64 /// </summary>
@@ -86,26 +69,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
86 { 69 {
87 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"]; 70 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"];
88 71
89 Resend = throttleConfig.GetInt("resend_default", 12500); 72 Resend = throttleConfig.GetInt("resend_default", 6625);
90 Land = throttleConfig.GetInt("land_default", 1000); 73 Land = throttleConfig.GetInt("land_default", 9125);
91 Wind = throttleConfig.GetInt("wind_default", 1000); 74 Wind = throttleConfig.GetInt("wind_default", 1750);
92 Cloud = throttleConfig.GetInt("cloud_default", 1000); 75 Cloud = throttleConfig.GetInt("cloud_default", 1750);
93 Task = throttleConfig.GetInt("task_default", 1000); 76 Task = throttleConfig.GetInt("task_default", 18500);
94 Texture = throttleConfig.GetInt("texture_default", 1000); 77 Texture = throttleConfig.GetInt("texture_default", 18500);
95 Asset = throttleConfig.GetInt("asset_default", 1000); 78 Asset = throttleConfig.GetInt("asset_default", 10500);
96 State = throttleConfig.GetInt("state_default", 1000);
97
98 ResendLimit = throttleConfig.GetInt("resend_limit", 18750);
99 LandLimit = throttleConfig.GetInt("land_limit", 29750);
100 WindLimit = throttleConfig.GetInt("wind_limit", 18750);
101 CloudLimit = throttleConfig.GetInt("cloud_limit", 18750);
102 TaskLimit = throttleConfig.GetInt("task_limit", 18750);
103 TextureLimit = throttleConfig.GetInt("texture_limit", 55750);
104 AssetLimit = throttleConfig.GetInt("asset_limit", 27500);
105 StateLimit = throttleConfig.GetInt("state_limit", 37000);
106 79
107 Total = throttleConfig.GetInt("client_throttle_max_bps", 0); 80 Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
108 TotalLimit = Total; 81
82 AdaptiveThrottlesEnabled = throttleConfig.GetBoolean("enable_adaptive_throttles", false);
109 } 83 }
110 catch (Exception) { } 84 catch (Exception) { }
111 } 85 }
@@ -128,34 +102,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
128 return Texture; 102 return Texture;
129 case ThrottleOutPacketType.Asset: 103 case ThrottleOutPacketType.Asset:
130 return Asset; 104 return Asset;
131 case ThrottleOutPacketType.State:
132 return State;
133 case ThrottleOutPacketType.Unknown:
134 default:
135 return 0;
136 }
137 }
138
139 public int GetLimit(ThrottleOutPacketType type)
140 {
141 switch (type)
142 {
143 case ThrottleOutPacketType.Resend:
144 return ResendLimit;
145 case ThrottleOutPacketType.Land:
146 return LandLimit;
147 case ThrottleOutPacketType.Wind:
148 return WindLimit;
149 case ThrottleOutPacketType.Cloud:
150 return CloudLimit;
151 case ThrottleOutPacketType.Task:
152 return TaskLimit;
153 case ThrottleOutPacketType.Texture:
154 return TextureLimit;
155 case ThrottleOutPacketType.Asset:
156 return AssetLimit;
157 case ThrottleOutPacketType.State:
158 return StateLimit;
159 case ThrottleOutPacketType.Unknown: 105 case ThrottleOutPacketType.Unknown:
160 default: 106 default:
161 return 0; 107 return 0;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
index 677d3d1..2ec79ab 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs
@@ -340,6 +340,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
340 set { m_maxDripRate = (value == 0 ? 0 : Math.Max(value,m_minimumFlow)); } 340 set { m_maxDripRate = (value == 0 ? 0 : Math.Max(value,m_minimumFlow)); }
341 } 341 }
342 342
343 private bool m_enabled = false;
344
343 // <summary> 345 // <summary>
344 // 346 //
345 // </summary> 347 // </summary>
@@ -357,9 +359,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
357 // <summary> 359 // <summary>
358 // 360 //
359 // </summary> 361 // </summary>
360 public AdaptiveTokenBucket(TokenBucket parent, Int64 maxDripRate) : base(parent,m_minimumFlow) 362 public AdaptiveTokenBucket(TokenBucket parent, Int64 maxDripRate, bool enabled) : base(parent,maxDripRate)
361 { 363 {
362 MaxDripRate = maxDripRate; 364 m_enabled = enabled;
365
366 if (m_enabled)
367 {
368 m_log.WarnFormat("[TOKENBUCKET] Adaptive throttle enabled");
369 MaxDripRate = maxDripRate;
370 AdjustedDripRate = m_minimumFlow;
371 }
363 } 372 }
364 373
365 // <summary> 374 // <summary>
@@ -368,7 +377,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
368 public void ExpirePackets(Int32 count) 377 public void ExpirePackets(Int32 count)
369 { 378 {
370 // m_log.WarnFormat("[ADAPTIVEBUCKET] drop {0} by {1} expired packets",AdjustedDripRate,count); 379 // m_log.WarnFormat("[ADAPTIVEBUCKET] drop {0} by {1} expired packets",AdjustedDripRate,count);
371 AdjustedDripRate = (Int64) (AdjustedDripRate / Math.Pow(2,count)); 380 if (m_enabled)
381 AdjustedDripRate = (Int64) (AdjustedDripRate / Math.Pow(2,count));
372 } 382 }
373 383
374 // <summary> 384 // <summary>
@@ -376,7 +386,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
376 // </summary> 386 // </summary>
377 public void AcknowledgePackets(Int32 count) 387 public void AcknowledgePackets(Int32 count)
378 { 388 {
379 AdjustedDripRate = AdjustedDripRate + count; 389 if (m_enabled)
390 AdjustedDripRate = AdjustedDripRate + count;
380 } 391 }
381 } 392 }
382} 393}
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index ddbc079..db17d8f 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -398,7 +398,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
398 if (client is LLClientView) 398 if (client is LLClientView)
399 { 399 {
400 LLClientView llClient = client as LLClientView; 400 LLClientView llClient = client as LLClientView;
401 401
402 if (firstClient) 402 if (firstClient)
403 { 403 {
404 report.AppendLine(GetServerThrottlesReport(llClient.UDPServer)); 404 report.AppendLine(GetServerThrottlesReport(llClient.UDPServer));
@@ -451,7 +451,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
451 int maxRegionNameLength = 14; 451 int maxRegionNameLength = 14;
452 int maxTypeLength = 4; 452 int maxTypeLength = 4;
453 453
454 string name = "SERVER AGENT LIMITS"; 454 string name = "SERVER AGENT RATES";
455 455
456 report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); 456 report.Append(GetColumnEntry(name, maxNameLength, columnPadding));
457 report.Append(GetColumnEntry("-", maxRegionNameLength, columnPadding)); 457 report.Append(GetColumnEntry("-", maxRegionNameLength, columnPadding));
@@ -461,13 +461,13 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
461 report.AppendFormat( 461 report.AppendFormat(
462 "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}", 462 "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}",
463 (throttleRates.Total * 8) / 1000, 463 (throttleRates.Total * 8) / 1000,
464 (throttleRates.ResendLimit * 8) / 1000, 464 (throttleRates.Resend * 8) / 1000,
465 (throttleRates.LandLimit * 8) / 1000, 465 (throttleRates.Land * 8) / 1000,
466 (throttleRates.WindLimit * 8) / 1000, 466 (throttleRates.Wind * 8) / 1000,
467 (throttleRates.CloudLimit * 8) / 1000, 467 (throttleRates.Cloud * 8) / 1000,
468 (throttleRates.TaskLimit * 8) / 1000, 468 (throttleRates.Task * 8) / 1000,
469 (throttleRates.TextureLimit * 8) / 1000, 469 (throttleRates.Texture * 8) / 1000,
470 (throttleRates.AssetLimit * 8) / 1000); 470 (throttleRates.Asset * 8) / 1000);
471 471
472 return report.ToString(); 472 return report.ToString();
473 } 473 }
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 7ea98d4..35e8079 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -362,30 +362,24 @@
362 ; 362 ;
363 ;client_throttle_max_bps = 196608 363 ;client_throttle_max_bps = 196608
364 364
365 ; Per-client bytes per second rates for the various throttle categories. 365 ; Adaptive throttling attempts to limit network overload when multiple
366 ; These are default values that will be overriden by clients 366 ; clients login by starting each connection more slowly. Disabled by
367 ; 367 ; default
368 ;resend_default = 12500
369 ;land_default = 1000
370 ;wind_default = 1000
371 ;cloud_default = 1000
372 ;task_default = 1000
373 ;texture_default = 1000
374 ;asset_default = 1000
375 ;state_default = 1000
376
377 ; Per-client maximum burst rates in bytes per second for the various
378 ; throttle categories. These are default values that will be overriden by
379 ; clients
380 ; 368 ;
381 ;resend_limit = 18750 369 ;enable_adaptive_throttles = true
382 ;land_limit = 29750 370
383 ;wind_limit = 18750 371 ; Per-client bytes per second rates for the various throttle categories.
384 ;cloud_limit = 18750 372 ; These are default values that will be overriden by clients. These
385 ;task_limit = 18750 373 ; defaults are approximately equivalent to the throttles set by the Imprudence
386 ;texture_limit = 55750 374 ; viewer when maximum bandwidth is set to 350kbps
387 ;asset_limit = 27500 375
388 ;state_limit = 37000 376 ;resend_default = 6625
377 ;land_default = 9125
378 ;wind_default = 1750
379 ;cloud_default = 1750
380 ;task_default = 18500
381 ;texture_default = 18500
382 ;asset_default = 10500
389 383
390 ; Configures how ObjectUpdates are aggregated. These numbers 384 ; Configures how ObjectUpdates are aggregated. These numbers
391 ; do not literally mean how many updates will be put in each 385 ; do not literally mean how many updates will be put in each