private void OnPerformanceTimerCallback(object state) { var nodeStatus = new NodeStatus(); StatusInfoCollection bootstrapStatus = new StatusInfoCollection(); m_Helper.Collect(bootstrapStatus); nodeStatus.BootstrapStatus = bootstrapStatus; var instancesStatus = new List<StatusInfoCollection>(m_AppServers.Length); var perfBuilder = new StringBuilder(); perfBuilder.AppendLine("---------------------------------------------------"); perfBuilder.AppendLine(string.Format("CPU Usage: {0:0.00}%, Physical Memory Usage: {1:N}, Total Thread Count: {2}", bootstrapStatus[StatusInfoKeys.CpuUsage], bootstrapStatus[StatusInfoKeys.MemoryUsage], bootstrapStatus[StatusInfoKeys.TotalThreadCount])); perfBuilder.AppendLine(string.Format("AvailableWorkingThreads: {0}, AvailableCompletionPortThreads: {1}", bootstrapStatus[StatusInfoKeys.AvailableWorkingThreads], bootstrapStatus[StatusInfoKeys.AvailableCompletionPortThreads])); perfBuilder.AppendLine(string.Format("MaxWorkingThreads: {0}, MaxCompletionPortThreads: {1}", bootstrapStatus[StatusInfoKeys.MaxWorkingThreads], bootstrapStatus[StatusInfoKeys.MaxCompletionPortThreads])); for (var i = 0; i < m_AppServers.Length; i++) { var s = m_AppServers[i]; var metadata = m_ServerStatusMetadataSource[i + 1].Value; if (metadata == null) { perfBuilder.AppendLine(string.Format("{0} ----------------------------------", s.Name)); perfBuilder.AppendLine(string.Format("{0}: {1}", "State", s.State)); } else { var serverStatus = s.CollectServerStatus(bootstrapStatus); instancesStatus.Add(serverStatus); perfBuilder.AppendLine(string.Format("{0} ----------------------------------", serverStatus.Tag)); for (var j = 0; j < metadata.Length; j++) { var statusInfoAtt = metadata[j]; if (!statusInfoAtt.OutputInPerfLog) continue; var statusValue = serverStatus[statusInfoAtt.Key]; if (statusValue == null) continue; perfBuilder.AppendLine( string.Format("{0}: {1}", statusInfoAtt.Name, string.IsNullOrEmpty(statusInfoAtt.Format) ? statusValue : string.Format(statusInfoAtt.Format, statusValue))); } } } m_PerfLog.Info(perfBuilder.ToString()); nodeStatus.InstancesStatus = instancesStatus.ToArray(); if (OnStatusUpdate != null) OnStatusUpdate(nodeStatus); if (m_ServerManager != null && m_ServerManager.State == ServerState.Running) { m_ServerManager.TransferSystemMessage("ServerStatusCollected", nodeStatus); } }
private void OnPerformanceTimerCallback(object state) { var nodeStatus = new NodeStatus(); int availableWorkingThreads, availableCompletionPortThreads; ThreadPool.GetAvailableThreads(out availableWorkingThreads, out availableCompletionPortThreads); int maxWorkingThreads; int maxCompletionPortThreads; ThreadPool.GetMaxThreads(out maxWorkingThreads, out maxCompletionPortThreads); StatusInfoCollection bootstrapStatus = null; var retry = false; while(true) { try { bootstrapStatus = new StatusInfoCollection(); bootstrapStatus[StatusInfoKeys.AvailableWorkingThreads] = availableWorkingThreads; bootstrapStatus[StatusInfoKeys.AvailableCompletionPortThreads] = availableCompletionPortThreads; bootstrapStatus[StatusInfoKeys.MaxCompletionPortThreads] = maxCompletionPortThreads; bootstrapStatus[StatusInfoKeys.MaxWorkingThreads] = maxWorkingThreads; bootstrapStatus[StatusInfoKeys.TotalThreadCount] = (int)m_ThreadCountPC.NextValue(); bootstrapStatus[StatusInfoKeys.CpuUsage] = m_CpuUsagePC.NextValue() / m_CpuCores; bootstrapStatus[StatusInfoKeys.WorkingSet] = (long)m_WorkingSetPC.NextValue(); nodeStatus.BootstrapStatus = bootstrapStatus; break; } catch (InvalidOperationException e) { //Only re-get performance counter one time if (retry) throw e; //Only re-get performance counter for .NET/Windows if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX || Platform.IsMono) throw e; //If a same name process exited, this process's performance counters instance name could be changed, //so if the old performance counter cannot be access, get the performance counter's name again var newInstanceName = GetPerformanceCounterInstanceName(Process.GetCurrentProcess()); SetupPerformanceCounters(newInstanceName); retry = true; } } var instancesStatus = new List<StatusInfoCollection>(m_AppServers.Length); var perfBuilder = new StringBuilder(); perfBuilder.AppendLine("---------------------------------------------------"); perfBuilder.AppendLine(string.Format("CPU Usage: {0:0.00}%, Physical Memory Usage: {1:N}, Total Thread Count: {2}", bootstrapStatus[StatusInfoKeys.CpuUsage], bootstrapStatus[StatusInfoKeys.WorkingSet], bootstrapStatus[StatusInfoKeys.TotalThreadCount])); perfBuilder.AppendLine(string.Format("AvailableWorkingThreads: {0}, AvailableCompletionPortThreads: {1}", bootstrapStatus[StatusInfoKeys.AvailableWorkingThreads], bootstrapStatus[StatusInfoKeys.AvailableCompletionPortThreads])); perfBuilder.AppendLine(string.Format("MaxWorkingThreads: {0}, MaxCompletionPortThreads: {1}", bootstrapStatus[StatusInfoKeys.MaxWorkingThreads], bootstrapStatus[StatusInfoKeys.MaxCompletionPortThreads])); for (var i = 0; i < m_AppServers.Length; i++) { var s = m_AppServers[i]; var metadata = m_ServerStatusMetadatas[i]; if (s is IsolationAppServer) { var newMetadata = s.GetServerStatusMetadata(); if (newMetadata != metadata) { m_ServerStatusMetadatas[i] = newMetadata; metadata = newMetadata; } } if (metadata == null) { perfBuilder.AppendLine(string.Format("{0} ----------------------------------", s.Name)); perfBuilder.AppendLine(string.Format("{0}: {1}", "IsRunning", s.State == ServerState.Running)); } else { var serverStatus = s.CollectServerStatus(bootstrapStatus); instancesStatus.Add(serverStatus); perfBuilder.AppendLine(string.Format("{0} ----------------------------------", serverStatus.Tag)); for (var j = 0; j < metadata.Length; j++) { var statusInfoAtt = metadata[j]; if (!statusInfoAtt.OutputInPerfLog) continue; var statusValue = serverStatus[statusInfoAtt.Key]; if (statusValue == null) continue; perfBuilder.AppendLine( string.Format("{0}: {1}", statusInfoAtt.Name, string.IsNullOrEmpty(statusInfoAtt.Format) ? statusValue : string.Format(statusInfoAtt.Format, statusValue))); } } } m_PerfLog.Info(perfBuilder.ToString()); try { nodeStatus.Save(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "status.bin")); } catch (Exception e) { m_PerfLog.Error(e); } }