มีวิธีรับอัตราส่วน Cache Hit / Miss สำหรับอุปกรณ์บล็อกใน Linux หรือไม่?


21

เป็นไปได้หรือไม่ที่จะเห็นว่าใน Linux มีจำนวนการอ่านและเขียนคำขอจากพื้นที่ผู้ใช้จนทำให้เกิดการเข้าชมแคชและขาดหายไปสำหรับอุปกรณ์บล็อก

คำตอบ:


9

คุณสามารถพัฒนาสคริปต์SystemTapของคุณเอง คุณต้องบัญชีระบบย่อยสองระบบต่อไปนี้:

  • VFS: สิ่งนี้แสดงให้เห็นถึงการร้องขอ I / O ทั้งหมดก่อนแคชบัฟเฟอร์ (เช่นการร้องขอ I / O ทุกอย่าง); ตรวจสอบโพรบ "vfs.read", "vfs.write" และ "kernel.function (" vfs_ * ")" โพรบ; คุณต้องกรองอุปกรณ์บล็อกที่คุณต้องการตรวจสอบด้วยหมายเลขหลัก + รองที่เกี่ยวข้อง
  • บล็อก: แสดงถึงคำขอ I / O ทั้งหมดที่ส่งไปยังอุปกรณ์บล็อกก่อนตารางเวลา I / O (ซึ่งรวมการเรียงลำดับ + ของคำขอ I / O ด้วย) ที่นี่เรารู้ว่าคำขอใดที่แคชบัฟเฟอร์พลาดไป ตรวจสอบโพรบ "ioblock.request"

การพัฒนา SystemTap ใช้เวลาในการเรียนรู้ หากคุณเป็นนักพัฒนาระดับกลางและมีความรู้ด้าน Linux เป็นอย่างดีคุณควรทำภายใน 3-4 วัน ใช่ต้องใช้เวลาในการเรียนรู้ แต่คุณจะพอใจกับผลลัพธ์มาก - SystemTap ให้โอกาสคุณในการใส่โพรบในที่ใดก็ได้ในเคอร์เนล Linux

โปรดทราบว่าเคอร์เนลของคุณจะต้องรองรับการโหลดและยกเลิกการโหลดโมดูลเคอร์เนล ปัจจุบันสต็อกข้าวส่วนใหญ่รองรับสิ่งนี้ คุณจะต้องติดตั้งสัญลักษณ์แก้ปัญหาสำหรับเคอร์เนลของคุณ สำหรับระบบ Ubuntu ของฉันนี่เป็นเรื่องง่ายเหมือนกับการดาวน์โหลดไฟล์. deb หลายร้อย MB ซึ่งทีมพัฒนาเคอร์เนล Ubuntu รวบรวมมาให้ฉัน นี่คือคำอธิบายที่หน้าSystemtapOnUbuntu Wiki

PS ใช้แนวทาง SystemTap เฉพาะในกรณีที่คุณไม่มีวิธีแก้ไขปัญหาอื่น ๆ เพราะมันเป็นกรอบการทำงานใหม่ที่คุณต้องเรียนรู้และใช้เวลา / เงินและความยุ่งยากบางครั้ง


1
+1 คำอธิบายที่ดี & สะอาด ขอบคุณฉันจะเช็คเอาต์ systemtap ด้วย
risyasin


8

ฉันไปข้างหน้าและเขียนสคริปท์สำหรับเรื่องนี้ มีหนึ่งรายการใน systemtap wiki แต่ดูเหมือนว่าจะไม่ถูกต้อง ในการทดสอบพื้นฐานสิ่งนี้ดูเหมือนจะแม่นยำ แต่ YMMV

#! /usr/bin/env stap
global total_bytes, disk_bytes, counter

probe vfs.read.return {
  if (bytes_read>0) {
    if (devname=="N/A") {
    } else {
      total_bytes += bytes_read
    }
  }
}
probe ioblock.request
{
    if (rw == 0 && size > 0)
    {
        if (devname=="N/A") { 
        } else {
          disk_bytes += size
        }
    }

}

# print VFS hits and misses every 5 second, plus the hit rate in %
probe timer.s(5) {
    if (counter%15 == 0) {
        printf ("\n%18s %18s %10s %10s\n", 
            "Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate")
    }
    cache_bytes = total_bytes - disk_bytes
    if (cache_bytes < 0)
      cache_bytes = 0
    counter++
    hitrate =  10000 * cache_bytes / (cache_bytes+disk_bytes)
    missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes)
    printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n",
        cache_bytes/1024, disk_bytes/1024,
        missrate/100, missrate%100, hitrate/100, hitrate%100)
    total_bytes = 0
    disk_bytes = 0
}

