diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e81ff4b00f..6f0b177b14 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -346,15 +346,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected int m_terrainCheckerCount; protected uint m_agentFOVCounter; - // These numbers are guesses at a decent tradeoff between responsiveness - // of the interest list and throughput. Lower is more responsive, higher - // is better throughput - protected int m_primTerseUpdatesPerPacket = 25; - protected int m_primFullUpdatesPerPacket = 100; - protected int m_avatarTerseUpdatesPerPacket = 10; - /// Number of texture packets to put on the queue each time the - /// OnQueueEmpty event is triggered for the texture category - protected int m_textureSendLimit = 20; protected IAssetService m_assetService; private IHyperAssetService m_hyperAssets; @@ -3333,7 +3324,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP lock (m_avatarTerseUpdates.SyncRoot) { - int count = Math.Min(m_avatarTerseUpdates.Count, m_avatarTerseUpdatesPerPacket); + int count = Math.Min(m_avatarTerseUpdates.Count, m_udpServer.AvatarTerseUpdatesPerPacket); if (count == 0) return; @@ -3418,7 +3409,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP lock (m_primFullUpdates.SyncRoot) { - int count = Math.Min(m_primFullUpdates.Count, m_primFullUpdatesPerPacket); + int count = Math.Min(m_primFullUpdates.Count, m_udpServer.PrimFullUpdatesPerPacket); if (count == 0) return; @@ -3462,7 +3453,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP lock (m_primTerseUpdates.SyncRoot) { - int count = Math.Min(m_primTerseUpdates.Count, m_primTerseUpdatesPerPacket); + int count = Math.Min(m_primTerseUpdates.Count, m_udpServer.PrimTerseUpdatesPerPacket); if (count == 0) return; @@ -3585,7 +3576,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP void ProcessTextureRequests() { if (m_imageManager != null) - m_imageManager.ProcessImageQueue(m_textureSendLimit); + m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit); } public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index e9faf2ef89..232c9c9bdd 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -98,6 +98,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// The measured resolution of Environment.TickCount public readonly float TickCountResolution; + /// Number of terse prim updates to put on the queue each time the + /// OnQueueEmpty event is triggered for updates + public readonly int PrimTerseUpdatesPerPacket; + /// Number of terse avatar updates to put on the queue each time the + /// OnQueueEmpty event is triggered for updates + public readonly int AvatarTerseUpdatesPerPacket; + /// Number of full prim updates to put on the queue each time the + /// OnQueueEmpty event is triggered for updates + public readonly int PrimFullUpdatesPerPacket; + /// Number of texture packets to put on the queue each time the + /// OnQueueEmpty event is triggered for textures + public readonly int TextureSendLimit; /// Handlers for incoming packets //PacketEventDictionary packetEvents = new PacketEventDictionary(); @@ -172,6 +184,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_asyncPacketHandling = config.GetBoolean("async_packet_handling", false); m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0); sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0); + + PrimTerseUpdatesPerPacket = config.GetInt("PrimTerseUpdatesPerPacket", 25); + AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10); + PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100); + TextureSendLimit = config.GetInt("TextureSendLimit", 20); + } + else + { + PrimTerseUpdatesPerPacket = 25; + AvatarTerseUpdatesPerPacket = 10; + PrimFullUpdatesPerPacket = 100; + TextureSendLimit = 20; } m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps); diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 3dc746ea50..f426556544 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -355,8 +355,9 @@ ; already separated from packet handling with a queue, so this will only ; affect whether networking internals such as packet decoding and ; acknowledgement accounting are done synchronously or asynchronously - async_packet_handling = false - + ; + ;async_packet_handling = false + ; The client socket receive buffer size determines how many ; incoming requests we can process; the default on .NET is 8192 ; which is about 2 4k-sized UDP datagrams. On mono this is @@ -371,22 +372,26 @@ ; by the system's settings for the maximum client receive buffer ; size (on linux systems you can set that with "sysctl -w ; net.core.rmem_max=X") + ; ;client_socket_rcvbuf_size = 8388608 ; Maximum outbound bytes per second for a single scene. This can be used to ; throttle total outbound UDP traffic for a simulator. The default value is ; 0, meaning no throttling at the scene level. The example given here is ; 20 megabits + ; ;scene_throttle_max_bps = 2621440 ; Maximum bits per second to send to any single client. This will override ; the user's viewer preference settings. The default value is 0, meaning no ; aggregate throttling on clients (only per-category throttling). The ; example given here is 1.5 megabits + ; ;client_throttle_max_bps = 196608 ; Per-client bytes per second rates for the various throttle categories. ; These are default values that will be overriden by clients + ; ;resend_default = 12500 ;land_default = 500 ;wind_default = 500 @@ -399,6 +404,7 @@ ; Per-client maximum burst rates in bytes per second for the various ; throttle categories. These are default values that will be overriden by ; clients + ; ;resend_limit = 18750 ;land_limit = 29750 ;wind_limit = 18750 @@ -407,6 +413,28 @@ ;texture_limit = 55750 ;asset_limit = 27500 ;state_limit = 37000 + + ; Configures how ObjectUpdates are aggregated. These numbers + ; do not literally mean how many updates will be put in each + ; packet that goes over the wire, as packets are + ; automatically split on a 1400 byte boundary. These control + ; the balance between responsiveness of interest list updates + ; and total throughput. Higher numbers will ensure more full- + ; sized packets and faster sending of data, but more delay in + ; updating interest lists + ; + ;PrimTerseUpdatesPerPacket = 25 + ;AvatarTerseUpdatesPerPacket = 10 + ;PrimFullUpdatesPerPacket = 100 + + ; TextureSendLimit determines how many packets will be put on + ; the outgoing queue each cycle. Like the settings above, this + ; is a balance between responsiveness to priority updates and + ; total throughput. Higher numbers will give a better + ; throughput at the cost of reduced responsiveness to client + ; priority changes or transfer aborts + ; + ;TextureSendLimit = 20 [Chat] ; Controls whether the chat module is enabled. Default is true. @@ -1365,36 +1393,6 @@ ;RecycleDataBlocks = true; -[LLClient] - ; Resend packets markes as reliable until they are received - ; - ;ReliableIsImportant = false - - ; Maximum number of times to resend packets marked reliable - ; - ;MaxReliableResends = 3 - - ; Configures how ObjectUpdates are compressed. - ; - ;TerseUpdatesPerPacket=10 - ;FullUpdatesPerPacket=14 - ;TerseUpdateRate=10 - ;FullUpdateRate=14 - - ;PacketMTU = 1400 - - ; TextureSendLimit determines how many different textures - ; will be considered on each cycle. Textures are selected - ; by priority. The old mechanism specified a value of 10 for - ; this parameter. - ; - ;TextureSendLimit = 10 - - ; TextureDataLimit determines how many packets will be sent for - ; each of the selected textures. Default is 5. - ; - ;TextureDataLimit = 5 - [InterestManagement] ; This section controls how state updates are prioritized for each client ; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack