লিনাক্সে ব্লক ডিভাইসগুলির জন্য ক্যাশে হিট / মিস অনুপাত পাওয়ার কোনও উপায় আছে কি?


21

লিনাক্সে ব্যবহারকারীর স্থান থেকে কতগুলি পড়তে এবং লেখার অনুরোধগুলি ব্লক ডিভাইসগুলির জন্য ক্যাশে হিট এবং মিস করতে পারে তা দেখতে কী সম্ভব?

উত্তর:


9

আপনি নিজের সিস্টেমটিপ স্ক্রিপ্টটি বিকাশ করতে পারেন । আপনাকে নিম্নলিখিত দুটি সাবসিস্টিমে অ্যাকাউন্ট করতে হবে:

  • ভিএফএস: এটি বাফার ক্যাশের আগে সমস্ত I / O অনুরোধগুলি উপস্থাপন করে (যেমন একেবারে প্রতিটি I / O অনুরোধ); "vfs.read", "vfs.writ" এবং "kernel.function (" vfs_ * ")" প্রোব পর্যালোচনা করুন; আপনার যে ব্লক ডিভাইসগুলি পর্যবেক্ষণ করতে চান তা তাদের নিজ নিজ বড় + ছোটখাট সংখ্যা দ্বারা ফিল্টার করতে হবে।
  • ব্লক: এটি আই / ও সিডিউলারের আগে ব্লক ডিভাইসগুলিতে প্রেরিত সমস্ত আই / ও অনুরোধের প্রতিনিধিত্ব করে (এটি আই / ও অনুরোধগুলির পুনরায় ক্রমও সরবরাহ করে না); বাফার ক্যাশে কোন অনুরোধগুলি মিস করেছিল তা আমরা এখানে জানি; "ioblock.request" অনুসন্ধানটি পর্যালোচনা করুন।

সিস্টেমট্যাপ বিকাশ শিখতে কিছুটা সময় নেয়। আপনি যদি একটি মধ্যপন্থী বিকাশকারী এবং লিনাক্সে ভাল জ্ঞান রাখেন তবে আপনার 3-4 দিনের মধ্যে করা উচিত। হ্যাঁ, এটি শিখতে সময় লাগে, তবে ফলাফলগুলি দেখে আপনি খুব খুশি হবেন - সিস্টেমট্যাপ আপনাকে লিনাক্স কার্নেলের প্রায় কোনও জায়গায় প্রোব (নিরাপদে) রাখার সুযোগ দেয়।

নোট করুন যে আপনার কার্নেলের অবশ্যই কার্নেল মডিউলগুলি লোড এবং আনলোড করার জন্য সমর্থন থাকতে হবে। আজকাল বেশিরভাগ স্টক কার্নেল এটি সমর্থন করে। আপনার কার্নেলের জন্য আপনাকে ডিবাগ প্রতীকগুলি ইনস্টল করতে হবে। আমার উবুন্টু সিস্টেমের জন্য এটি বেশ কয়েক'শ এমবি .দেব ফাইল ডাউনলোড করার মতোই সহজ ছিল, যা উবুন্টু কার্নেল উন্নয়ন দলটি আমার জন্য সংকলন করেছিল। উদাহরণস্বরূপ, এটি সিস্টেমটাপঅনবুন্টু উইকি পৃষ্ঠায় ব্যাখ্যা করা হয়েছে ।

PS আপনার কেবল অন্য কোনও সমাধান না থাকলে কেবল সিস্টেমট্যাপের পদ্ধতিটি গ্রহণ করুন, কারণ এটি সম্পূর্ণ নতুন কাঠামো যা আপনাকে শিখতে হবে এবং এতে সময় / অর্থ এবং কখনও কখনও হতাশার ব্যয় হয়।


1
+1 সুন্দর এবং পরিষ্কার ব্যাখ্যা। আপনাকে ধন্যবাদ, আমি চেকআউট সিস্টেমটাপও করব।
রিসায়াসিন


8

আমি এগিয়ে গিয়েছিলাম এবং এর জন্য একটি স্ট্যাপ স্ক্রিপ্ট লিখেছিলাম। সিস্টেমট্যাপ উইকিতে একটি রয়েছে, তবে এটি সঠিক বলে মনে হচ্ছে না। বেসিক পরীক্ষায়, এটি বেশ নির্ভুল প্রদর্শিত হয় তবে ওয়াইএমএমভি।

#! /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

/ প্রোক / স্ল্যাবিনফো হ'ল একটি ভাল শুরু, তবে আপনি যে তথ্যটি সন্ধান করছেন তা পুরোপুরি তথ্য দেয় না (একাধিক কোর এবং স্ট্যাটাস সক্ষম হওয়া সিস্টেমে হিট / মিস শতাংশের দ্বারা বোকা বানাবেন না; সেগুলি অন্য কিছু)। যতদূর আমি জানি, কার্নেলের বাইরে থেকে সেই নির্দিষ্ট তথ্যটি টানানোর কোনও উপায় নেই, যদিও কোডটি কিছুটা লেখার পক্ষে মারাত্মক অসুবিধা হওয়া উচিত নয়।

