/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using Log = QuantConnect.Logging.Log; namespace QuantConnect { /// /// Operating systems class for managing anything that is operation system specific. /// /// Good design should remove the need for this function. Over time it should disappear. public static class OS { private static PerformanceCounter _cpuUsageCounter; /// /// Global Flag :: Operating System /// public static bool IsLinux { get { var p = (int)Environment.OSVersion.Platform; return (p == 4) || (p == 6) || (p == 128); } } /// /// Global Flag :: Operating System /// public static bool IsWindows => !IsLinux; /// /// Character Separating directories in this OS: /// public static string PathSeparation => Path.DirectorySeparatorChar.ToString(); /// /// Get the drive space remaining on windows and linux in MB /// public static long DriveSpaceRemaining { get { var d = GetDrive(); return d.AvailableFreeSpace / (1024 * 1024); } } /// /// Get the drive space remaining on windows and linux in MB /// public static long DriveSpaceUsed { get { var d = GetDrive(); return (d.TotalSize - d.AvailableFreeSpace) / (1024 * 1024); } } /// /// Total space on the drive /// public static long DriveTotalSpace { get { var d = GetDrive(); return d.TotalSize / (1024 * 1024); } } /// /// Get the drive. /// /// private static DriveInfo GetDrive() { var assembly = Assembly.GetExecutingAssembly(); var drive = Path.GetPathRoot(assembly.Location); return new DriveInfo(drive); } /// /// Gets the amount of private memory allocated for the current process (includes both managed and unmanaged memory). /// public static long ApplicationMemoryUsed { get { var proc = Process.GetCurrentProcess(); return proc.PrivateMemorySize64 / (1024 * 1024); } } /// /// Get the RAM used on the machine: /// public static long TotalPhysicalMemoryUsed => GC.GetTotalMemory(false) / (1024 * 1024); /// /// Total CPU usage as a percentage /// public static decimal CpuUsage { get { if (_cpuUsageCounter == null) { try { _cpuUsageCounter = new PerformanceCounter( "Process", "% Processor Time", IsWindows ? Process.GetCurrentProcess().ProcessName : Process.GetCurrentProcess().Id.ToString()); } catch (Exception exception) { Log.Error(exception); return 0; } } return (decimal) _cpuUsageCounter.NextValue(); } } /// /// Gets the statistics of the machine, including CPU% and RAM /// public static Dictionary GetServerStatistics() { return new Dictionary { { "CPU Usage", CpuUsage.ToString("0.0") + "%" }, { "Used RAM (MB)", TotalPhysicalMemoryUsed.ToString() }, { "Total RAM (MB)", "" }, { "Used Disk Space (MB)", DriveSpaceUsed.ToString() }, { "Total Disk Space (MB)", DriveTotalSpace.ToString() }, { "Hostname", Environment.MachineName }, { "LEAN Version", "v" + Globals.Version } }; } } }