क्या लिनक्स में ब्लॉक डिवाइस के लिए कैश हिट / मिस अनुपात प्राप्त करने का एक तरीका है?


21

क्या लिनक्स में यह देखना संभव है कि ब्लॉक डिवाइसों के लिए कैश हिट और मिस के कारण यूजर स्पेस एंड से रिक्वेस्ट कितने पढ़ते और लिखते हैं?

जवाबों:


9

आप अपनी खुद की SystemTap स्क्रिप्ट विकसित कर सकते हैं । आपको निम्नलिखित दो उप-प्रणालियों को ध्यान में रखना होगा:

  • VFS: यह बफ़र कैश से पहले सभी I / O अनुरोधों का प्रतिनिधित्व करता है (अर्थात बिलकुल हर I / O अनुरोध); "vfs.read", "vfs.write" और "kernel.function (" vfs_ * ")" जांच की समीक्षा करें; आपको उन ब्लॉक उपकरणों को फ़िल्टर करना होगा जिन्हें आप उनके संबंधित प्रमुख + लघु संख्याओं द्वारा मॉनिटर करना चाहते हैं।
  • ब्लॉक: यह I / O शेड्यूलर (जो I / O अनुरोधों के विलय + पुनरावर्ती भी करता है) से पहले ब्लॉक डिवाइस पर भेजे गए सभी I / O अनुरोधों का प्रतिनिधित्व करता है; यहाँ हम जानते हैं कि कौन से अनुरोध बफ़र कैश से छूट गए थे; "ioblock.request" जांच की समीक्षा करें।

सिस्टमटैप विकास को सीखने में कुछ समय लगता है। यदि आप एक उदारवादी डेवलपर हैं और लिनक्स में अच्छा ज्ञान रखते हैं, तो आपको 3-4 दिनों में किया जाना चाहिए। हां, सीखने में समय लगता है, लेकिन आप परिणामों से बहुत खुश होंगे - SystemTap आपको लिनक्स कर्नेल में लगभग किसी भी स्थान पर जांच (सुरक्षित) करने का अवसर देता है।

ध्यान दें कि आपके कर्नेल में कर्नेल मॉड्यूल को लोड करने और उतारने के लिए समर्थन होना चाहिए। आजकल अधिकांश स्टॉक कर्नेल इसका समर्थन करते हैं। आपको अपने कर्नेल के लिए डीबग प्रतीकों को स्थापित करना होगा। मेरे उबंटू प्रणाली के लिए, यह कई सौ एमबी .deb फ़ाइल डाउनलोड करने के रूप में आसान था, जिसे उबंटू कर्नेल विकास टीम ने मेरे लिए संकलित किया। यह उदाहरण के लिए SystemtapOnUbuntu Wiki पृष्ठ पर समझाया गया है ।

PS सिस्टमटैप दृष्टिकोण तभी लें, जब आपके पास कोई दूसरा उपाय न हो, क्योंकि यह पूरी तरह से एक नया ढांचा है जिसे आपको सीखना है, और जिसके लिए समय / पैसा और कभी-कभी निराशा होती है।


1
+1 अच्छा और स्वच्छ विवरण। धन्यवाद, मैं systemtap भी चेकआउट करूँगा।
रिसायसिन


8

मैंने आगे बढ़कर इसके लिए एक स्टैप स्क्रिप्ट लिखी। सिस्टमटैप विकी पर एक है, लेकिन यह सही प्रतीत नहीं होता है। बुनियादी परीक्षण में, यह बहुत सटीक लेकिन 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
एंट्रोपो

मेरे पास इसे चलाने के लिए आपके कोड की कॉपी / पेस्ट है, निम्न त्रुटि के द्वारा, 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]क्या आप मदद कर सकते हैं?
फोपा लियोन कॉन्स्टैंटिन

2

