aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs')
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs69
1 files changed, 32 insertions, 37 deletions
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index 6e8a1bf..2ef3c4c 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -87,8 +87,8 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
87 "show pqueues [full]", 87 "show pqueues [full]",
88 "Show priority queue data for each client", 88 "Show priority queue data for each client",
89 "Without the 'full' option, only root agents are shown." 89 "Without the 'full' option, only root agents are shown."
90 + " With the 'full' option child agents are also shown.", 90 + " With the 'full' option child agents are also shown.",
91 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + GetPQueuesReport(cmd))); 91 (mod, cmd) => MainConsole.Instance.Output(GetPQueuesReport(cmd)));
92 92
93 scene.AddCommand( 93 scene.AddCommand(
94 "Comms", this, "show queues", 94 "Comms", this, "show queues",
@@ -103,27 +103,27 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
103 + "Pkts Resent - Number of packets resent to the client.\n" 103 + "Pkts Resent - Number of packets resent to the client.\n"
104 + "Bytes Unacked - Number of bytes transferred to the client that are awaiting acknowledgement.\n" 104 + "Bytes Unacked - Number of bytes transferred to the client that are awaiting acknowledgement.\n"
105 + "Q Pkts * - Number of packets of various types (land, wind, etc.) to be sent to the client that are waiting for available bandwidth.\n", 105 + "Q Pkts * - Number of packets of various types (land, wind, etc.) to be sent to the client that are waiting for available bandwidth.\n",
106 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + GetQueuesReport(cmd))); 106 (mod, cmd) => MainConsole.Instance.Output(GetQueuesReport(cmd)));
107 107
108 scene.AddCommand( 108 scene.AddCommand(
109 "Comms", this, "show image queues", 109 "Comms", this, "show image queues",
110 "show image queues <first-name> <last-name>", 110 "show image queues <first-name> <last-name>",
111 "Show the image queues (textures downloaded via UDP) for a particular client.", 111 "Show the image queues (textures downloaded via UDP) for a particular client.",
112 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + GetImageQueuesReport(cmd))); 112 (mod, cmd) => MainConsole.Instance.Output(GetImageQueuesReport(cmd)));
113 113
114 scene.AddCommand( 114 scene.AddCommand(
115 "Comms", this, "clear image queues", 115 "Comms", this, "clear image queues",
116 "clear image queues <first-name> <last-name>", 116 "clear image queues <first-name> <last-name>",
117 "Clear the image queues (textures downloaded via UDP) for a particular client.", 117 "Clear the image queues (textures downloaded via UDP) for a particular client.",
118 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + HandleImageQueuesClear(cmd))); 118 (mod, cmd) => MainConsole.Instance.Output(HandleImageQueuesClear(cmd)));
119 119
120 scene.AddCommand( 120 scene.AddCommand(
121 "Comms", this, "show throttles", 121 "Comms", this, "show throttles",
122 "show throttles [full]", 122 "show throttles [full]",
123 "Show throttle settings for each client and for the server overall", 123 "Show throttle settings for each client and for the server overall",
124 "Without the 'full' option, only root agents are shown." 124 "Without the 'full' option, only root agents are shown."
125 + " With the 'full' option child agents are also shown.", 125 + " With the 'full' option child agents are also shown.",
126 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + GetThrottlesReport(cmd))); 126 (mod, cmd) => MainConsole.Instance.Output(GetThrottlesReport(cmd)));
127 127
128 scene.AddCommand( 128 scene.AddCommand(
129 "Comms", this, "emergency-monitoring", 129 "Comms", this, "emergency-monitoring",
@@ -138,7 +138,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
138 "Show client request stats", 138 "Show client request stats",
139 "Without the 'first_name last_name' option, all clients are shown." 139 "Without the 'first_name last_name' option, all clients are shown."
140 + " With the 'first_name last_name' option only a specific client is shown.", 140 + " With the 'first_name last_name' option only a specific client is shown.",
141 (mod, cmd) => m_log.Debug(string.Join(" ", cmd) + "\n" + HandleClientStatsReport(cmd))); 141 (mod, cmd) => MainConsole.Instance.Output(HandleClientStatsReport(cmd)));
142 142
143 } 143 }
144 144
@@ -279,7 +279,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
279 return; 279 return;
280 280
281 string name = client.Name; 281 string name = client.Name;
282 if (pname != "" && name.ToLower() != pname.ToLower()) 282 if (pname != "" && name != pname)
283 return; 283 return;
284 284
285 string regionName = scene.RegionInfo.RegionName; 285 string regionName = scene.RegionInfo.RegionName;
@@ -440,7 +440,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
440 return; 440 return;
441 441
442 string name = client.Name; 442 string name = client.Name;
443 if (pname != "" && name.ToLower() != pname.ToLower()) 443 if (pname != "" && name != pname)
444 return; 444 return;
445 445
446 string regionName = scene.RegionInfo.RegionName; 446 string regionName = scene.RegionInfo.RegionName;
@@ -537,7 +537,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
537 return; 537 return;
538 538
539 string name = client.Name; 539 string name = client.Name;
540 if (pname != "" && name.ToLower() != pname.ToLower()) 540 if (pname != "" && name != pname)
541 return; 541 return;
542 542
543 string regionName = scene.RegionInfo.RegionName; 543 string regionName = scene.RegionInfo.RegionName;
@@ -608,12 +608,12 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
608 /// <returns></returns> 608 /// <returns></returns>
609 protected string HandleClientStatsReport(string[] showParams) 609 protected string HandleClientStatsReport(string[] showParams)
610 { 610 {
611 StringBuilder report = new StringBuilder(); 611 // NOTE: This writes to m_log on purpose. We want to store this information
612 612 // in case we need to analyze it later.
613 //
613 if (showParams.Length <= 4) 614 if (showParams.Length <= 4)
614 { 615 {
615 report.AppendFormat("{0,-30} {1,-30} {2,-6} {3,-11} {4,-11} {5,-16}\n", "Region", "Name", "Root", "Time", "Reqs/min", "AgentUpdates"); 616 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", "Region", "Name", "Root", "Time", "Reqs/min", "AgentUpdates");
616
617 foreach (Scene scene in m_scenes.Values) 617 foreach (Scene scene in m_scenes.Values)
618 { 618 {
619 scene.ForEachClient( 619 scene.ForEachClient(
@@ -633,10 +633,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
633 else 633 else
634 childAgentStatus = "Off!"; 634 childAgentStatus = "Off!";
635 635
636 int agentUpdates = 0; 636 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}",
637 cinfo.SyncRequests.TryGetValue("AgentUpdate", out agentUpdates);
638
639 report.AppendFormat("{0,-30} {1,-30} {2,-6} {3,-11} {4,-11} {5,-16}\n",
640 scene.RegionInfo.RegionName, llClient.Name, 637 scene.RegionInfo.RegionName, llClient.Name,
641 childAgentStatus, 638 childAgentStatus,
642 (DateTime.Now - cinfo.StartedTime).Minutes, 639 (DateTime.Now - cinfo.StartedTime).Minutes,
@@ -644,12 +641,11 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
644 string.Format( 641 string.Format(
645 "{0} ({1:0.00}%)", 642 "{0} ({1:0.00}%)",
646 llClient.TotalAgentUpdates, 643 llClient.TotalAgentUpdates,
647 ((float)agentUpdates) / llClient.TotalAgentUpdates * 100)); 644 (float)cinfo.SyncRequests["AgentUpdate"] / llClient.TotalAgentUpdates * 100));
648 } 645 }
649 }); 646 });
650 } 647 }
651 648 return string.Empty;
652 return report.ToString();
653 } 649 }
654 650
655 string fname = "", lname = ""; 651 string fname = "", lname = "";
@@ -668,7 +664,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
668 { 664 {
669 LLClientView llClient = client as LLClientView; 665 LLClientView llClient = client as LLClientView;
670 666
671 if (llClient.Name.ToLower() == (fname + " " + lname).ToLower()) 667 if (llClient.Name == fname + " " + lname)
672 { 668 {
673 669
674 ClientInfo cinfo = llClient.GetClientInfo(); 670 ClientInfo cinfo = llClient.GetClientInfo();
@@ -677,42 +673,41 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
677 aCircuit = new AgentCircuitData(); 673 aCircuit = new AgentCircuitData();
678 674
679 if (!llClient.SceneAgent.IsChildAgent) 675 if (!llClient.SceneAgent.IsChildAgent)
680 report.AppendFormat("{0} # {1} # {2}\n", llClient.Name, Util.GetViewerName(aCircuit), aCircuit.Id0); 676 m_log.InfoFormat("[INFO]: {0} # {1} # {2}", llClient.Name, Util.GetViewerName(aCircuit), aCircuit.Id0);
681 677
682 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum(); 678 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum();
683 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1); 679 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1);
684 680
685 report.AppendLine(); 681 m_log.InfoFormat("[INFO]:");
686 report.AppendFormat("{0} # {1} # Time: {2}min # Avg Reqs/min: {3}\n", scene.RegionInfo.RegionName, 682 m_log.InfoFormat("[INFO]: {0} # {1} # Time: {2}min # Avg Reqs/min: {3}", scene.RegionInfo.RegionName,
687 (llClient.SceneAgent.IsChildAgent ? "Child" : "Root"), (DateTime.Now - cinfo.StartedTime).Minutes, avg_reqs); 683 (llClient.SceneAgent.IsChildAgent ? "Child" : "Root"), (DateTime.Now - cinfo.StartedTime).Minutes, avg_reqs);
688 684
689 Dictionary<string, int> sortedDict = (from entry in cinfo.AsyncRequests orderby entry.Value descending select entry) 685 Dictionary<string, int> sortedDict = (from entry in cinfo.AsyncRequests orderby entry.Value descending select entry)
690 .ToDictionary(pair => pair.Key, pair => pair.Value); 686 .ToDictionary(pair => pair.Key, pair => pair.Value);
691 PrintRequests(report, "TOP ASYNC", sortedDict, cinfo.AsyncRequests.Values.Sum()); 687 PrintRequests("TOP ASYNC", sortedDict, cinfo.AsyncRequests.Values.Sum());
692 688
693 sortedDict = (from entry in cinfo.SyncRequests orderby entry.Value descending select entry) 689 sortedDict = (from entry in cinfo.SyncRequests orderby entry.Value descending select entry)
694 .ToDictionary(pair => pair.Key, pair => pair.Value); 690 .ToDictionary(pair => pair.Key, pair => pair.Value);
695 PrintRequests(report, "TOP SYNC", sortedDict, cinfo.SyncRequests.Values.Sum()); 691 PrintRequests("TOP SYNC", sortedDict, cinfo.SyncRequests.Values.Sum());
696 692
697 sortedDict = (from entry in cinfo.GenericRequests orderby entry.Value descending select entry) 693 sortedDict = (from entry in cinfo.GenericRequests orderby entry.Value descending select entry)
698 .ToDictionary(pair => pair.Key, pair => pair.Value); 694 .ToDictionary(pair => pair.Key, pair => pair.Value);
699 PrintRequests(report, "TOP GENERIC", sortedDict, cinfo.GenericRequests.Values.Sum()); 695 PrintRequests("TOP GENERIC", sortedDict, cinfo.GenericRequests.Values.Sum());
700 } 696 }
701 } 697 }
702 }); 698 });
703 } 699 }
704 700 return string.Empty;
705 return report.ToString();
706 } 701 }
707 702
708 private void PrintRequests(StringBuilder report, string type, Dictionary<string, int> sortedDict, int sum) 703 private void PrintRequests(string type, Dictionary<string, int> sortedDict, int sum)
709 { 704 {
710 report.AppendLine(); 705 m_log.InfoFormat("[INFO]:");
711 report.AppendFormat("{0,25}\n", type); 706 m_log.InfoFormat("[INFO]: {0,25}", type);
712 foreach (KeyValuePair<string, int> kvp in sortedDict.Take(12)) 707 foreach (KeyValuePair<string, int> kvp in sortedDict.Take(12))
713 report.AppendFormat("{0,25} {1,-6}\n", kvp.Key, kvp.Value); 708 m_log.InfoFormat("[INFO]: {0,25} {1,-6}", kvp.Key, kvp.Value);
714 report.AppendFormat("{0,25}\n", "..."); 709 m_log.InfoFormat("[INFO]: {0,25}", "...");
715 report.AppendFormat("{0,25} {1,-6}\n", "Total", sum); 710 m_log.InfoFormat("[INFO]: {0,25} {1,-6}", "Total", sum);
716 } 711 }
717 } 712 }
718} 713}