Perf_events सूची में कर्नेल PMU घटना-एस क्या हैं?


12

के लिए खोज क्या एक के साथ निगरानी कर सकते हैं 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आइटम।

पूर्ण विकी ट्यूटोरियल और ब्रेंडन ग्रेग के पेज से मुझे वह मिलता है:

  • Tracepointsसबसे स्पष्ट हैं - ये कर्नेल स्रोत पर मैक्रोज़ हैं, जो निगरानी के लिए एक जांच बिंदु बनाते हैं, इन्हें ftraceप्रोजेक्ट के साथ पेश किया गया था और अब इसका उपयोग हर कोई करता है
  • Software कर्नेल के निम्न स्तर के काउंटर और कुछ आंतरिक डेटा-संरचनाएं हैं (इसलिए, वे ट्रेसप्वाइंट से भिन्न हैं)
  • Hardware eventकुछ बहुत ही मूल CPU ईवेंट हैं, जो सभी आर्किटेक्चर पर पाए जाते हैं और किसी भी तरह कर्नेल द्वारा आसानी से एक्सेस किए जाते हैं
  • 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]
    

    एक हार्डवेयर सुविधा है, जो संभवतः अधिकांश आधुनिक आर्किटेक्चर के लिए सामान्य है, और डीबगर में ब्रेकपॉइंट के रूप में काम करता है? (शायद यह किसी भी तरह से googlable है)

  • अंत में, Kernel PMU eventमैं Google पर प्रबंधन नहीं करता;

    यह ब्रेंडन के पूर्ण पृष्ठ के घटनाक्रम की सूची में भी दिखाई नहीं देता है , इसलिए यह नया है?

    शायद यह विशेष रूप से PMU से हार्डवेयर घटनाओं के लिए सिर्फ उपनाम है? (उपयोग में आसानी के लिए इसे उपनाम के अलावा घटनाओं की सूची में एक अलग अनुभाग मिला।) वास्तव में, शायद 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की पूरी सूची के साथ (ट्रेसप्वाइंट नहीं दिखाए गए हैं, लेकिन उनमें से सभी 1374 हैं)Kernel PMU eventHardware 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 ]

जवाबों:


12

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उपयोगिता सभी या विशेष रूप से सीपीयू को एक घटना कैसे प्रदान करती है।

उत्तर

  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 प्रदर्शनकारी अवलोकन" उन्हें इस प्रकार बताता है:

प्रदर्शन निगरानी क्षमताओं का दूसरा वर्ग वास्तु प्रदर्शन निगरानी के रूप में जाना जाता है। यह वर्ग उपलब्ध गणनाओं के एक छोटे समूह के साथ एक ही गणना और इंटरप्ट-आधारित ईवेंट नमूनाकरण का समर्थन करता है। वास्तु प्रदर्शन की घटनाओं का दृश्य व्यवहार प्रोसेसर कार्यान्वयन के अनुरूप है। सीपीयूआईडी.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एक साथ कई घटनाओं की क्वेरी का प्रबंधन कैसे किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.