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;
}
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.
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 przezHZ
, podczas gdy dokumentacja stwierdza, że jest wUSER_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?
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.
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!
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