Jak obliczany jest util iostat?

iostat -x -d 

Może wyświetlać wiele informacji statystycznych we/wy. Dla util iostat Wyjaśnienie jest następujące:

Procent czasu procesora, podczas którego żądania wejścia / wyjścia były wysyłane do urządzenia (wykorzystanie szerokości pasma dla urządzenia). Nasycenie urządzenia występuje, gdy wartość ta jest bliska 100%

Chcę wiedzieć, jak obliczono util?

Robię eksperyment (patrz poniższy kod), uruchamiam 40 wątków, aby losowo odczytać 40 plików. Przypuszczam, że dysk util powinien być bardzo wysoki, ale Mylę się., iostat jest następujący, każdy może podać dlaczego? 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

Kod:

#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;
}
Author: osgx, 2010-12-16

4 answers

%util jest nazwany busy w kodzie źródłowym iostat: https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380

Busy jest liczony jako procentowy stosunek Ticks do deltams, ograniczony do 100%

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

DeltaMS jest sumą obciążenia systemu dla okresu czasu (user time + system time + idle time + 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;

Kleszcze-jest Time of requests in queue dla okresu

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

W bardziej aktualnej wersji sysstat kod jest bitowy różne: 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 jest wypełniony 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);

I jest wypełnienie tot_ticks z 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 są odczytywane z " sysfs stat dla bieżącego urządzenia blokowego lub partycji" W read_sysfs_file_stat (iostat.c: 487), i ioi i {[14] } są aktualne i poprzednie statystyki.

 17
Author: osgx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 23:43:01

iostat -x (do napisania tego użyłem starego kodu źródłowego) wyświetla informacje z /proc/diskstats (udokumentowane tutaj ) i /proc/stat (dla czasów procesora; patrz Man proc(5)) (i kilka innych, ale to nie jest ważne dla zrozumienia).

Możesz zobaczyć odpowiednie fragmenty kodu w odpowiedzi osgx, ale nie mogłem zrozumieć ich w izolacji, więc oto rozszerzone Wyjaśnienie:

  • %util = blkio.ticks / deltams * 100%
  • deltams jest czasem, jaki upłynął od ostatnia migawka w ms. wykorzystuje statystyki CPU z /proc/stat prawdopodobnie dlatego, że daje lepsze wyniki niż poleganie na czasie systemowym, ale nie wiem na pewno. (Uwaga na marginesie: z jakiegoś powodu czasy są podzielone przez HZ, podczas gdy dokumentacja stwierdza, że jest w USER_HZ, nie rozumiem tego.)
  • blkio.ticks jest "# milisekund spędzonych na I / Os", od /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.
    

    Tzn. rozumiem, że ticks jest liczbą kleszczy, gdy dowolne żądanie wejścia / wyjścia (dla tego urządzenie) był w toku pomnożony przez czas trwania między kleszczami.

Więc %util = 100% oznacza, że za każdym razem, gdy jądro patrzyło (myślę, że jest to 1000 razy na sekundę na nowoczesnych jądrach, patrz" HZ"), żądanie wejścia/wyjścia było w toku.

Oto fragment kolejny post na iostat :

[%util] ile czasu urządzenie pamięci masowej wykonało wybitną pracę (było zajęte).

W odpowiednich środowiskach RAID jest to bardziej jak " ile czasu zajęło w przynajmniej jeden dysk w macierzy RAID ma coś do zrobienia". Celowo wykluczam tutaj jakikolwiek rodzaj pamięci podręcznej – jeśli request może być obsługiwany z pamięci podręcznej, szansa jest znikoma, że pojawi się w % util, w przeciwieństwie do innych wartości.

Co to również oznacza-podsystem RAID może być załadowany z 6,25% (jeden dysk wykonujący pracę) do 100% (wszystkie zajęte). To dość dużo wglądu w pojedynczą wartość " 100%", prawda?

 8
Author: Nickolay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 21:14:49

Jak na stronie man, pierwsza linia wyników z iostat jest średnia od momentu uruchomienia systemu.

Z moich testów wynika, że dotyczy to również jedynej linii, jeśli nazywa się ją np. jako

iostat -x.

Try:

iostat -dmx 1 5

Da ci pięć linii z jedną sekundową różnicą między liniami. Odrzuć pierwszy, spójrz na inne, być może w ten sposób wyjście będzie miało więcej sensu.

 2
Author: Wences,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-31 21:08:16

%util oznacza ilość czasu spędzonego na pisaniu/czytaniu na jednostkę czasu, można obliczyć go ze średniego czasu obsługi:

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

Stąd 0,05%

Nie czytałem Twojego kodu, ale oczywiście przy mniej niż 1 odczycie lub zapisie na sekundę nie ładuje dysków tak bardzo!

 0
Author: phil_w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 17:11:21