Googling और acking खत्म हो गया है! मुझे कुछ जवाब मिला है।
लेकिन सबसे पहले मुझे प्रश्न के उद्देश्य को थोड़ा और स्पष्ट करना चाहिए: मैं स्पष्ट रूप से सिस्टम में स्वतंत्र प्रक्रियाओं और उनके प्रदर्शन काउंटरों को अलग करना चाहता हूं। उदाहरण के लिए, एक प्रोसेसर का एक कोर, एक अनकोर डिवाइस (इसके बारे में हाल ही में सीखा), प्रोसेसर पर कर्नेल या उपयोगकर्ता अनुप्रयोग, एक बस (= बस नियंत्रक), एक हार्ड ड्राइव सभी स्वतंत्र प्रक्रियाएं हैं, वे एक घड़ी द्वारा सिंक्रनाइज़ नहीं किए जाते हैं । और आजकल शायद उन सभी के पास कुछ प्रोसेस मॉनिटरिंग काउंटर (PMC) हैं। मैं यह समझना चाहूंगा कि काउंटर किन प्रक्रियाओं से आते हैं। (यह googling में भी सहायक है: किसी चीज़ के "विक्रेता" इसे बेहतर बनाते हैं।)
इसके अलावा, गियर खोज के लिए इस्तेमाल किया: 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(पढ़ पीएमसी) अनुदेश; uncore, के बाद से इन उपकरणों के हाथ में वास्तविक प्रोसेसर पर निर्भर करते हैं, मॉडल विशिष्ट रजिस्टर (MSR) के माध्यम से के माध्यम से पहुंचा जा सकता है rdmsr(स्वाभाविक रूप से);
जाहिरा तौर पर, उनके साथ वर्कफ़्लो रजिस्टर के जोड़े के माध्यम से किया जाता है - 1 रजिस्टर सेट जो काउंटर काउंट की घटनाओं, 2 रजिस्टर काउंटर में मूल्य है; काउंटर को केवल 1 नहीं, घटनाओं के एक समूह के बाद वेतन वृद्धि के लिए कॉन्फ़िगर किया जा सकता है; + इन काउंटर्स में कुछ अंतर / तकनीकी नोटिंग ओवरफ्लो हैं;
इंटेल के "IA-32 सॉफ़्टवेयर डेवलपर के मैनुअल Vol 3B" अध्याय 18 में "परफॉरमेंस मॉनिटरिंग" में एक और मिल सकता है;
इसके अलावा, uncore"आर्किटेक्चरल परफॉर्मेंस मॉनिटरिंग वर्जन 1" वर्जन के लिए MSR का फॉर्मेट इन PMCs के लिए बहुत अच्छा है (मैनुअल में वर्जन 1-4 हैं, मुझे नहीं पता कि मेरा प्रोसेसर कौन सा है) "चित्र 18-1 में वर्णित है।" IA32_PERFEVTSELx MSRs "(पृष्ठ 18-3 मेरा), और अनुभाग" 18.2.1.2 पूर्व-परिभाषित वास्तुकला प्रदर्शन घटनाएँ "" तालिका 18-1 के साथ। UMask और घटना का चयन पूर्व-परिभाषित वास्तुकला प्रदर्शन घटनाओं के लिए एन्कोडिंग ", जो दिखाता है। जो घटनाओं के रूप 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फ़ील्ड है - यह CPU-विशिष्ट ईवेंट परिभाषा (उन इंटेल के आंकड़ों पर वर्णित प्रारूप में 64 बिट शब्द) या कर्नेल की घटना दोनों को पकड़ सकता है
कॉन्फ़िगरेशन शब्द का MSB इंगित करता है कि बाकी में [कच्चा सीपीयू या कर्नेल की घटना है]
कर्नेल का ईवेंट 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 प्रदर्शनकारी अवलोकन" उन्हें इस प्रकार बताता है:
प्रदर्शन निगरानी क्षमताओं का दूसरा वर्ग वास्तु प्रदर्शन निगरानी के रूप में जाना जाता है। यह वर्ग उपलब्ध गणनाओं के एक छोटे समूह के साथ एक ही गणना और इंटरप्ट-आधारित ईवेंट नमूनाकरण का समर्थन करता है। वास्तु प्रदर्शन की घटनाओं का दृश्य व्यवहार प्रोसेसर कार्यान्वयन के अनुरूप है। सीपीयूआईडी.0 एएएच का उपयोग करके वास्तु प्रदर्शन निगरानी क्षमताओं की उपलब्धता की गणना की जाती है। इन घटनाओं की चर्चा धारा 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 में पाया जाता है।" LLC Misses "के लिए प्री-डिफाइंड आर्किटेक्चरल परफॉर्मेंस इवेंट्स के लिए UMask और इवेंट सिलेक्ट एनकोडिंग्स:"
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 events जैसी संरचनाओं में हैं (उसी फ़ाइल में):
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, क्योंकि ये HW घटनाओं हैं और वे वास्तव में से आते हैं 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, जो एक सामान्य रूप है, जो SW और HW दोनों घटनाओं को फिट करता है, यह आपकी क्वेरी की एक घटना है - एक ही घटना विभिन्न उपकरणों से आ सकती है और वे एकत्रित होती हैं ।)
साथ ही एक सूचना: struct perf_evselइसमें केवल 1 शामिल है struct perf_evevent_attr, लेकिन इसमें एक फ़ील्ड भी है struct perf_evsel *leader;- यह नेस्टेड है। perf_eventsजब आप एक साथ काउंटरों का एक समूह भेज सकते हैं, तो "(पदानुक्रमित) घटनाओं के समूहों" की एक विशेषता है । सुनिश्चित नहीं हैं कि यह कैसे से स्वतंत्र घटनाओं के साथ काम करता kernel, core, ubox। लेकिन यह घोंसला perf_evselहै। और, सबसे अधिक संभावना है, कि perfएक साथ कई घटनाओं की क्वेरी का प्रबंधन कैसे किया जाता है।