Received: by 10.223.164.202 with SMTP id h10csp294892wrb; Mon, 6 Nov 2017 06:47:52 -0800 (PST) X-Google-Smtp-Source: ABhQp+Q4WlDDJrh/bAlU6uPjQrtAw27PC+BvgFMvxrmgV4CV3otPrb+ya9h4IN56qGLyluu+dRz7 X-Received: by 10.98.252.3 with SMTP id e3mr16897348pfh.136.1509979672755; Mon, 06 Nov 2017 06:47:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1509979672; cv=none; d=google.com; s=arc-20160816; b=hcYxbrZU6pgKF6OvDhLgEaXfIqcTvvYcO1K8a+HQRu1YAO3PXoVkNOjdwyeJpw1MZu iS9S5TFTVE9dqPNXTiTZJWFVmH372ubV9R3I+t0Nvif2UxD7D6Uj5zrpxCcJksH38PgW WlW1aDFc14z/Rrg+IZK0d5kMdtcKbzrgitGvrv82BQBO/H8ePkPJdQYTfZqCSaJuuEWx 3isMjwYOdQUAUXd10/msF0PVqSAGorY4zc4eds6+tfgqleNjw0NiDK3dn4iLkUP4yr1j MZHATNUGqvR5hx0aaIKxE1aOepZOocvEZroBtzf4fy9AkQypyHMq7AGa3eIuLJ9iavAL Xxow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :dlp-reaction:dlp-version:dlp-product:content-language :accept-language:in-reply-to:references:message-id:date:thread-index :thread-topic:subject:cc:to:from:arc-authentication-results; bh=JFOqTHKMgjGTk3YV0gy0d2FLkIiCY0ugMyP2KgTlvvU=; b=i+U/De79ks/KV5O1SdYnXMmF3xyaSlWtyhRBmTtdcTsLMJjBanYHHsUarUPCdt0QhV QdGUEvHq3YTg/vIOqoogbUbWu6mOu+2CB8uMdl5vjtTr79Pw95QaOOa6p01VoxrgKs17 hnUMfkjOfG+8aCyE4sxLpF0+r4Nt6ZtJUHCB43We0HMj0qCqftcbLL0KZU5zGYZsOWHP XDEMmfr/XsN1kKsey5NC+7YL80zHVbqQLz2hme5E6N+L8rFwmyAB/zmNdL6YfqtJqrh9 A3TRrDGf7r3k/Tb53mevWxmIwWcy5lcuUcIE7cwmO0YfaZ630rw+/rnUOyAm8FgehdL7 kaYQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v124si11162560pgb.493.2017.11.06.06.47.38; Mon, 06 Nov 2017 06:47:52 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932519AbdKFOpA convert rfc822-to-8bit (ORCPT + 97 others); Mon, 6 Nov 2017 09:45:00 -0500 Received: from mga05.intel.com ([192.55.52.43]:30072 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753599AbdKFOo6 (ORCPT ); Mon, 6 Nov 2017 09:44:58 -0500 Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP; 06 Nov 2017 06:44:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,352,1505804400"; d="scan'208";a="169938954" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga005.jf.intel.com with ESMTP; 06 Nov 2017 06:44:57 -0800 Received: from fmsmsx113.amr.corp.intel.com (10.18.116.7) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 6 Nov 2017 06:44:56 -0800 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by FMSMSX113.amr.corp.intel.com (10.18.116.7) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 6 Nov 2017 06:44:55 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.213]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.159]) with mapi id 14.03.0319.002; Mon, 6 Nov 2017 22:44:53 +0800 From: "Liang, Kan" To: "eranian@google.com" , "acme@kernel.org" , "peterz@infradead.org" , "linux-kernel@vger.kernel.org" , "mingo@redhat.com" CC: "jolsa@kernel.org" , "ak@linux.intel.com" , "Williams, Dan J" Subject: RE: [PATCH V2] perf script: add script to profile and resolve physical mem type Thread-Topic: [PATCH V2] perf script: add script to profile and resolve physical mem type Thread-Index: AQHTTd4TIJZdwMdEMU6VrilGLG4DTqMHfV2Q Date: Mon, 6 Nov 2017 14:44:53 +0000 Message-ID: <37D7C6CF3E00A74B8858931C1DB2F077537DDAF2@SHSMSX103.ccr.corp.intel.com> References: <1508969363-351481-1-git-send-email-kan.liang@intel.com> In-Reply-To: <1508969363-351481-1-git-send-email-kan.liang@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZWMzYTViNjktY2U1NS00MWE0LWI0YWEtNWE2NjA2MTMzMDZiIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE2LjUuOS4zIiwiVHJ1c3RlZExhYmVsSGFzaCI6Ik52aEZOMTFGcmZJaFA2VVlmZ0QrOFpXOVQyMkdScFJKZ1Npb29sU2VtSm89In0= x-ctpclassification: CTP_IC dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Stephane, Any comments for the script? Thanks, Kan > > From: Kan Liang > > There could be different types of memory in the system. E.g normal > System Memory, Persistent Memory. To understand how the workload maps > to > those memories, it's important to know the I/O statistics of them. > Perf can collect physical addresses, but those are raw data. > It still needs extra work to resolve the physical addresses. > Provide a script to facilitate the physical addresses resolving and > I/O statistics. > > Profile with MEM_INST_RETIRED.ALL_LOADS or > MEM_UOPS_RETIRED.ALL_LOADS > event if any of them is available. > Look up the /proc/iomem and resolve the physical address. > Provide memory type summary. > > Here is an example output. > #perf script report mem-phys-addr > Event: mem_inst_retired.all_loads:P > Memory type count percentage > ---------------------------------------- ----------- ----------- > System RAM 74 53.2% > Persistent Memory 55 39.6% > N/A 10 7.2% > > Signed-off-by: Kan Liang > --- > > Changes since V1: > - Do not mix DLA and Load Latency. Do not compare the loads and stores. > Only profile the loads. > - Use event name to replace the RAW event > > tools/perf/scripts/python/bin/mem-phys-addr-record | 19 +++++ > tools/perf/scripts/python/bin/mem-phys-addr-report | 3 + > tools/perf/scripts/python/mem-phys-addr.py | 97 > ++++++++++++++++++++++ > .../util/scripting-engines/trace-event-python.c | 2 + > 4 files changed, 121 insertions(+) > create mode 100644 tools/perf/scripts/python/bin/mem-phys-addr-record > create mode 100644 tools/perf/scripts/python/bin/mem-phys-addr-report > create mode 100644 tools/perf/scripts/python/mem-phys-addr.py > > diff --git a/tools/perf/scripts/python/bin/mem-phys-addr-record > b/tools/perf/scripts/python/bin/mem-phys-addr-record > new file mode 100644 > index 0000000..5a87512 > --- /dev/null > +++ b/tools/perf/scripts/python/bin/mem-phys-addr-record > @@ -0,0 +1,19 @@ > +#!/bin/bash > + > +# > +# Profiling physical memory by all retired load instructions/uops event > +# MEM_INST_RETIRED.ALL_LOADS or MEM_UOPS_RETIRED.ALL_LOADS > +# > + > +load=`perf list | grep mem_inst_retired.all_loads` > +if [ -z "$load" ]; then > + load=`perf list | grep mem_uops_retired.all_loads` > +fi > +if [ -z "$load" ]; then > + echo "There is no event to count all retired load instructions/uops." > + exit 1 > +fi > + > +arg=$(echo $load | tr -d ' ') > +arg="$arg:P" > +perf record --phys-data -e $arg $@ > diff --git a/tools/perf/scripts/python/bin/mem-phys-addr-report > b/tools/perf/scripts/python/bin/mem-phys-addr-report > new file mode 100644 > index 0000000..3f2b847 > --- /dev/null > +++ b/tools/perf/scripts/python/bin/mem-phys-addr-report > @@ -0,0 +1,3 @@ > +#!/bin/bash > +# description: resolve physical address samples > +perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/mem-phys-addr.py > diff --git a/tools/perf/scripts/python/mem-phys-addr.py > b/tools/perf/scripts/python/mem-phys-addr.py > new file mode 100644 > index 0000000..1d1f757 > --- /dev/null > +++ b/tools/perf/scripts/python/mem-phys-addr.py > @@ -0,0 +1,97 @@ > +# mem-phys-addr.py: Resolve physical address samples > +# Copyright (c) 2017, Intel Corporation. > +# > +# This program is free software; you can redistribute it and/or modify it > +# under the terms and conditions of the GNU General Public License, > +# version 2, as published by the Free Software Foundation. > +# > +# This program is distributed in the hope it will be useful, but WITHOUT > +# ANY WARRANTY; without even the implied warranty of > MERCHANTABILITY or > +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > for > +# more details. > + > +from __future__ import division > +import os > +import sys > +import struct > +import re > +import bisect > +import collections > + > +sys.path.append(os.environ['PERF_EXEC_PATH'] + \ > + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') > + > +system_ram = [] > +pmem = [] > +f = None > +load_mem_type_cnt = collections.Counter() > +event_name = None > + > +def parse_iomem(): > + global f > + f = open('/proc/iomem', 'r') > + for i, j in enumerate(f): > + m = re.split('-|:',j,2) > + if m[2].strip() == 'System RAM': > + system_ram.append(long(m[0], 16)) > + system_ram.append(long(m[1], 16)) > + if m[2].strip() == 'Persistent Memory': > + pmem.append(long(m[0], 16)) > + pmem.append(long(m[1], 16)) > + > +def print_memory_type(): > + print "Event: %s" % (event_name) > + print "%-40s %10s %10s\n" % ("Memory type", "count", > "percentage"), > + print "%-40s %10s %10s\n" % ("----------------------------------------", \ > + "-----------", "-----------"), > + total = sum(load_mem_type_cnt.values()) > + for mem_type, count in sorted(load_mem_type_cnt.most_common(), > \ > + key = lambda(k, v): (v, k), reverse = > True): > + print "%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * > count / total), > + > +def trace_begin(): > + parse_iomem() > + > +def trace_end(): > + print_memory_type() > + f.close() > + > +def is_system_ram(phys_addr): > + #/proc/iomem is sorted > + position = bisect.bisect(system_ram, phys_addr) > + if position % 2 == 0: > + return False > + return True > + > +def is_persistent_mem(phys_addr): > + position = bisect.bisect(pmem, phys_addr) > + if position % 2 == 0: > + return False > + return True > + > +def find_memory_type(phys_addr): > + if phys_addr == 0: > + return "N/A" > + if is_system_ram(phys_addr): > + return "System RAM" > + > + if is_persistent_mem(phys_addr): > + return "Persistent Memory" > + > + #slow path, search all > + f.seek(0, 0) > + for j in f: > + m = re.split('-|:',j,2) > + if long(m[0], 16) <= phys_addr <= long(m[1], 16): > + return m[2] > + return "N/A" > + > +def process_event(param_dict): > + name = param_dict["ev_name"] > + sample = param_dict["sample"] > + phys_addr = sample["phys_addr"] > + > + global event_name > + if event_name == None: > + event_name = name > + load_mem_type_cnt[find_memory_type(phys_addr)] += 1 > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c > b/tools/perf/util/scripting-engines/trace-event-python.c > index c7187f0..8cd6317 100644 > --- a/tools/perf/util/scripting-engines/trace-event-python.c > +++ b/tools/perf/util/scripting-engines/trace-event-python.c > @@ -500,6 +500,8 @@ static PyObject *get_perf_sample_dict(struct > perf_sample *sample, > PyLong_FromUnsignedLongLong(sample->time)); > pydict_set_item_string_decref(dict_sample, "period", > PyLong_FromUnsignedLongLong(sample->period)); > + pydict_set_item_string_decref(dict_sample, "phys_addr", > + PyLong_FromUnsignedLongLong(sample- > >phys_addr)); > set_sample_read_in_dict(dict_sample, sample, evsel); > pydict_set_item_string_decref(dict, "sample", dict_sample); > > -- > 2.7.4 From 1582269168036921833@xxx Wed Oct 25 22:11:07 +0000 2017 X-GM-THRID: 1582269168036921833 X-Gmail-Labels: Inbox,Category Forums