Soru Linux'ta, vmstat komutu ve / veya / proc / vmstat tarafından bildirilen sayfaların boyutu nedir?


Pek çok StackExchange ve diğer yerlerde belirtildiği gibi, Linux için tipik bir çekirdek / mmu sayfa boyutu 4 KiB'dir. OS / mimarimdeki durumun doğrulandığını doğruladım (RHEL 6.6, Intel Xeon E5-2690).

Şimdi diğer şeylerin yanı sıra vmstat -s önyükleme sırasında 0'dan başlayan sayıcılar olan "sayfalanmış sayfalar" ve "sayfalanmış" sayfalarında komut raporları. Herhangi bir anda, bu değerlerin, bu değerler için bulunan değerlere tam olarak eşit olduğunu doğruladım. pgpgin ve pgpgout girişler /proc/vmstat (vmstat komutu onları al /proc/vmstat?). Diğer komutlar ve özellikle sar -B rapor pgpgin/s ve pgpgout/s Kibibytes, belirli bir aralıkta saniyede giriş / çıkış olarak dizildi.

Son testlerde, bunu gördüm pgpgin/s ve pgpgout/s sar değerleri de, belirli bir aralık için vmstat değerlerinden hesaplanan bir hıza karşılık gelir. Bu, vmstat'ın boyut olarak 1 KiB'nin sayfalarını bildirdiği sonucuna varmamı sağladı. Böylece pgpgin/out değerleri /proc/vmstat önyüklemeden beri içeri / dışarı okunan KiB sayısıdır.

Benim sorularım:

  1. Bu geçerli bir sonuç mu?
  2. Öyleyse, işletim sistemi ve mimarinin "ortak para birimi" olan 4 KiB sayfası yerine vmstat ve diğer tesisler 1 KiB sayfalarında neden raporlanır? Özellikle, vmstat diyor ki "pages paged in/out", değil "KiBs paged in/out". Bu kafa karıştırıyor.

6
2017-10-16 09:25


Menşei


Yan not: 4 KiB gülünç derecede küçük bir sayfa boyutudur, bu yüzden daha az ve daha az “ortak” olmasını beklerim. - kubanczyk


Cevaplar:


İçindeki sayaçlar ile ilgili olarak /proc/vmstat Bu değerleri güncellemek için görünen işlev submit_bio içinde Linux/block/blk-core.c.

2067 blk_qc_t submit_bio(struct bio *bio)
2068 {
...
2079                         count = bio_sectors(bio);
2080 
2081                 if (op_is_write(bio_op(bio))) {
2082                         count_vm_events(PGPGOUT, count);
2083                 } else {
2084                         task_io_account_read(bio->bi_iter.bi_size);
2085                         count_vm_events(PGPGIN, count);
2086                 }
...
2100 }
2101 EXPORT_SYMBOL(submit_bio);

bio_sectors bir makro Linux/include/linux/bio.h

 64 #define bio_sectors(bio)        ((bio)->bi_iter.bi_size >> 9)

Bu bana sayıların sektör boyutları (512) bayt olarak sayıldığını gösteriyor. Verilen değer, bayt sayısını dokuza çıkardığınızda elde edeceğiniz değerdir.

Bu zaten çekirdekler 2.6.27 - 4.0.x arasında benzer bir kurulum gibi görünüyor.


3
2017-12-06 09:11