All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Richter <tmricht@linux.ibm.com>
To: Ian Rogers <irogers@google.com>
Cc: "linux-perf-use." <linux-perf-users@vger.kernel.org>,
	Jan Polensky <japo@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>
Subject: Re: [linux-next] perf report runtime extremely long
Date: Thu, 30 Oct 2025 09:59:58 +0100	[thread overview]
Message-ID: <13800bed-1256-4414-ac8b-e99439c748ec@linux.ibm.com> (raw)
In-Reply-To: <CAP-5=fXi=EDU7-tdNLwTKbCHR80_p3=TAe0qF0oE-tXbx35znw@mail.gmail.com>

On 10/29/25 17:47, Ian Rogers wrote:
> On Wed, Oct 29, 2025 at 9:12 AM Thomas Richter <tmricht@linux.ibm.com> wrote:
>>
>> On 10/29/25 09:03, Thomas Richter wrote:
>>> Hi all,
>>>
>>> has something changed recently in perf report in linux-next repo?
>>>
>>> I run perf report -i <file> -D | grep something
>>> on s390 with 2 different kernels:
>>>
>>> master 6.18.0rc3:
>>> # uname -a
>>> Linux a35lp67.lnxne.boe 6.18.0-rc3m-perf+ #23 SMP Tue Oct 28 15:53:44 CET 2025 s390x GNU/Linux
>>> # ll /tmp/perf2-eSso2q-2
>>> -rw------- 1 root root 8538184 Oct 29 08:44 /tmp/perf2-eSso2q-2
>>> # time perf report -i/tmp/perf2-eSso2q-2 -D | grep Counter:000 > /dev/null
>>>
>>> real  0m22.262s
>>> user  0m22.068s
>>> sys   0m0.200s
>>> #
>>>
>>> This runtime is ok for the perf.data file size.
>>>
>>> linux-next:
>>> # uname -a
>>> Linux s83lp47.lnxne.boe 6.18.0-20251028.rc3.git141.f7d2388eeec2.63.fc42.s390x+next #1 SMP Tue Oct 28 20:06:13 CET 2025 s390x GNU/Linux
>>> #ll /tmp/perf2-eSso2q-2
>>> -rw-------. 1 root root 8538184 Oct 29 08:47 /tmp/perf2-eSso2q-2
>>> # time perf report -i/tmp/perf2-eSso2q-2 -D | grep Counter:000 > /dev/null
>>>
>>> real  2m53.601s
>>> user  2m52.938s
>>> sys   0m0.575s
>>> #
>>>
>>> Same perf.data file and run time increased from 22 seconds to nearly 300 seconds, roughly 14 times longer
>>> for the same input!
>>>
>>> Has anybody similar observations?
>>>
>>> Thanks a lot
>>>
>>
>> Ian,
>>
>> sorry sent button pushed too early...
>>
>> here is a second try without option -D.
>>
>> This is much better:
>>
>> root in 🌐 s83lp47 in ~
>> ❯ ll perf1.data
>> -rw-------. 1 root root 99692290 Oct 29 16:17 perf1.data
>>
>> root in 🌐 s83lp47 in ~
>> ❯ time perf record -- perf report -i perf1.data  > /dev/null
>> [ perf record: Woken up 1 times to write data ]
>> [ perf record: Captured and wrote 0.027 MB perf.data (246 samples) ]
>>
>> real    0m1.097s
>> user    0m0.082s
>> sys     0m0.167s
>>
>> root in 🌐 s83lp47 in ~
>> ❯ perf report --stdio
>> # To display the perf.data header info, please use --header/--header-only options.
>> #
>> #
>> # Total Lost Samples: 0
>> #
>> # Samples: 246  of event 'cpum_cf/cycles/P'
>> # Event count (approx.): 307500000
>> #
>> # Overhead  Command  Shared Object        Symbol
>> # ........  .......  ...................  ..................................................
>> #
>>      9.35%  perf     perf                 [.] reader__read_event
>>      4.47%  perf     perf                 [.] perf_env__arch
>>      2.85%  perf     ld64.so.1            [.] _dl_relocate_object_no_relro
>>      2.44%  perf     ld64.so.1            [.] _dl_lookup_symbol_x
>>      2.44%  perf     ld64.so.1            [.] do_lookup_x
>>      2.44%  perf     perf                 [.] down_read
>>      2.03%  perf     perf                 [.] hists__findnew_entry
>>      2.03%  perf     perf                 [.] perf_hpp__is_dynamic_entry
>>      1.63%  perf     [kernel.kallsyms]    [k] __s390_indirect_jump_r14
>>      1.63%  perf     [kernel.kallsyms]    [k] format_decode
>>      1.63%  perf     libc.so.6            [.] cfree@GLIBC_2.2
>>      1.63%  perf     perf                 [.] evsel__parse_sample
>>      1.63%  perf     perf                 [.] map__put
>>      1.63%  perf     perf                 [.] sort__comm_cmp
>>      1.63%  perf     perf                 [.] thread__put
>>      1.22%  perf     [kernel.kallsyms]    [k] folio_add_file_rmap_ptes
>>      1.22%  perf     [kernel.kallsyms]    [k] get_page_from_freelist
>>      1.22%  perf     ld64.so.1            [.] _dl_name_match_p
>>      1.22%  perf     perf                 [.] dump_printf
>>      1.22%  perf     perf                 [.] evlist__event2evsel
>>      1.22%  perf     perf                 [.] hashmap_find
>>      1.22%  perf     perf                 [.] perf_session__deliver_event
> 
> Hmm.. for perf_env__arch we could probably cache better:
> ```
> diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
> index f1626d2032cd..2591f71c7c42 100644
> --- a/tools/perf/util/env.c
> +++ b/tools/perf/util/env.c
> @@ -593,17 +593,27 @@ static const char *normalize_arch(char *arch)
> 
> const char *perf_env__arch(struct perf_env *env)
> {
> -       char *arch_name;
> +       if (env && env->arch && env->arch_name_normalized)
> +               return env->arch;
> 
>        if (!env || !env->arch) { /* Assume local operation */
>                static struct utsname uts = { .machine[0] = '\0', };
>                if (uts.machine[0] == '\0' && uname(&uts) < 0)
>                        return NULL;
> -               arch_name = uts.machine;
> -       } else
> -               arch_name = env->arch;
> 
> -       return normalize_arch(arch_name);
> +               if (!env)
> +                       return normalize_arch(uts.machine);
> +
> +               env->arch = strdup(normalize_arch(uts.machine));
> +               env->arch_name_normalized = true;
> +       } else {
> +               char *normalized = strdup(normalize_arch(env->arch));
> +
> +               free(env->arch);
> +               env->arch = normalized;
> +               env->arch_name_normalized = true;
> +       }
> +       return env->arch;
> }
> 
> #if defined(HAVE_LIBTRACEEVENT)
> diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
> index 9977b85523a8..da20bc3810bd 100644
> --- a/tools/perf/util/env.h
> +++ b/tools/perf/util/env.h
> @@ -61,6 +61,7 @@ struct perf_env {
>        char                    *os_release;
>        char                    *version;
>        char                    *arch;
> +       bool                    arch_name_normalized;
>        int                     nr_cpus_online;
>        int                     nr_cpus_avail;
>        char                    *cpu_desc;
> ```
> or just force the normalize before assignment.
> 
> For reader__read_event and the perf_env these changes may be relevant:
> "perf sample: Remove arch notion of sample parsing"
> https://lore.kernel.org/r/20250724163302.596743-21-irogers@google.com
> "perf env: Remove global perf_env"
> https://lore.kernel.org/r/20250724163302.596743-20-irogers@google.com
> 
> I wonder if for some reason the env is NULL in your cases, so we go
> slow path a lot.
> 
> The histogram stuff, Namhyung may know more.
> 
> Thanks!
> Ian
> 

