পারফিউভেন্টস তালিকায় কার্নেল পিএমইউ ইভেন্টগুলি কী কী?


11

খুঁজছেন কি এক সঙ্গে নজর রাখতে পারেন perf_eventsলিনাক্স, আমি কি খুঁজে পাচ্ছি না Kernel PMU eventহয়? যেমন, সঙ্গে শো ঘটনা পছন্দ:perf version 3.13.11-ckt39perf list

branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]

সামগ্রিকভাবে আছে:

Tracepoint event
Software event
Hardware event
Hardware cache event
Raw hardware event descriptor
Hardware breakpoint
Kernel PMU event

এবং আমি বুঝতে চাই যে তারা কী, তারা কোথা থেকে এসেছে। আমার সবার কাছে এক ধরণের ব্যাখ্যা আছে তবে Kernel PMU eventআইটেম।

থেকে জন্য perf উইকি টিউটোরিয়াল এবং ব্রেন্ডন গ্রেগ এর পাতা আমি যে পাবেন:

  • Tracepointsসবচেয়ে পরিষ্কার - এগুলি কার্নেল উত্সে ম্যাক্রোস, যা নিরীক্ষণের জন্য একটি তদন্ত বিন্দু তৈরি করে, এগুলি ftraceপ্রকল্পের সাথে প্রবর্তিত হয়েছিল এবং এখন প্রত্যেকেই এটি ব্যবহার করছে
  • Software কার্নেলের নিম্ন স্তরের কাউন্টার এবং কিছু অভ্যন্তরীণ তথ্য-কাঠামো (অতএব, তারা ট্র্যাসপয়েন্টগুলি থেকে পৃথক)
  • Hardware eventকয়েকটি খুব প্রাথমিক সিপিইউ ইভেন্ট রয়েছে যা সমস্ত আর্কিটেকচারে পাওয়া যায় এবং কার্নেল দ্বারা সহজেই অ্যাক্সেস করা যায়
  • Hardware cache eventএর ডাক নামগুলি Raw hardware event descriptor- এটি নিম্নলিখিত হিসাবে কাজ করে

    যেমনটি আমি পেয়েছি, Raw hardware event descriptorসেগুলি আরও (মাইক্রো?) আর্কিটেকচার-নির্দিষ্ট ইভেন্টগুলির চেয়ে বেশি Hardware event, ইভেন্টগুলি প্রসেসর মনিটরিং ইউনিট (পিএমইউ) বা প্রদত্ত প্রসেসরের অন্যান্য নির্দিষ্ট বৈশিষ্ট্যগুলি থেকে আসে, সুতরাং সেগুলি কেবলমাত্র কয়েকটি মাইক্রো-আর্কিটেকচারে পাওয়া যায় (আসুন বলি " আর্কিটেকচারের অর্থ "x86_64" এবং প্রয়োগের বিশদগুলির বিশদটি "মাইক্রো-আর্কিটেকচার"); এবং তারা এই অদ্ভুত বর্ণনাকারীর মাধ্যমে উপকরণের জন্য অ্যাক্সেসযোগ্য

    rNNN                                               [Raw hardware event descriptor]
    cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
     (see 'man perf-list' on how to encode it)
    

    - এই বর্ণনাকারী, তারা কোন ইভেন্টগুলিতে ইঙ্গিত দেয় এবং প্রসেসরের ম্যানুয়ালগুলিতে ( পারফেক্ট উইকিতে পিএমইউ ইভেন্টগুলি ) পাওয়া যায়;

    তবে, যখন লোকেরা জানে যে প্রদত্ত প্রসেসরের কোনও কার্যকর ইভেন্ট রয়েছে তারা এটিকে একটি ডাকনাম দেয় এবং Hardware cache eventঅ্যাক্সেসের স্বাচ্ছন্দ্যে এটি লিনাক্সে প্লাগ করে

    - সঠিক আমাকে যদি আমি ভুল (অদ্ভুত সব Hardware cache eventচলেছেন something-loadsবা something-misses- খুব প্রকৃত প্রসেসর ক্যাশে মত ..)

  • এখন Hardware breakpoint

    mem:<addr>[:access]                                [Hardware breakpoint]
    

    একটি হার্ডওয়্যার বৈশিষ্ট্য, যা সম্ভবত বেশিরভাগ আধুনিক স্থাপত্যগুলির পক্ষে সাধারণ, এবং একটি ডিবাগারে ব্রেকপয়েন্ট হিসাবে কাজ করে? (সম্ভবত এটি গুগলযোগ্য)

  • অবশেষে, Kernel PMU eventআমি গুগল পরিচালনা করতে পারি না;

    এটি ব্রেন্ডনের পারফেক্ট পৃষ্ঠাতে ইভেন্টগুলি তালিকার তালিকাতেও প্রদর্শিত হবে না , তাই এটি নতুন?

    সম্ভবত এটি পিএমইউ থেকে বিশেষত হার্ডওয়্যার ইভেন্টের ডাক নাম? (অ্যাক্সেসের স্বাচ্ছন্দ্যের জন্য এটি ডাকনাম ছাড়াও ইভেন্টগুলির তালিকার একটি পৃথক বিভাগ পেয়েছে)) আসলে, সম্ভবত Hardware cache eventsসিপিইউর ক্যাশে থেকে হার্ডওয়ার ইভেন্টগুলির Kernel PMU eventডাক নাম এবং পিএমইউ ইভেন্টের ডাকনাম? (তখন কেন এটি কল করবেন না Hardware PMU event? ..) এটি কেবল নতুন নামকরণের স্কিম হতে পারে - হার্ডওয়্যার ইভেন্টগুলির ডাক নামগুলি বিভাগীকৃত হয়েছে?

    এবং এই ইভেন্টগুলির মতো বিষয়গুলি বোঝায় cpu/mem-stores/, কিছু লিনাক্স সংস্করণ ইভেন্টগুলিতে /sys/devices/এবং এর মধ্যে বর্ণনা পেয়েছে :

    # find /sys/ -type d -name events
    /sys/devices/cpu/events
    /sys/devices/uncore_cbox_0/events
    /sys/devices/uncore_cbox_1/events
    /sys/kernel/debug/tracing/events
    

    - debug/tracingজন্য ftraceএবং ট্রেস, অন্যান্য ডিরেক্টরি ঠিক কি মেলে perf listযেমন শো Kernel PMU event