/ proc / slabinfo एक अच्छी शुरुआत है, लेकिन आपको जो जानकारी मिल रही है, वह आपको काफी जानकारी नहीं देती है (कई कोर और आँकड़ों के साथ सिस्टम पर हिट / मिस प्रतिशत से मूर्ख मत बनो; वे कुछ और हैं)। जहाँ तक मुझे पता है, कर्नेल से उस विशेष जानकारी को बाहर निकालने का कोई तरीका नहीं है, हालाँकि इसे करने के लिए थोड़ा सा कोड लिखना बहुत कठिन नहीं होना चाहिए।

संपादित करें: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.1.html


1

अब वहाँ perf-tools पैकेज से cachestat उपयोगिता है ।

लेखक कुछ (संभवतः cruder) विकल्प भी सूचीबद्ध करता है जिनका लोग उपयोग करते हैं:

ए) डिस्क रीड को मॉनिटर करने के लिए iostat (1) का उपयोग करके पेज कैश मिस रेट का अध्ययन करें, और मान लें कि ये कैश मिस हैं, और उदाहरण के लिए, O_DIRECT। मिस रेट आमतौर पर वैसे भी अनुपात की तुलना में अधिक महत्वपूर्ण मीट्रिक है, क्योंकि मिसेज आवेदन दर्द के लिए आनुपातिक हैं। कैश साइज देखने के लिए भी मुफ्त (1) का उपयोग करें।

बी) पृष्ठ कैश ड्रॉप करें (1 गूंज 1 / / proc / sys / vm / drop_caches), और मापें कि प्रदर्शन कितना खराब है! मुझे एक नकारात्मक प्रयोग से प्यार है, लेकिन यह निश्चित रूप से कैश उपयोग पर कुछ प्रकाश डालने का एक दर्दनाक तरीका है।

ग) सर (1) का उपयोग करें और छोटे और प्रमुख दोषों का अध्ययन करें। मुझे नहीं लगता कि यह काम करता है (जैसे, नियमित I / O)।

डी) कैश-हिट-रेट.स्टेप सिस्टमटैप स्क्रिप्ट का उपयोग करें, जो लिनक्स पेज कैश हिट अनुपात के लिए एक इंटरनेट खोज में नंबर दो है। यह VFS इंटरफ़ेस में स्टैक में कैश को उच्च एक्सेस करता है, जिससे किसी भी फाइल सिस्टम या स्टोरेज डिवाइस को देखा जा सकता है। कैश मिसेस को उनकी डिस्क I / O के माध्यम से मापा जाता है। यह कुछ कार्यभार प्रकारों को भी याद करता है (कुछ का उस पृष्ठ पर "पाठ" में उल्लेख किया गया है), और अनुपात "दरों" को कहते हैं।


1

यदि आप किसी विशिष्ट प्रक्रिया के IO हिट / मिस अनुपात में रुचि रखते हैं, तो /proc/<pid>/ioफ़ाइल को पढ़ने के लिए एक सरल लेकिन बहुत प्रभावी तरीका है ।

यहां आपको 4 मुख्य मूल्य मिलेंगे:

  • rchar: देखने के आवेदन बिंदु से रीड बाइट्स की कुल संख्या (यानी: कैश के बजाय भौतिक भंडारण से संतुष्ट पढ़ने के बीच कोई अंतर नहीं)
  • wchar: ऊपर के रूप में, लेकिन लिखित बाइट्स के बारे में
  • read_bytes: बाइट्स वास्तव में स्टोरेज सबसिस्टम से पढ़ते हैं
  • write_bytes: बाइट्स वास्तव में स्टोरेज सबसिस्टम को लिखा जाता है

मान लें कि एक प्रक्रिया में निम्नलिखित मान हैं:

rchar: 1000000
read_bytes: 200000

पढ़ा गया कैश मिस अनुपात (बाइट्स में) है 100*200000/1000000 = 20%, और हिट अनुपात है100-20 = 80%

हालांकि, एक पकड़ है: rcharमूल्य में tty IO जैसी चीज शामिल है, इसलिए ऐसी प्रक्रियाओं के लिए जो / से पाइप तक / से बहुत कुछ पढ़ते / लिखते हैं, ऊपर की गणना को तिरछा किया जाएगा, जो प्रभावी की तुलना में उच्च हिट अनुपात की रिपोर्ट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.