Thanks Ian,

I tested your patch, but there is no big difference:
root in 🌐 s83lp47 in ~ 
❯ ll ~/perf.data-test
-rw-------. 1 root root 152280778 Oct 30 07:58 /root/perf.data-test

here is the output with your patch:
root in 🌐 s83lp47 in ~ 
❯ time mirror-linux-next/tools/perf/perf report -D -i ~/perf.data-test > /dev/null

real	46m26.350s
user	46m17.559s
sys	0m7.434s


Here is the output from the linux-next perf version:

root in 🌐 s83lp47 in ~ took 46m26s 
❯ time perf report -D -i ~/perf.data-test > /dev/null

real	49m14.364s
user	49m4.872s
sys	0m8.037s

root in 🌐 s83lp47 in ~ took 49m14s 

When I go back history and use:

# pwd
/root/mirror-linux-next/tools/perf
# git branch
* (HEAD detached at v6.10)
  master
]# ll ~/perf.data-test
-rw------- 1 root root 152280778 Oct 30 08:38 /root/perf.data-test
# time ./perf report -D -i ~/perf.data-test > /dev/null

real	8m49.089s
user	8m47.898s
sys	0m0.848s
# 

Thanks for the pointer. Since the issue is with s390 specific code
I will do a git bisect and we go from there.

-- 
Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany
--
IBM Deutschland Research & Development GmbH

Vorsitzender des Aufsichtsrats: Wolfgang Wendt

Geschäftsführung: David Faller

Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294

  parent reply	other threads:[~2025-10-30  9:00 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-29  8:03 [linux-next] perf report runtime extremely long Thomas Richter
2025-10-29 15:13 ` Ian Rogers
2025-10-29 15:52   ` Thomas Richter
2025-10-29 16:25     ` Ian Rogers
2025-10-29 15:56 ` Thomas Richter
2025-10-29 16:47   ` Ian Rogers
2025-10-30  6:04     ` Namhyung Kim
2025-10-30  8:59     ` Thomas Richter [this message]
2025-10-30 13:25       ` Thomas Richter
2025-10-30 14:27         ` Thomas Richter
2025-10-30 15:57           ` Ian Rogers
2025-10-30 17:14             ` Ian Rogers
2025-10-31  8:20               ` Thomas Richter
2025-10-31  7:06             ` Thomas Richter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=13800bed-1256-4414-ac8b-e99439c748ec@linux.ibm.com \
    --to=tmricht@linux.ibm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=irogers@google.com \
    --cc=japo@linux.ibm.com \
    --cc=linux-perf-users@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.