Как вычисляется утилита iostat? - PullRequest
15 голосов
/ 16 декабря 2010
iostat -x -d 

может отображать множество статистических данных ввода / вывода.Для утилиты iostat объяснение таково:

Процент процессорного времени, в течение которого запросы ввода-вывода были отправлены устройству (использование ширины полосы для устройства).Насыщение устройства происходит, когда это значение близко к 100%

Я хочу знать, как вычисляется значение util?

Я провожу эксперимент (см. Следующий код), запускаю 40 потоков, чтобы случайным образом прочитать 40 файлов.Я полагаю, что диск утилита должна быть очень высокой, но я не прав, iostat как следует, кто-нибудь может дать почему?THX

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdb1              0.01     0.44  0.24  0.57     3.44     8.14    14.34     0.00    2.28   0.66   0.05

Код:

#include <iostream>
#include <fstream>
#include <pthread.h>

using namespace std;

void* work(void* a)
{
    int* id = (int*)a;
    string file = "sys.partition";
    char buf[100];
    sprintf(buf, "%d", *id);
    file.append(string(buf));
    ifstream in(file.c_str());
    in.seekg(0, ios_base::end);
    size_t len = in.tellg();

    cout << "open file : " << file << " , " << len << endl;
    srand(time(NULL));

    while(true)
    {
        size_t pos = rand() % len;
        in.seekg(pos);
        //cout << pos << endl;
        in.read(buf, 10);
        system("sync");
    }
    in.close();
}

int main(int argc, char** argv)
{
    static const int num = 40;
    pthread_t threads[num];
    for (int i = 0; i < num; i++)       {
        pthread_create(&threads[i], NULL, work, &i);
    }
    for (int i = 0; i < num; i++)       {
        pthread_join(threads[i], NULL);
    }
    return 0;
}

Ответы [ 4 ]

20 голосов
/ 25 декабря 2010

%util названо занято в исходном коде iostat: https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380

Занят, считается как процентное отношение Ticks к deltams, ограничено 100%

busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;

DeltaMS - это сумма системной нагрузки за период времени (пользовательское время + системное время + время простоя + iowait) / ncpu.

double deltams = 1000.0 *
        ((new_cpu.user + new_cpu.system +
          new_cpu.idle + new_cpu.iowait) -
         (old_cpu.user + old_cpu.system +
          old_cpu.idle + old_cpu.iowait)) / ncpu / HZ;

Тики - это Time of requests in queue за период

blkio.ticks = new_blkio[p].ticks
                - old_blkio[p].ticks;

В более новой версии sysstat код немного отличается: http://sources.debian.net/src/sysstat/10.2.0-1/iostat.c#L959

/*       rrq/s wrq/s   r/s   w/s  rsec  wsec  rqsz  qusz await r_await w_await svctm %util */
printf(" %8.2f %8.2f %7.2f %7.2f %8.2f %8.2f %8.2f %8.2f %7.2f %7.2f %7.2f %6.2f %6.2f\n",
...
       /*
        * Again: Ticks in milliseconds.
        * In the case of a device group (option -g), shi->used is the number of
        * devices in the group. Else shi->used equals 1.
        */
       shi->used ? xds.util / 10.0 / (double) shi->used
                 : xds.util / 10.0);    /* shi->used should never be null here */

xds заполняется в compute_ext_disk_stats(&sdc, &sdp, itv, &xds); http://sources.debian.net/src/sysstat/10.2.0-1/common.c?hl=679#L679

/*
 * Macros used to display statistics values.
 *
 * HZ is 1024 on IA64 and % should be normalized to 100.
 */
#define S_VALUE(m,n,p)  (((double) ((n) - (m))) / (p) * HZ)

xds->util  = S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv);

А есть заполнение tot_ticks от iostat.c

  * @ioi        Current sample statistics.
  * @ioj        Previous sample statistics.
  * @itv        Interval of time.
  ...

sdc.tot_ticks = ioi->tot_ticks;
sdp.tot_ticks = ioj->tot_ticks;

tot_ticks считываются из " sysfs stat для текущего блочного устройства или раздела " в read_sysfs_file_stat ( iostat.c: 487 ), а также ioi и ioj текущая и предыдущая статистика.

9 голосов
/ 15 декабря 2011

iostat -x (я использовал старый исходный код , чтобы записать это до того, как осознал) отображает информацию из /proc/diskstats (задокументировано здесь ) и /proc/stat (для процессора времена; см. man proc (5) ) (и несколько других, но это не важно для понимания).

Вы можете увидеть соответствующие фрагменты кода в ответе osgx, но я не смог разобраться в них в отдельности, поэтому вот расширенное объяснение:

  • %util = blkio.ticks / deltams * 100%
  • deltams - время, прошедшее с момента последнего снимка в мс. Он использует статистику процессора от /proc/stat, предположительно, потому что он дает лучшие результаты, чем полагаться на системное время, но я точно не знаю. (Примечание: по какой-то причине время делится на HZ, в то время как в документации указано, что оно в USER_HZ, я этого не понимаю.)
  • blkio.ticks - это "количество миллисекунд, потраченных на ввод / вывод", от /proc/diskstats документов :

    Field  9 -- # of I/Os currently in progress
      The only field that should go to zero. Incremented as requests are
      given to appropriate struct request_queue and decremented as they finish.
    Field 10 -- # of milliseconds spent doing I/Os
      This field increases so long as field 9 is nonzero.
    

    т.е. Насколько я понимаю, ticks - это количество тактов, когда выполнялся какой-либо запрос ввода-вывода (для этого устройства), умноженное на длительность между тактами.

Таким образом, %util = 100% означает, что каждый раз, когда ядро ​​смотрело (я думаю, это 1000 раз в секунду на современных ядрах, см. "HZ"), выполнялся запрос ввода-вывода.

Вот выдержка из другого поста на iostat :

[% util is] сколько времени устройство хранения выполняло выдающуюся работу (было занято).

В правильных средах RAID это больше похоже на то, «сколько времени хотя бы одному диску в RAID-массиве нужно было что-то делать». Я намеренно исключаю любой тип кеша здесь - если запрос можно обслуживать из кеша, вероятность того, что он будет отображаться в% util, ничтожно мала, в отличие от других значений.

Что это также означает - подсистема RAID может быть загружена с 6,25% (один диск выполняет работу) до 100% (все они заняты). Это достаточно много для понимания единственного значения «100%», не так ли?

2 голосов
/ 25 апреля 2013

Согласно справочной странице, первая строка результатов iostat - это среднее значение с момента загрузки системы.

Из моих тестов, похоже, это относится и к единственной строке, если она называется, например,

iostat -x.

Попробуйте:

iostat -dmx 1 5

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

1 голос
/ 17 июня 2013

% util означает, сколько времени потрачено на запись / чтение за единицу времени, вы можете вычислить его из среднего времени обслуживания:

svctm  * (  r/s + w/s )  /1000 
= 0.66 *(0.24 + 0.57) /1000
= 0.0005346 

, следовательно, 0,05%

У меня нетчитайте ваш код, но, очевидно, со скоростью менее 1 чтения или записи в секунду он не загружает диски слишком много!

...