Почему /proc/stat считает более 100 тиков/с?

Вот решение с cutи paste. Поскольку у вас нет разделителя, такого как пробел или табулятор, требуется некоторое исправление с помощьюsed:

for COL in {1..5}; do cut -c $COL < infile | paste -s -d_ ; done | sed -e 's/__/_ /g' -e 's/_//g'

Здесь разбито на многострочное:

for COL in {1..5}; do
  cut -c $COL < infile | paste -s -d_
done | sed -e 's/__/_ /g' -e 's/_//g'

Вывод первой части выглядит так:

for COL in {1..5}; do cut -c $COL < infile | paste -s -d_ ; done

a_f_k_o
b_g_l_p
c_h_m_q
d_i_n_r
e_j__s

Раздражает то, что перед запуском нужно знать, сколько столбцов имеется.

2
08.08.2019, 12:35
1 ответ

Основная проблема заключается в используемом вами сценарии. Переключение контекста очень затратно с точки зрения задержки. sleep 1переводит ваш скрипт в спящий режим. когда таймер заканчивается, процесс снова становится работоспособным, возможно, он также перераспределяется на другое ядро ​​вашего процессора (миграция ). Таким образом, в основном вы не опрашиваете /proc/statровно каждые 1000 мс, насколько вы можете указать это в своем сообщении.

Между прочим, это не очень хороший способ оценить ядро ​​RT.

Я действительно предлагаю вам использовать, например, sysjitterот Solarflare sysjitter openonload , который даст вам гораздо лучшие показатели того, как работает ядро.

Основная идея состоит в том, чтобы иметь бесконечный цикл, закрепленный на одном ядре (1 работающий поток на ядро ​​), который объединяет счетчик отметок времени (TSC )регистр ядра и сравнивает два следующих значения чтобы увидеть разницу, которая может происходить каждый раз, когда ядро ​​вытесняет запущенный процесс (предположительно 100 Гц ).

Таким образом, вы получите лучшее представление о системном джиттере вашего сервера и, возможно, решите немного больше его настроить.

Также вам следует обратить внимание на изоляцию процессора, чтобы иметь выделенное ядро ​​​​для вашего приложения и динамическую конфигурацию ядра, если ваш вариант использования требует такого улучшения.

Редактировать :Я предлагаю вам использовать awkтолько для всех ваших нужд с таким небольшим скриптом, как этот:

#!/usr/bin/awk 

BEGIN { 
    sum1=0;
    sum2=0;
    result=0;
    file="/proc/stat";



while (( getline < file ) > 0 ) {
    if ($1=="cpu1"){ sum1=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11 }; 
    } 
    close(file) ;
    print  "firt time " sum1;
    system("sleep 10");

while (( getline < file ) > 0 ) {
        if ($1=="cpu1") { sum2=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11 }
    }
    close (file)
    print "secont time " sum2;
    result=sum2-sum1;
    print "sum is " result/10;
}

Эта выборка выполняется в течение 10 секунд, а результат делится на десять, чтобы получить среднее время для сегментов длительностью 1 с.

0
27.01.2020, 22:24

Теги

Похожие вопросы