কেউ কি আমাকে Kernel PMU eventsবা /sys/..events/সিস্টেমগুলি সম্পর্কে একটি ভাল ব্যাখ্যা / ডকুমেন্টেশনের দিকে ইঙ্গিত করতে পারে? এছাড়াও, /sys/..events/হার্ডওয়্যার ইভেন্টগুলি বা একই রকম কিছুকে সিস্টেমাইজ করার জন্য কিছু নতুন প্রচেষ্টা? (তারপরে, কার্নেল পিএমইউ "কর্নেলের পারফরম্যান্স মনিটরিং ইউনিট" এর মতো))

পুনশ্চ

আরও ভাল প্রসঙ্গটি দেওয়ার জন্য, অন- perf listসুবিধাযুক্ত রান (ট্রেসপয়েন্টগুলি দেখানো হয় না, তবে তাদের মধ্যে ১৩7474 টি রয়েছে) Kernel PMU eventএস ও Hardware cache eventএস এবং অন্যান্যদের সম্পূর্ণ তালিকা সহ এড়িয়ে যায়:

$ perf list 

List of pre-defined events (to be used in -e):
 cpu-cycles OR cycles                               [Hardware event]
 instructions                                       [Hardware event]
 ...
 cpu-clock                                          [Software event]
 task-clock                                         [Software event]
 ...
 L1-dcache-load-misses                              [Hardware cache event]
 L1-dcache-store-misses                             [Hardware cache event]
 L1-dcache-prefetch-misses                          [Hardware cache event]
 L1-icache-load-misses                              [Hardware cache event]
 LLC-loads                                          [Hardware cache event]
 LLC-stores                                         [Hardware cache event]
 LLC-prefetches                                     [Hardware cache event]
 dTLB-load-misses                                   [Hardware cache event]
 dTLB-store-misses                                  [Hardware cache event]
 iTLB-loads                                         [Hardware cache event]
 iTLB-load-misses                                   [Hardware cache event]
 branch-loads                                       [Hardware cache event]
 branch-load-misses                                 [Hardware cache event]

 branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]
 branch-misses OR cpu/branch-misses/                [Kernel PMU event]
 bus-cycles OR cpu/bus-cycles/                      [Kernel PMU event]
 cache-misses OR cpu/cache-misses/                  [Kernel PMU event]
 cache-references OR cpu/cache-references/          [Kernel PMU event]
 cpu-cycles OR cpu/cpu-cycles/                      [Kernel PMU event]
 instructions OR cpu/instructions/                  [Kernel PMU event]
 mem-loads OR cpu/mem-loads/                        [Kernel PMU event]
 mem-stores OR cpu/mem-stores/                      [Kernel PMU event]
 ref-cycles OR cpu/ref-cycles/                      [Kernel PMU event]
 stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]
 uncore_cbox_0/clockticks/                          [Kernel PMU event]
 uncore_cbox_1/clockticks/                          [Kernel PMU event]

 rNNN                                               [Raw hardware event descriptor]
 cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
  (see 'man perf-list' on how to encode it)

 mem:<addr>[:access]                                [Hardware breakpoint]

 [ Tracepoints not available: Permission denied ]