! น่ากลัว ฉันเพิ่มแคชเฉลี่ยเล็กน้อยใช้สถิติเพื่อพิมพ์เมื่อคุณปิดมัน: pastie.org/1845683
entropo

ฉันมีการคัดลอก / วางรหัสของคุณเพื่อเรียกใช้โดยมีข้อผิดพลาดต่อไปนี้เกิดขึ้นsemantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]คุณช่วยได้ไหม
Fopa Léon Constantin

2

/ proc / slabinfo เป็นการเริ่มต้นที่ดี แต่ไม่ได้ให้ข้อมูลที่คุณกำลังมองหา (อย่าหลงกลโดยอัตราการเข้าชม / การพลาดบนระบบที่เปิดใช้งานหลายคอร์และสถิติ; เท่าที่ฉันรู้ไม่มีวิธีดึงข้อมูลเฉพาะนั้นออกจากเคอร์เนลแม้ว่ามันจะไม่ยากอย่างมากที่จะเขียนโค้ดให้ทำ

แก้ไข: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html


1

ขณะนี้มียูทิลิตี้cachestatจากแพ็คเกจเครื่องมือที่สมบูรณ์แบบ

ผู้เขียนยังมีรายการทางเลือกอื่น ๆ ที่ผู้คนใช้:

A) ศึกษาอัตราการพลาดแคชของเพจโดยใช้ iostat (1) เพื่อตรวจสอบการอ่านดิสก์และสมมติว่าสิ่งเหล่านี้เป็นแคชที่หายไปและไม่ใช่เช่น O_DIRECT อัตราการพลาดมักจะเป็นตัวชี้วัดที่สำคัญกว่าอัตราส่วนต่อไปเนื่องจากการคิดถึงเป็นสัดส่วนกับความเจ็บปวดของแอปพลิเคชัน ใช้ฟรี (1) เพื่อดูขนาดแคช

B) วางแคชหน้า (echo 1> / proc / sys / vm / drop_caches) และวัดว่าประสิทธิภาพลดลงเท่าใด! ฉันชอบการใช้การทดสอบเชิงลบ แต่แน่นอนว่าเป็นวิธีที่เจ็บปวดในการลดการใช้แคช

C) ใช้ sar (1) และศึกษาข้อบกพร่องเล็ก ๆ น้อย ๆ และที่สำคัญ ฉันไม่คิดว่ามันจะใช้งานได้ (เช่น I / O ปกติ)

D) ใช้สคริปต์ cache-hit-rate.stp SystemTap ซึ่งเป็นหมายเลขสองในการค้นหาอินเทอร์เน็ตสำหรับอัตราส่วนการใช้แคชหน้า Linux เป็นเครื่องมือในการเข้าถึงแคชสูงในกองซ้อนในส่วนต่อประสาน VFS เพื่อให้สามารถอ่านระบบไฟล์หรืออุปกรณ์เก็บข้อมูลใด ๆ ได้ การพลาดแคชจะถูกวัดผ่านดิสก์ I / O สิ่งนี้ยังขาดเวิร์กโหลดบางประเภท (บางประเภทจะกล่าวถึงใน "บทเรียน" ในหน้านั้น) และเรียกอัตรา "อัตรา"


1

หากคุณสนใจที่จะอัตราส่วน IO hit / miss ของกระบวนการเฉพาะวิธีที่ง่าย แต่มีประสิทธิภาพมากคือการอ่าน/proc/<pid>/ioไฟล์

ที่นี่คุณจะได้พบกับ 4 ค่าสำคัญ:

  • rchar: จำนวนการอ่านไบต์ทั้งหมดจากมุมมองของแอ็พพลิเคชัน (เช่น: ไม่มีความแตกต่างระหว่างการอ่านที่พอใจจากที่จัดเก็บข้อมูลจริงมากกว่าจากแคช)
  • wchar: ตามด้านบน แต่เขียนเป็นไบต์
  • read_bytes: ไบต์อ่านจากระบบย่อยหน่วยเก็บข้อมูลจริง ๆ
  • write_bytes: ไบต์ที่เขียนไปยังระบบย่อยหน่วยเก็บข้อมูลจริง ๆ

สมมติว่ากระบวนการมีค่าต่อไปนี้:

rchar: 1000000
read_bytes: 200000

read cache miss ratio (เป็นไบต์) คือ100*200000/1000000 = 20%และอัตราส่วน hit คือ100-20 = 80%

มีการจับคือ: rcharค่ารวมถึงสิ่งที่เป็น tty IO ดังนั้นสำหรับกระบวนการที่อ่าน / เขียนมากจาก / ไปยังท่อการคำนวณข้างต้นจะเบ้รายงานอัตราการตีสูงกว่าที่มีประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.