Googling और ack
ing खत्म हो गया है! मुझे कुछ जवाब मिला है।
लेकिन सबसे पहले मुझे प्रश्न के उद्देश्य को थोड़ा और स्पष्ट करना चाहिए: मैं स्पष्ट रूप से सिस्टम में स्वतंत्र प्रक्रियाओं और उनके प्रदर्शन काउंटरों को अलग करना चाहता हूं। उदाहरण के लिए, एक प्रोसेसर का एक कोर, एक अनकोर डिवाइस (इसके बारे में हाल ही में सीखा), प्रोसेसर पर कर्नेल या उपयोगकर्ता अनुप्रयोग, एक बस (= बस नियंत्रक), एक हार्ड ड्राइव सभी स्वतंत्र प्रक्रियाएं हैं, वे एक घड़ी द्वारा सिंक्रनाइज़ नहीं किए जाते हैं । और आजकल शायद उन सभी के पास कुछ प्रोसेस मॉनिटरिंग काउंटर (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 event
s जैसी संरचनाओं में हैं (उसी फ़ाइल में):
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
एक साथ कई घटनाओं की क्वेरी का प्रबंधन कैसे किया जाता है।