উত্তর:


11

গুগলিং এবং ack-িং শেষ! আমি কিছু উত্তর পেয়েছি।

তবে প্রথমে আমাকে প্রশ্নটির উদ্দেশ্যটি আরও কিছুটা পরিষ্কার করতে দিন: আমি সিস্টেমটিতে এবং তাদের কার্যকারিতা কাউন্টারগুলিতে স্বতন্ত্র প্রক্রিয়াগুলি স্পষ্টভাবে আলাদা করতে চাই। উদাহরণস্বরূপ, একটি প্রসেসরের মূল, একটি আনকোর ডিভাইস (এটি সম্পর্কে সম্প্রতি শিখেছি), প্রসেসরের উপর কার্নেল বা ব্যবহারকারীর অ্যাপ্লিকেশন, একটি বাস (= বাস নিয়ামক), একটি হার্ড ড্রাইভ সমস্ত স্বতন্ত্র প্রক্রিয়া, সেগুলি একটি ঘড়ির দ্বারা সুসংগত হয় না they । এবং আজকাল সম্ভবত তাদের সকলেরই কিছু প্রসেস মনিটরিং কাউন্টার (পিএমসি) রয়েছে। কাউন্টারগুলি কোন প্রক্রিয়াগুলি থেকে আসে তা আমি বুঝতে চাই। (এটি গুগল করতেও সহায়ক: কোনও জিনিসের "বিক্রেতা" এটি আরও ভালভাবে জিরো করে))

এছাড়াও, অনুসন্ধানের জন্য ব্যবহৃত গিয়ারটি: Ubuntu 14.04,, linux 3.13.0-103-genericপ্রসেসর Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz(এর থেকে /proc/cpuinfoএটিতে 2 টি শারীরিক কোর এবং 4 টি ভার্চুয়াল রয়েছে - এখানে শারীরিক বিষয়)।

পরিভাষা, প্রশ্ন জড়িত জিনিস

