diff options
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs | 80 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs | 19 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs | 18 | ||||
-rw-r--r-- | bin/OpenSimDefaults.ini | 40 |
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 |