เป็นไปได้หรือไม่ที่จะเห็นว่าใน Linux มีจำนวนการอ่านและเขียนคำขอจากพื้นที่ผู้ใช้จนทำให้เกิดการเข้าชมแคชและขาดหายไปสำหรับอุปกรณ์บล็อก
เป็นไปได้หรือไม่ที่จะเห็นว่าใน Linux มีจำนวนการอ่านและเขียนคำขอจากพื้นที่ผู้ใช้จนทำให้เกิดการเข้าชมแคชและขาดหายไปสำหรับอุปกรณ์บล็อก
คำตอบ:
คุณสามารถพัฒนาสคริปต์SystemTapของคุณเอง คุณต้องบัญชีระบบย่อยสองระบบต่อไปนี้:
การพัฒนา SystemTap ใช้เวลาในการเรียนรู้ หากคุณเป็นนักพัฒนาระดับกลางและมีความรู้ด้าน Linux เป็นอย่างดีคุณควรทำภายใน 3-4 วัน ใช่ต้องใช้เวลาในการเรียนรู้ แต่คุณจะพอใจกับผลลัพธ์มาก - SystemTap ให้โอกาสคุณในการใส่โพรบในที่ใดก็ได้ในเคอร์เนล Linux
โปรดทราบว่าเคอร์เนลของคุณจะต้องรองรับการโหลดและยกเลิกการโหลดโมดูลเคอร์เนล ปัจจุบันสต็อกข้าวส่วนใหญ่รองรับสิ่งนี้ คุณจะต้องติดตั้งสัญลักษณ์แก้ปัญหาสำหรับเคอร์เนลของคุณ สำหรับระบบ Ubuntu ของฉันนี่เป็นเรื่องง่ายเหมือนกับการดาวน์โหลดไฟล์. deb หลายร้อย MB ซึ่งทีมพัฒนาเคอร์เนล Ubuntu รวบรวมมาให้ฉัน นี่คือคำอธิบายที่หน้าSystemtapOnUbuntu Wiki
PS ใช้แนวทาง SystemTap เฉพาะในกรณีที่คุณไม่มีวิธีแก้ไขปัญหาอื่น ๆ เพราะมันเป็นกรอบการทำงานใหม่ที่คุณต้องเรียนรู้และใช้เวลา / เงินและความยุ่งยากบางครั้ง
ฉันไปข้างหน้าและเขียนสคริปท์สำหรับเรื่องนี้ มีหนึ่งรายการใน 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
}
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]
คุณช่วยได้ไหม
/ proc / slabinfo เป็นการเริ่มต้นที่ดี แต่ไม่ได้ให้ข้อมูลที่คุณกำลังมองหา (อย่าหลงกลโดยอัตราการเข้าชม / การพลาดบนระบบที่เปิดใช้งานหลายคอร์และสถิติ; เท่าที่ฉันรู้ไม่มีวิธีดึงข้อมูลเฉพาะนั้นออกจากเคอร์เนลแม้ว่ามันจะไม่ยากอย่างมากที่จะเขียนโค้ดให้ทำ
แก้ไข: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html
ขณะนี้มียูทิลิตี้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 สิ่งนี้ยังขาดเวิร์กโหลดบางประเภท (บางประเภทจะกล่าวถึงใน "บทเรียน" ในหน้านั้น) และเรียกอัตรา "อัตรา"
หากคุณสนใจที่จะอัตราส่วน 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 ดังนั้นสำหรับกระบวนการที่อ่าน / เขียนมากจาก / ไปยังท่อการคำนวณข้างต้นจะเบ้รายงานอัตราการตีสูงกว่าที่มีประสิทธิภาพ