ইন্টেল থেকে:

  • প্রসেসর একটি coreডিভাইস (এটি 1 ডিভাইস / প্রক্রিয়া) এবং একগুচ্ছ uncoreডিভাইস , coreযা প্রোগ্রামটি চালায় (ক্লক, এএলইউ, রেজিস্টার ইত্যাদি), uncoreডিভাইসগুলি ডাইতে রাখা হয়, প্রসেসরের গতি এবং কম বিলম্বের জন্য বন্ধ (আসল কারণ) "কারণ প্রস্তুতকারক এটি করতে পারে"); আমি যেমন বুঝতে পেরেছিলাম এটি মূলত নর্থব্রিজ, পিসি মাদারবোর্ডের মতো, প্লাস ক্যাশে; এবং এএমডি প্রকৃতপক্ষে এই ডিভাইসগুলিকে instead ofউত্তরব্রিজকে আনকোর` বলে;

  • ubox যা আমার মধ্যে প্রদর্শিত হয় sysfs

    $ find /sys/devices/ -type d -name events 
    /sys/devices/cpu/events
    /sys/devices/uncore_cbox_0/events
    /sys/devices/uncore_cbox_1/events
    

    - একটি uncoreডিভাইস, যা সর্বশেষ স্তরের ক্যাশে পরিচালনা করে (এলএলসি, র‌্যাম আঘাত করার আগে সর্বশেষ); আমার কাছে 2 টি কোর, এভাবে 2 এলএলসি এবং 2 ubox;

  • প্রসেসর মনিটরিং ইউনিট (পিএমইউ) একটি পৃথক ডিভাইস যা কোনও প্রসেসরের অপারেশন পর্যবেক্ষণ করে এবং প্রসেসর মনিটরিং কাউন্টারে (পিএমসি) রেকর্ড করে (ক্যাশে মিস করা, প্রসেসরের চক্র ইত্যাদি গণনা করে); তারা ডিভাইস coreএবং uncoreডিভাইস উপস্থিত; coreবেশী ব্যবহার করা হয় rdpmc(পড়া PMC) নির্দেশ; uncoreযেহেতু এই ডিভাইসগুলি হাতে প্রকৃত প্রসেসর উপর নির্ভর করে, মডেল স্পেসিফিক রেজিস্টার (MSR) মাধ্যমে মাধ্যমে ব্যবহার করা হয় rdmsr(স্বাভাবিকভাবেই);

    স্পষ্টতই, তাদের সাথে কর্মপ্রবাহটি নিবন্ধগুলির জোড়া দিয়ে সম্পন্ন হয় - 1 টি রেজিস্টার সেট করে যা কাউন্টারে গণনা করা হয়, 2 রেজিস্টার কাউন্টারে মূল্য; কাউন্টারটি কেবলমাত্র 1 নয়, ইভেন্টগুলির একগুচ্ছের পরে বর্ধিতকরণে কনফিগার করা যেতে পারে; + এই কাউন্টারগুলিতে কিছু ইন্টারপুট / টেক ওভারফ্লো লক্ষ্য করছে;

  • আরও কেউ ইন্টেলের "আইএ -32 সফ্টওয়্যার বিকাশকারীর ম্যানুয়াল ভল 3B" অধ্যায় 18 "পারফরম্যান্স মনিটরিং" তে খুঁজে পেতে পারেন;

    এছাড়াও, uncore"আরকিটেকচারাল পারফরম্যান্স মনিটরিং ভার্সন 1" সংস্করণের জন্য এই পিএমসির জন্য এমএসআর এর ফর্ম্যাটটি কংক্রিটলিপি (ম্যানুয়ালটিতে 1-4 সংস্করণ রয়েছে, আমার প্রসেসরটি কোনটি আমি জানি না) "চিত্র 18-1 তে বর্ণিত হয়েছে। লেআউট IA32_PERFEVTSELx MSRs এর "(খনিতে পৃষ্ঠা 18-3), এবং বিভাগ" 18.2.1.2 "পূর্বনির্ধারিত আর্কিটেকচারাল পারফরমেন্স ইভেন্টগুলির জন্য প্রিম-সংজ্ঞায়িত আর্কিটেকচারাল পারফরম্যান্স ইভেন্টস"। ঘটনা যা দেখা Hardware eventমধ্যে perf list

লিনাক্স কার্নেল থেকে:

  • বিভিন্ন উত্স, সফ্টওয়্যার (কার্নেলের) এবং হার্ডওয়্যার উভয়েরই পারফরম্যান্স কাউন্টার পরিচালনার জন্য কার্নেলের একটি সিস্টেম (বিমূর্ততা / স্তর) রয়েছে, এটি বর্ণিত হয়েছে linux-source-3.13.0/tools/perf/design.txt; এই সিস্টেমে কোনও ইভেন্টকে struct perf_event_attr(ফাইল linux-source-3.13.0/include/uapi/linux/perf_event.h) হিসাবে সংজ্ঞায়িত করা হয় , এর মূল অংশটি সম্ভবত __u64 configক্ষেত্র - এটি একটি সিপিইউ-নির্দিষ্ট ইভেন্ট সংজ্ঞা (those৪ বিট শব্দটি সেই ইন্টেলের পরিসংখ্যানগুলিতে বর্ণিত ফর্ম্যাটে) বা কার্নেলের ইভেন্ট উভয়ই ধরে রাখতে পারে

    যদি বাকীগুলিতে [কাঁচা সিপিইউ বা কার্নেলের ইভেন্ট] থাকে তবে কনফিগার শব্দটির এমএসবি তা বোঝায়

    কার্নেলের ইভেন্টটি প্রকারের জন্য 7 বিট এবং ইভেন্টের শনাক্তকারীর জন্য 56 বিট দিয়ে সংজ্ঞায়িত করা হয়েছে, যা enumকোডের মধ্যে রয়েছে, যা আমার ক্ষেত্রে রয়েছে:

    $ ak PERF_TYPE linux-source-3.13.0/include/
    ...
    linux-source-3.13.0/include/uapi/linux/perf_event.h
    29: PERF_TYPE_HARDWARE      = 0,
    30: PERF_TYPE_SOFTWARE      = 1,
    31: PERF_TYPE_TRACEPOINT    = 2,
    32: PERF_TYPE_HW_CACHE      = 3,
    33: PERF_TYPE_RAW           = 4,
    34: PERF_TYPE_BREAKPOINT    = 5,
    36: PERF_TYPE_MAX,         /* non-ABI */
    

    ( akআমার উপনাম এটি ack-grep, যা ackদেবিয়ানের জন্য নাম ; এবং ackদুর্দান্ত)

    কার্নেলের সোর্স কোডে "সিস্টেমের মধ্যে থাকা সমস্ত পিএমইউ নিবন্ধন করুন" এবং কাঠামোর ধরণের মতো অপারেশনগুলি দেখতে struct pmuপাওয়া যায় int perf_pmu_register(struct pmu *pmu, const char *name, int type)- যা কোনওভাবে এই সিস্টেমটিকে "কার্নেলের পিএমইউ" বলতে পারে, এটি একটি সমষ্টি হবে সিস্টেমে সমস্ত পিএমইউ; তবে এই নামটি কার্নেলের ক্রিয়াকলাপগুলির পর্যবেক্ষণ সিস্টেম হিসাবে ব্যাখ্যা করা যেতে পারে, যা বিভ্রান্তিকর হবে;

    আসুন এই সাবসিস্টেমটিকে perf_eventsস্পষ্টতার জন্য কল করুন ;

  • যে কোনও কার্নেল সাবসিস্টেম হিসাবে, এই সাবসিস্টেমটি রফতানি করা যায় sysfs(যা লোকেদের ব্যবহারের জন্য কার্নেল সাবসিস্টেমগুলি রফতানি করার জন্য তৈরি করা হয়); এবং এগুলি eventsআমার /sys/- এক্সপোর্টেড (অংশগুলির?) perf_eventsসাবসিস্টেমের সেই ডিরেক্টরিগুলি কী ;

  • এছাড়াও, ব্যবহারকারী-স্থান ইউটিলিটি perf(লিনাক্সের মধ্যে নির্মিত) এখনও একটি পৃথক প্রোগ্রাম এবং এর নিজস্ব নিজস্ব বিমূর্ততা রয়েছে; এটি perf_evsel(ফাইল linux-source-3.13.0/tools/perf/util/evsel.{h,c}) হিসাবে ব্যবহারকারী দ্বারা পর্যবেক্ষণের জন্য অনুরোধ করা ইভেন্টটিকে প্রতিনিধিত্ব করে - এই কাঠামোর একটি ক্ষেত্র রয়েছে struct perf_event_attr attr;, তবে struct cpu_map *cpus;এর মতো ক্ষেত্রও কীভাবে perfইউটিলিটি সমস্ত বা নির্দিষ্ট সিপিইউগুলিকে একটি ইভেন্ট বরাদ্দ করে।

উত্তর

  1. প্রকৃতপক্ষে, Hardware cache eventক্যাশে ডিভাইসের ইভেন্টগুলির "শর্টকাট" ( uboxইন্টেলের uncoreডিভাইসগুলির), যা প্রসেসর-নির্দিষ্ট এবং প্রোটোকলের মাধ্যমে অ্যাক্সেস করা যায় Raw hardware event descriptor। এবং Hardware eventআর্কিটেকচারের মধ্যে আরও স্থিতিশীল, যা আমি বুঝতে পেরেছি, coreডিভাইস থেকে ইভেন্টগুলির নাম দিন । 3.13কিছু অন্যান্য uncoreইভেন্ট এবং কাউন্টারে আমার কার্নেলটিতে অন্য কোনও "শর্টকাট" নেই । বাকি সমস্ত - Softwareএবং Tracepoints- কার্নেলের ইভেন্ট।

    আমি ভাবছি যদি core'র Hardware eventগুলি একই মাধ্যমে ব্যবহার করা হয় Raw hardware event descriptorপ্রোটোকল। তারা নাও থাকতে পারে - যেহেতু কাউন্টার / পিএমইউ বসেছে core, সম্ভবত এটি অন্যভাবে অ্যাক্সেস করা হয়েছে। উদাহরণস্বরূপ, সেই rdpmuনির্দেশের পরিবর্তে rdmsr, যা অ্যাক্সেস করে uncore। তবে এটি অতটা গুরুত্বপূর্ণ নয়।

  2. Kernel PMU eventকেবল ইভেন্টগুলি, যা রফতানি হয় sysfs। আমি জানি না এটি কীভাবে করা হয় (স্বয়ংক্রিয়ভাবে কার্নেল দ্বারা সিস্টেমে সমস্ত আবিষ্কারকৃত পিএমসি, বা কেবল কিছু হার্ড-কোডড, এবং আমি যদি যুক্ত করি kprobe- এটি কি রফতানি হয়? ইত্যাদি)। তবে মূল বক্তব্যটি হ'ল এগুলি হ'ল Hardware eventঅভ্যন্তরীণ perf_eventব্যবস্থায় বা অন্য কোনও হিসাবে একই ঘটনা ।

    এবং আমি জানি না সেগুলি কী

    $ ls /sys/devices/uncore_cbox_0/events
    clockticks
    

    আছে।

বিস্তারিত Kernel PMU event

কোডটির মাধ্যমে অনুসন্ধান করা বাড়ে:

$ ak "Kernel PMU" linux-source-3.13.0/tools/perf/
linux-source-3.13.0/tools/perf/util/pmu.c                                                            
629:                printf("  %-50s [Kernel PMU event]\n", aliases[j]);

- যা ফাংশন ঘটে

void print_pmu_events(const char *event_glob, bool name_only) {
   ...
        while ((pmu = perf_pmu__scan(pmu)) != NULL)
                list_for_each_entry(alias, &pmu->aliases, list) {...}
   ... 
   /* b.t.w. list_for_each_entry is an iterator
    * apparently, it takes a block of {code} and runs over some lost
    * Ruby built in kernel!
    */
    // then there is a loop over these aliases and
    loop{ ... printf("  %-50s [Kernel PMU event]\n", aliases[j]); ... }
}

এবং perf_pmu__scanএকই ফাইলে রয়েছে:

struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) {
    ...
                pmu_read_sysfs(); // that's what it calls
}

- যা একই ফাইলে রয়েছে:

/* Add all pmus in sysfs to pmu list: */
static void pmu_read_sysfs(void) {...}

এটাই.

উপর Hardware eventএবংHardware cache event

স্পষ্টতই, Hardware eventআইএএ -32 সফ্টওয়্যার বিকাশকারীর ম্যানুয়াল ভোল 3 বিতে 18.2.1.2, ইনটেল "প্রাক-সংজ্ঞায়িত আর্কিটেকচারাল পারফরম্যান্স ইভেন্টস" বলে যা এসেছে তা থেকে এসেছে। এবং ম্যানুয়ালটির "18.1 পারফরম্যান্স পর্যবেক্ষণ পর্যালোচনা" তাদের বর্ণনা করে:

পারফরম্যান্স মনিটরিং সক্ষমতা দ্বিতীয় শ্রেণিকে আর্কিটেকচারাল পারফরম্যান্স মনিটরিং হিসাবে উল্লেখ করা হয়। এই শ্রেণিটি উপলভ্য ইভেন্টগুলির একটি ছোট সেট সহ একই গণনা এবং বিঘ্ন-ভিত্তিক ইভেন্টের নমুনা ব্যবহারগুলিকে সমর্থন করে। আর্কিটেকচারাল পারফরম্যান্স ইভেন্টগুলির দৃশ্যমান আচরণ প্রসেসর বাস্তবায়নের ক্ষেত্রে সামঞ্জস্যপূর্ণ। আর্কিটেকচারাল পারফরম্যান্স মনিটরিং সক্ষমতা উপলব্ধতার সিপিইউইড.০ এএইচ ব্যবহার করে গণনা করা হয়। এই ঘটনাগুলি বিভাগের 18.2-এ আলোচনা করা হয়েছে।

- অন্য ধরণটি হ'ল:

ইন্টেল কোর সলো এবং ইন্টেল কোর ডুও প্রসেসর দিয়ে শুরু করে, পারফরম্যান্স মনিটরিং ক্যাপা-ক্ষমতাগুলির দুটি শ্রেণি রয়েছে। প্রথম শ্রেণি গণনা বা বিঘ্ন-ভিত্তিক ইভেন্টের নমুনা ব্যবহারের মাধ্যমে কর্মক্ষমতা পর্যবেক্ষণের জন্য ইভেন্টগুলিকে সমর্থন করে। এই ইভেন্টগুলি অ-স্থাপত্য এবং এক প্রসেসরের মডেল থেকে অন্যটিতে পরিবর্তিত হয় ...

এবং এই ইভেন্টগুলি আসলে অন্তর্নিহিত "কাঁচা" হার্ডওয়্যার ইভেন্টগুলির লিঙ্ক মাত্র, যা perfইউটিলিটির মাধ্যমে অ্যাক্সেস করা যেতে পারে Raw hardware event descriptor

এটি যাচাই করতে এখানে দেখুন linux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c:

/*
 * Intel PerfMon, used on Core and later.
 */
static u64 intel_perfmon_event_map[PERF_COUNT_HW_MAX] __read_mostly =
{
    [PERF_COUNT_HW_CPU_CYCLES]              = 0x003c,
    [PERF_COUNT_HW_INSTRUCTIONS]            = 0x00c0,
    [PERF_COUNT_HW_CACHE_REFERENCES]        = 0x4f2e,
    [PERF_COUNT_HW_CACHE_MISSES]            = 0x412e,
    ...
}

- এবং হুবহু 0x412e"টেবিল 18-1 এ পাওয়া গেছে।" এলএলসি মিসগুলি "এর জন্য পূর্বনির্ধারিত আর্কিটেকচারাল পারফরম্যান্স ইভেন্টগুলির জন্য ইউমাস্ক এবং ইভেন্ট সিলেক্ট এনকোডিংস:

Bit Position CPUID.AH.EBX | Event Name | UMask | Event Select
...
                        4 | LLC Misses | 41H   | 2EH

- Hহেক্সের জন্য। সমস্ত 7 স্ট্রাকচারে রয়েছে, আরও প্লাস [PERF_COUNT_HW_REF_CPU_CYCLES] = 0x0300, /* pseudo-encoding *। (নামকরণটি কিছুটা আলাদা, ঠিকানাগুলি একই)

এর পরে Hardware cache eventকাঠামোগুলিতে (একই ফাইলে) রয়েছে:

static __initconst const u64 snb_hw_cache_extra_regs
                            [PERF_COUNT_HW_CACHE_MAX]
                            [PERF_COUNT_HW_CACHE_OP_MAX]
                            [PERF_COUNT_HW_CACHE_RESULT_MAX] =
{...}

- বেলে সেতুর জন্য কোনটি হওয়া উচিত?

এর মধ্যে একটি - snb_hw_cache_extra_regs[LL][OP_WRITE][RESULT_ACCESS]পূর্ণ SNB_DMND_WRITE|SNB_L3_ACCESS, যেখানে উপরের ডিএফ-এস থেকে:

#define SNB_L3_ACCESS           SNB_RESP_ANY
#define SNB_RESP_ANY            (1ULL << 16)                                                                            
#define SNB_DMND_WRITE          (SNB_DMND_RFO|SNB_LLC_RFO)
#define SNB_DMND_RFO            (1ULL << 1)
#define SNB_LLC_RFO             (1ULL << 8)

যার সমান হওয়া উচিত 0x00010102, তবে কিছু টেবিলে এটি কীভাবে পরীক্ষা করতে হয় তা আমি জানি না।

এবং এটি এটি কীভাবে ব্যবহৃত হয় তা একটি ধারণা দেয় perf_events:

$ ak hw_cache_extra_regs linux-source-3.13.0/arch/x86/kernel/cpu/
linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.c
50:u64 __read_mostly hw_cache_extra_regs
292:    attr->config1 = hw_cache_extra_regs[cache_type][cache_op][cache_result];

linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.h
521:extern u64 __read_mostly hw_cache_extra_regs

linux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c
272:static __initconst const u64 snb_hw_cache_extra_regs
567:static __initconst const u64 nehalem_hw_cache_extra_regs
915:static __initconst const u64 slm_hw_cache_extra_regs
2364:       memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2365:              sizeof(hw_cache_extra_regs));
2407:       memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs,
2408:              sizeof(hw_cache_extra_regs));
2424:       memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2425:              sizeof(hw_cache_extra_regs));
2452:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2453:              sizeof(hw_cache_extra_regs));
2483:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2484:              sizeof(hw_cache_extra_regs));
2516:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, sizeof(hw_cache_extra_regs));
$

memcpyগুলি মাধ্যমে বলা হচ্ছে __init int intel_pmu_init(void) {... case:...}

কেবল attr->config1কিছুটা বিজোড়। তবে এটি সেখানে রয়েছে perf_event_attr(একই linux-source-3.13.0/include/uapi/linux/perf_event.hফাইল):

...
    union {
            __u64           bp_addr;
            __u64           config1; /* extension of config */                                                      
    };
    union {
            __u64           bp_len;
            __u64           config2; /* extension of config1 */
    };
...

তারা কার্নেলের perf_eventsসিস্টেমে কল সহ int perf_pmu_register(struct pmu *pmu, const char *name, int type)(সংজ্ঞায়িত linux-source-3.13.0/kernel/events/core.c:) নিবন্ধভুক্ত রয়েছে :

  • static int __init init_hw_perf_events(void)(ফাইল arch/x86/kernel/cpu/perf_event.c) কল সহperf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW);

  • static int __init uncore_pmu_register(struct intel_uncore_pmu *pmu)কল সহ (ফাইল arch/x86/kernel/cpu/perf_event_intel_uncore.c, এছাড়াও আছে arch/x86/kernel/cpu/perf_event_amd_uncore.c)ret = perf_pmu_register(&pmu->pmu, pmu->name, -1);

সুতরাং পরিশেষে, সমস্ত ইভেন্টগুলি হার্ডওয়্যার থেকে আসে এবং সবকিছু ঠিক আছে। তবে এখানে একটি খেয়াল করতে পারে: কেন আমাদের LLC-loadsমধ্যে রয়েছে perf listএবং না ubox1 LLC-loads, যেহেতু এগুলি এইচডাব্লু ইভেন্ট এবং এগুলি সত্যই uboxএসএস থেকে আসে ?

এটি perfইউটিলিটি এবং এর perf_evselকাঠামোর একটি বিষয় : যখন আপনি আপনার কাছ থেকে এইচডাব্লু ইভেন্টের জন্য অনুরোধ করেন তখন কোনও perfপ্রসেসর আপনি এটি চান তা ইভেন্টটিকে সংজ্ঞায়িত করে (ডিফল্ট সবই থাকে), এবং এটি perf_evselঅনুরোধকৃত ইভেন্ট এবং প্রসেসরের সাথে সেট আপ করে , তখন সমষ্টিগতভাবে হয় সমস্ত প্রসেসরের কাছ থেকে কাউন্টারগুলি যোগ করে perf_evsel(বা তাদের সাথে কিছু অন্যান্য পরিসংখ্যান করে)।

এটি এটিকে দেখতে পাবেন tools/perf/builtin-stat.c:

/*
 * Read out the results of a single counter:
 * aggregate counts across CPUs in system-wide mode
 */
static int read_counter_aggr(struct perf_evsel *counter)
{
    struct perf_stat *ps = counter->priv;
    u64 *count = counter->counts->aggr.values;
    int i;

    if (__perf_evsel__read(counter, perf_evsel__nr_cpus(counter),
                           thread_map__nr(evsel_list->threads), scale) < 0)
            return -1;

    for (i = 0; i < 3; i++)
            update_stats(&ps->res_stats[i], count[i]);

    if (verbose) {
            fprintf(output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
                    perf_evsel__name(counter), count[0], count[1], count[2]);
    }

    /*
     * Save the full runtime - to allow normalization during printout:
     */
    update_shadow_stats(counter, count);

    return 0;
}

(সুতরাং, ইউটিলিটির জন্য perfএকটি "একক কাউন্টার" এমনকি একটি নয় perf_event_attrযা একটি সাধারণ ফর্ম, এসডাব্লু এবং এইচডাব্লু উভয় ইভেন্টের জন্য উপযুক্ত, এটি আপনার প্রশ্নের একটি ইভেন্ট - একই ইভেন্টগুলি বিভিন্ন ডিভাইস থেকে আসতে পারে এবং সেগুলি একত্রিত করা হয়) ।)

এছাড়াও একটি নোটিশ: struct perf_evselকেবলমাত্র 1 টি রয়েছে struct perf_evevent_attrতবে এর একটি ক্ষেত্রও রয়েছে struct perf_evsel *leader;- এটি নেস্টেড। "ইভেন্টগুলির গ্রুপ" এর একটি বৈশিষ্ট্য রয়েছে perf_events, যখন আপনি একসাথে কয়েকটি কাউন্টার পাঠাতে পারেন, যাতে তাদের একে অপরের সাথে তুলনা করা যায় ইত্যাদি। নিশ্চিত হতে পারছি না কিভাবে এটা থেকে স্বাধীন ঘটনা সঙ্গে কাজ করে kernel, core, ubox। কিন্তু এই নীড় perf_evselএটি। এবং সম্ভবত, perfবেশ কয়েকটি ইভেন্টের একসাথে একসাথে পরিচালনা করে।

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