সম্পাদনা করুন: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html


1

এখন পারফ-টুলস প্যাকেজ থেকে ক্যাসেস্ট্যাট ইউটিলিটি রয়েছে ।

লেখক লোকেরা ব্যবহার করেন এমন কিছু (সম্ভবত ক্রুডার) বিকল্পগুলিও তালিকাভুক্ত করে:

ক) ডিস্ক রিডগুলি নিরীক্ষণ করতে iostat (1) ব্যবহার করে পৃষ্ঠা ক্যাশে মিস হারটি অধ্যয়ন করুন এবং ধরে নিন যে এগুলি ক্যাশে মিস করেছে, এবং না, উদাহরণস্বরূপ, O_DIRECT। মিস রেট সাধারণত যাইহোক অনুপাতের তুলনায় আরও গুরুত্বপূর্ণ মেট্রিক, যেহেতু মিসের প্রয়োগের ব্যথার সাথে আনুপাতিক। ক্যাশে আকারগুলি দেখতে বিনামূল্যে (1) ব্যবহার করুন।

খ) পৃষ্ঠা ক্যাশে ফেলে দিন (প্রতিধ্বনি 1> / proc / sys / vm / ড্রপ_ক্যাচস), এবং পরিমাপ করুন যে কতটা পারফরম্যান্স খারাপ হয়! আমি নেতিবাচক পরীক্ষার ব্যবহার পছন্দ করি, তবে এটি অবশ্যই ক্যাশে ব্যবহারের বিষয়ে কিছুটা আলোকপাত করার জন্য একটি বেদনাদায়ক উপায়।

গ) সর (১) ব্যবহার করুন এবং ছোটখাটো এবং বড় ত্রুটিগুলি অধ্যয়ন করুন। আমি মনে করি না এটি কাজ করে (যেমন, নিয়মিত I / O)।

ডি) ক্যাশে-হিট-রেট.এসটিপি সিস্টেমট্যাপ স্ক্রিপ্টটি ব্যবহার করুন, যা লিনাক্স পৃষ্ঠার ক্যাশে হিট অনুপাতের জন্য ইন্টারনেট অনুসন্ধানে দ্বিতীয় নম্বরে। এটি ভিএফএস ইন্টারফেসে স্ট্যাকের উপরে ক্যাশে অ্যাক্সেসের উচ্চতর সরঞ্জাম সরবরাহ করে, যাতে কোনও ফাইল সিস্টেম বা স্টোরেজ ডিভাইসে পড়তে দেখা যায়। ক্যাশে মিসগুলি তাদের ডিস্ক I / O এর মাধ্যমে পরিমাপ করা হয়। এটি কিছু কাজের চাপও বাদ দেয় না (কিছুটি সেই পৃষ্ঠায় "পাঠে" উল্লিখিত হয়) এবং অনুপাতগুলিকে "হার" বলে calls


1

আপনি যদি কোনও নির্দিষ্ট প্রক্রিয়াটির আইও হিট / মিস অনুপাতের প্রতি আগ্রহী হন তবে /proc/<pid>/ioফাইলটি পড়ার জন্য একটি সহজ তবে খুব কার্যকর পন্থা ।

এখানে আপনি 4 মূল মান পাবেন:

  • rchar: অ্যাপ্লিকেশন পয়েন্ট থেকে পঠিত বাইটের মোট সংখ্যা (যেমন: ক্যাশে না দিয়ে শারীরিক স্টোরেজ থেকে সন্তুষ্ট পড়ার মধ্যে কোনও পার্থক্য নেই)
  • wchar: উপরে হিসাবে, কিন্তু লিখিত বাইট সম্পর্কে
  • read_bytes: স্টোরেজ সাবসিস্টেম থেকে সত্যই পড়া বাইটগুলি
  • write_bytes: স্টোরেজ সাব সিস্টেমে সত্যই লিখিত বাইটগুলি

বলুন কোনও প্রক্রিয়ার নিম্নলিখিত মান রয়েছে:

rchar: 1000000
read_bytes: 200000

পঠন ক্যাশে মিস অনুপাত (বাইটে) 100*200000/1000000 = 20%, এবং হিট অনুপাত100-20 = 80%

তবে একটি ক্যাচ আছে: rcharমানটি টিটিআই আইও হিসাবে অন্তর্ভুক্ত করে, সুতরাং যে প্রসেসগুলির জন্য / কোনও পাইপ থেকে / পাইপে অনেক কিছু পড়তে / লিখতে হবে সেই প্রক্রিয়াগুলির জন্য উপরের গণনাটি স্কিউ করা হবে, কার্যকরের চেয়ে উচ্চতর হিট অনুপাতের প্রতিবেদন করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.