iostat -x
(Saya menggunakan kode sumber versi lama untuk menulis ini sebelum menyadarinya) menampilkan informasi dari /proc/diskstats
(didokumentasikan di sini) dan /proc/stat
(untuk waktu CPU; lihat man proc(5)) (dan beberapa lainnya, tapi itu tidak penting untuk dipahami).
Anda dapat melihat cuplikan kode yang relevan dalam jawaban osgx, tetapi saya tidak dapat memahaminya secara terpisah, jadi inilah penjelasan yang diperluas:
%util = blkio.ticks / deltams * 100%
deltams
adalah waktu berlalu sejak snapshot terakhir di ms. Ini menggunakan statistik CPU dari/proc/stat
mungkin karena memberikan hasil yang lebih baik daripada mengandalkan waktu sistem, tapi saya tidak tahu pasti. (Catatan:untuk beberapa alasan waktunya dibagi denganHZ
, sementara dokumentasi menyatakannya diUSER_HZ
, saya tidak mengerti itu.)-
blkio.ticks
adalah "# dari milidetik yang dihabiskan untuk melakukan I/O", dari/proc/diskstats
dokumen: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.
yaitu pemahaman saya adalah bahwa
ticks
adalah jumlah tick saat permintaan I/O (untuk perangkat ini) sedang berlangsung dikalikan dengan durasi antara tick.
Jadi %util = 100%
berarti bahwa setiap kali kernel melihat (saya kira 1000 kali per detik pada kernel modern, lihat "HZ"), permintaan I/O sedang berlangsung.
Berikut kutipan dari pos lain di iostat:
[%util is] berapa lama perangkat penyimpanan memiliki pekerjaan luar biasa (sibuk).
Dalam lingkungan RAID yang tepat, ini lebih seperti "berapa banyak waktu yang harus dilakukan setidaknya satu disk dalam larik RAID". Saya sengaja mengecualikan segala jenis cache di sini – jika permintaan dapat dilayani dari cache, kemungkinannya sangat kecil sehingga akan muncul di %util, tidak seperti nilai lainnya.
Apa artinya ini juga – subsistem RAID dapat dimuat dari 6,25% (satu disk melakukan pekerjaan) hingga 100% (semuanya sibuk). Wawasan yang cukup banyak dalam nilai tunggal ’100%’, bukan?
%util
dinamai busy dalam kode sumber iostat:https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380
Sibuk dihitung sebagai persentase rasio Ticks
ke deltams
, terbatas hingga 100%
busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;
DeltaMS adalah jumlah beban sistem untuk jangka waktu tertentu (waktu pengguna + waktu sistem + waktu idle + 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;
Kutu - adalah Time of requests in queue
untuk periode tersebut
blkio.ticks = new_blkio[p].ticks
- old_blkio[p].ticks;
Dalam versi sysstat yang lebih baru, kodenya sedikit berbeda: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 diisi dengan 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);
Dan ada isian tot_ticks dari 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
dibaca dari "sysfs stat untuk perangkat blok atau partisi saat ini " di read_sysfs_file_stat
(iostat.c:487), dan ioi
dan ioj
adalah stat saat ini dan sebelumnya.