গুগলিং এবং 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
ইউটিলিটি সমস্ত বা নির্দিষ্ট সিপিইউগুলিকে একটি ইভেন্ট বরাদ্দ করে।
উত্তর
প্রকৃতপক্ষে, 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
। তবে এটি অতটা গুরুত্বপূর্ণ নয়।
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
বেশ কয়েকটি ইভেন্টের একসাথে একসাথে পরিচালনা করে।