2010-12-16 3 views
14
iostat -x -d 

может отображать информацию о статистике ввода/вывода. Для Util из IOSTAT, объяснение:Как рассчитывается использование iostat?

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

Я хочу знать, как был рассчитан утилита?

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

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; 
} 
+0

Формат полностью изменен, переполнение должно улучшить редактор. – Raymond 2010-12-16 06:52:45

+0

переполнение на помощь! Улучшение сделано! – zengr 2010-12-16 06:56:18

+0

либо посмотрите на изменения, которые @zengr любезно предоставил на ваш вопрос, либо прочитайте справку по форматированию: http://stackoverflow.com/editing-help – 2010-12-16 07:02:44

ответ

17

%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 is su м загрузки системы за период времени (пользовательское время + системное время + время простоя + 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 стат для текущего устройства блока или раздела" в read_sysfs_file_stat (iostat.c:487), и ioi и ioj являются текущий и предыдущий stat.

8

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

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

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

    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 раз в секунду на современных ядрах, см «ХЗ»), запрос ввода/вывода был в стадии разработки.

Вот отрывок из another post on iostat:

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

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

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

2

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

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

iostat -x. 

Try:

iostat -dmx 1 5 

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

0

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

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

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

Я не читать код , но, очевидно, менее чем на 1 чтение или запись в секунду, это не так сильно загружает диски!

Смежные вопросы