CPU beklemede olan IO olduğunu nasıl biliyor?


17

iowaitAşağıda gösterildiği gibi üst yarar çıktısı gösterilen özelliği bakıyordum .

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait genellikle aşağıdaki gibi tanımlanır:

"CPU'nun boşta kaldığı zamandır ve beklemede olan bazı ES vardır."

Anladığım kadarıyla bir işlem tek bir CPU üzerinde yürütülüyor. Zaman aralığını kullandığından ya da bloke edildikten sonra programdan çıkarıldıktan sonra, tekrar herhangi bir CPU'da tekrar programlanabilir.

GÇ isteği durumunda, süreci kesintisiz olarak uyku moduna geçiren bir CPU, iowaitzamanı izlemekten sorumludur . Diğer CPU'lar, gerçekte boş oldukları için uçlarındaki boşta kalma süresi ile aynı zamanda rapor verecektir. Bu varsayım doğru mu?

Ayrıca, uzun bir G / Ç talebi olduğu varsayılarak (işlemin planlanmak için çeşitli fırsatlara sahip olduğu, ancak G / Ç tam olmadığı için planlanmadığı anlamına gelir), bir CPU "beklemede G / Ç" olduğunu nasıl bilebilir? Bu tür bilgiler nereden getiriliyor? Bir CPU, herhangi bir işlemin bir IO'nun tamamlanması için biraz zaman uyuduğunu nasıl öğrenebilir, çünkü CPU'lardan herhangi biri bu süreci uyku durumuna sokabilir. "Bekleyen ES" durumu nasıl doğrulanır?


3
Msgstr "Bir işlem tek bir CPU'da çalıştırılıyor". Pek sayılmaz. Bir iş parçacığı tek bir CPU çekirdeğinde çalıştırılır, ancak modern işlemlerin birden çok iş parçacığı vardır ve modern CPU'ların birden fazla çekirdeği vardır.
MSalters

@MSalters Ve o zaman bile, tek bir iş parçacığı herhangi bir zamanda yalnızca bir çekirdek üzerinde çalışabilirken, yürüttüğü çekirdek bağlam geçişlerinden sonra değişebilir.
JAB

1
Kesme isteği (IRQ) adı verilen bir şey var ama belki de ilgilendiğimizden daha fazla donanım.
mathreadler

Yanıtlar:


33

CPU bunların hiçbirini bilmiyor, görev zamanlayıcısı biliyor.

Alıntı yaptığınız tanım biraz yanıltıcıdır; geçerli procfs(5)kılavuzun uyarılarla birlikte daha doğru bir tanımı vardır:

iowait (Linux 2.5.41'den beri)

(5) G / Ç'nin tamamlanmasını bekleyen süre. Bu değer, aşağıdaki nedenlerle güvenilir değildir:

  1. CPU G / Ç'nin tamamlanmasını beklemez; iowaitgörevin G / Ç'nin tamamlanmasını beklediği zamandır. Bir CPU olağanüstü görev G / Ç'si için boşta durumuna geçtiğinde, bu CPU'da başka bir görev zamanlanır.

  2. Çok çekirdekli bir CPU'da, G / Ç'nin tamamlanmasını bekleyen görev herhangi bir CPU'da çalışmaz, bu nedenle iowaither CPU'nun hesaplanması zordur.

  3. Bu alandaki değer belirli koşullarda azalabilir.

iowaitG / Ç'yi beklemek için harcanan zamanı ölçmeye çalışır. Belirli bir CPU tarafından izlenmez ve ne de olabilir (yukarıdaki 2. nokta - merak ettiğiniz şeyle de eşleşir). Mümkün olduğunca CPU başına ölçülür .

Görev zamanlayıcı beklemede olan G / Ç olduğunu “bilir”, çünkü belirli bir görevi G / Ç'yi beklediğinden askıya aldığını bilir. Bu in_iowaitalandaki görev başına izlenir task_struct; nasıl ayarlandığını, izlendiğini ve temizlendiğini görmek in_iowaitiçin zamanlayıcı çekirdeğinde arama yapabilirsiniz . Brendan Gregg'in Linux yük ortalamaları hakkındaki son makalesinde yararlı arka plan bilgileri bulunmaktadır. iowaitGiriş /proc/statbiter nedir top, bir zamanlayıcı kene oluşturuyor olduğu zaman artırılır ve CPU “açık” cari işlem boşta olduğundan; Aradığınız da bunu görebilirsiniz account_idle_timeiçinde scheduler CPU zaman izleme kodunda .

Bu yüzden daha doğru bir tanım “bu CPU'da, yapılacak daha iyi bir şey olmadığı zaman, G / Ç'yi bekleyen zaman” olacaktır ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.