Я пытаюсь написать скрипт на C # для расчета загрузки процессора сервером. Для этого я использую 'cat / proc / stat', а затем следую этому руководству: как рассчитать загрузку процессора .
Сначала мне нужно выяснить cpu_total_time
и cpu_idle_time
, а затем вычислить
cpu_usage_time = (cpu_total_time - cpu_idle_time) / cpu_total_time * delta
, где дельта - это разница между показаниями, содержащимися в cpu_old
и cpu_new
в секундах.
Мой сценарий таков:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Threading.Tasks;
class Program
{
public static void Main()
{
float delta = 300;
string cpu_old = @"cpu 434473062 3549 100174857 65243175066 2350230 0 23538998 0 0 0
cpu0 40363141 158 9961795 4046071159 14998 0 2151386 0 0 0
cpu1 43114169 130 9906697 4044059231 14821 0 2322581 0 0 0
cpu2 46217091 118 10451188 4043699342 14271 0 2530557 0 0 0
cpu3 46520571 95 10394572 4046346748 12427 0 2533812 0 0 0
cpu4 44400015 73 9822374 4051834091 8572 0 2383614 0 0 0
cpu5 41373066 95 9107815 4057879672 9063 0 2207833 0 0 0
cpu6 40070307 94 8892688 4060344982 15899 0 2174872 0 0 0
cpu7 39194082 109 8715754 4062643570 14710 0 2110436 0 0 0
cpu8 14996205 327 3564661 4099822309 14742 0 840150 0 0 0
cpu9 12736725 346 3132467 4102694576 12765 0 715207 0 0 0
cpu10 10787760 349 2569831 4105053050 11834 0 587924 0 0 0
cpu11 10278285 269 2568664 4105585391 5650 0 550660 0 0 0
cpu12 9466026 331 2448787 4104518475 2159416 0 514311 0 0 0
cpu13 9650748 328 2437976 4106764105 10611 0 516373 0 0 0
cpu14 10903552 332 2733229 4105176301 12290 0 600582 0 0 0
cpu15 14401310 386 3466350 4100682055 18153 0 798693 0 0 0";
// Counting the number of lines the cpu_old variable has (number of CPU cores)
int numLines = cpu_old.Split('\n').Length;
// Creating a 2-D array from the input string
var cpu_usage_old = cpu_old.Split('\n').Select(x => x.Replace("cpu ","").Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)).ToArray();
string cpu_new = @"cpu 434474592 3549 100175256 65244055979 2350259 0 23539065 0 0 0
cpu0 40363255 158 9961820 4046126195 14998 0 2151391 0 0 0
cpu1 43114268 130 9906722 4044114283 14821 0 2322584 0 0 0
cpu2 46217222 118 10451220 4043754354 14271 0 2530564 0 0 0
cpu3 46520645 95 10394592 4046401839 12427 0 2533813 0 0 0
cpu4 44400082 73 9822391 4051889189 8572 0 2383616 0 0 0
cpu5 41373168 95 9107845 4057934721 9063 0 2207838 0 0 0
cpu6 40070438 94 8892720 4060399997 15899 0 2174878 0 0 0
cpu7 39194253 109 8715790 4062698541 14710 0 2110444 0 0 0
cpu8 14996240 327 3564671 4099877456 14742 0 840151 0 0 0
cpu9 12737022 346 3132532 4102749364 12765 0 715223 0 0 0
cpu10 10787804 349 2569845 4105108184 11834 0 587924 0 0 0
cpu11 10278327 269 2568684 4105640505 5650 0 550661 0 0 0
cpu12 9466052 331 2448797 4104573595 2159444 0 514312 0 0 0
cpu13 9650910 328 2438016 4106819087 10611 0 516382 0 0 0
cpu14 10903566 332 2733236 4105231472 12290 0 600582 0 0 0
cpu15 14401335 386 3466367 4100737188 18153 0 798694 0 0 0";
var cpu_usage_new = cpu_new.Split('\n').Select(x => x.Replace("cpu ","").Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)).ToArray();
var cpuUsage = new List<int>();
foreach (var idx in Enumerable.Range(0, numLines))
{
int cpu_time_old = cpu_usage_old[idx, 0] + cpu_usage_old[idx][1] + cpu_usage_old[idx][2] + cpu_usage_old[idx][3] + cpu_usage_old[idx][4] + cpu_usage_old[idx][5] + cpu_usage_old[idx][6] + cpu_usage_old[idx][7];
}
}
}
Как вы можете видеть, я только что попытался вычислить cpu_usage_old
здесь, но остальное было бы более или менее прямым-вперед. Я вижу два возможных решения моей проблемы:
- Преобразование всех элементов двумерных массивов
cpu_usage_new
и cpu_usage_old
в целые числа во время создания и последующей работы со столбцами матрицы,вместо запуска цикла for. А затем добавьте значение в новый столбец того же 2D-массива. - Преобразуйте элементы во время суммирования / вычитания в цикле for, но это будет длинный и не очень элегантный способ решения проблемы. Затем я могу добавить все результаты в список
cpuUsage
, где каждое значение будет отображать использование ЦП данного ядра ЦП за указанный период времени delta
.