1*4882a593Smuzhiyunperf-trace(1) 2*4882a593Smuzhiyun============= 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunNAME 5*4882a593Smuzhiyun---- 6*4882a593Smuzhiyunperf-trace - strace inspired tool 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSYNOPSIS 9*4882a593Smuzhiyun-------- 10*4882a593Smuzhiyun[verse] 11*4882a593Smuzhiyun'perf trace' 12*4882a593Smuzhiyun'perf trace record' 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunDESCRIPTION 15*4882a593Smuzhiyun----------- 16*4882a593SmuzhiyunThis command will show the events associated with the target, initially 17*4882a593Smuzhiyunsyscalls, but other system events like pagefaults, task lifetime events, 18*4882a593Smuzhiyunscheduling events, etc. 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunThis is a live mode tool in addition to working with perf.data files like 21*4882a593Smuzhiyunthe other perf tools. Files can be generated using the 'perf record' command 22*4882a593Smuzhiyunbut the session needs to include the raw_syscalls events (-e 'raw_syscalls:*'). 23*4882a593SmuzhiyunAlternatively, 'perf trace record' can be used as a shortcut to 24*4882a593Smuzhiyunautomatically include the raw_syscalls events when writing events to a file. 25*4882a593Smuzhiyun 26*4882a593SmuzhiyunThe following options apply to perf trace; options to perf trace record are 27*4882a593Smuzhiyunfound in the perf record man page. 28*4882a593Smuzhiyun 29*4882a593SmuzhiyunOPTIONS 30*4882a593Smuzhiyun------- 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun-a:: 33*4882a593Smuzhiyun--all-cpus:: 34*4882a593Smuzhiyun System-wide collection from all CPUs. 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun-e:: 37*4882a593Smuzhiyun--expr:: 38*4882a593Smuzhiyun--event:: 39*4882a593Smuzhiyun List of syscalls and other perf events (tracepoints, HW cache events, 40*4882a593Smuzhiyun etc) to show. Globbing is supported, e.g.: "epoll_*", "*msg*", etc. 41*4882a593Smuzhiyun See 'perf list' for a complete list of events. 42*4882a593Smuzhiyun Prefixing with ! shows all syscalls but the ones specified. You may 43*4882a593Smuzhiyun need to escape it. 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun--filter=<filter>:: 46*4882a593Smuzhiyun Event filter. This option should follow an event selector (-e) which 47*4882a593Smuzhiyun selects tracepoint event(s). 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun-D msecs:: 51*4882a593Smuzhiyun--delay msecs:: 52*4882a593SmuzhiyunAfter starting the program, wait msecs before measuring. This is useful to 53*4882a593Smuzhiyunfilter out the startup phase of the program, which is often very different. 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun-o:: 56*4882a593Smuzhiyun--output=:: 57*4882a593Smuzhiyun Output file name. 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun-p:: 60*4882a593Smuzhiyun--pid=:: 61*4882a593Smuzhiyun Record events on existing process ID (comma separated list). 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun-t:: 64*4882a593Smuzhiyun--tid=:: 65*4882a593Smuzhiyun Record events on existing thread ID (comma separated list). 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun-u:: 68*4882a593Smuzhiyun--uid=:: 69*4882a593Smuzhiyun Record events in threads owned by uid. Name or number. 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun-G:: 72*4882a593Smuzhiyun--cgroup:: 73*4882a593Smuzhiyun Record events in threads in a cgroup. 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun Look for cgroups to set at the /sys/fs/cgroup/perf_event directory, then 76*4882a593Smuzhiyun remove the /sys/fs/cgroup/perf_event/ part and try: 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun perf trace -G A -e sched:*switch 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun Will set all raw_syscalls:sys_{enter,exit}, pgfault, vfs_getname, etc 81*4882a593Smuzhiyun _and_ sched:sched_switch to the 'A' cgroup, while: 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun perf trace -e sched:*switch -G A 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun will only set the sched:sched_switch event to the 'A' cgroup, all the 86*4882a593Smuzhiyun other events (raw_syscalls:sys_{enter,exit}, etc are left "without" 87*4882a593Smuzhiyun a cgroup (on the root cgroup, sys wide, etc). 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun Multiple cgroups: 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun perf trace -G A -e sched:*switch -G B 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun the syscall ones go to the 'A' cgroup, the sched:sched_switch goes 94*4882a593Smuzhiyun to the 'B' cgroup. 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun--filter-pids=:: 97*4882a593Smuzhiyun Filter out events for these pids and for 'trace' itself (comma separated list). 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun-v:: 100*4882a593Smuzhiyun--verbose=:: 101*4882a593Smuzhiyun Verbosity level. 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun--no-inherit:: 104*4882a593Smuzhiyun Child tasks do not inherit counters. 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun-m:: 107*4882a593Smuzhiyun--mmap-pages=:: 108*4882a593Smuzhiyun Number of mmap data pages (must be a power of two) or size 109*4882a593Smuzhiyun specification with appended unit character - B/K/M/G. The 110*4882a593Smuzhiyun size is rounded up to have nearest pages power of two value. 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun-C:: 113*4882a593Smuzhiyun--cpu:: 114*4882a593SmuzhiyunCollect samples only on the list of CPUs provided. Multiple CPUs can be provided as a 115*4882a593Smuzhiyuncomma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2. 116*4882a593SmuzhiyunIn per-thread mode with inheritance mode on (default), Events are captured only when 117*4882a593Smuzhiyunthe thread executes on the designated CPUs. Default is to monitor all CPUs. 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun--duration:: 120*4882a593Smuzhiyun Show only events that had a duration greater than N.M ms. 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun--sched:: 123*4882a593Smuzhiyun Accrue thread runtime and provide a summary at the end of the session. 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun--failure:: 126*4882a593Smuzhiyun Show only syscalls that failed, i.e. that returned < 0. 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun-i:: 129*4882a593Smuzhiyun--input:: 130*4882a593Smuzhiyun Process events from a given perf data file. 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun-T:: 133*4882a593Smuzhiyun--time:: 134*4882a593Smuzhiyun Print full timestamp rather time relative to first sample. 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun--comm:: 137*4882a593Smuzhiyun Show process COMM right beside its ID, on by default, disable with --no-comm. 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun-s:: 140*4882a593Smuzhiyun--summary:: 141*4882a593Smuzhiyun Show only a summary of syscalls by thread with min, max, and average times 142*4882a593Smuzhiyun (in msec) and relative stddev. 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun-S:: 145*4882a593Smuzhiyun--with-summary:: 146*4882a593Smuzhiyun Show all syscalls followed by a summary by thread with min, max, and 147*4882a593Smuzhiyun average times (in msec) and relative stddev. 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun--errno-summary:: 150*4882a593Smuzhiyun To be used with -s or -S, to show stats for the errnos experienced by 151*4882a593Smuzhiyun syscalls, using only this option will trigger --summary. 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun--tool_stats:: 154*4882a593Smuzhiyun Show tool stats such as number of times fd->pathname was discovered thru 155*4882a593Smuzhiyun hooking the open syscall return + vfs_getname or via reading /proc/pid/fd, etc. 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun-f:: 158*4882a593Smuzhiyun--force:: 159*4882a593Smuzhiyun Don't complain, do it. 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun-F=[all|min|maj]:: 162*4882a593Smuzhiyun--pf=[all|min|maj]:: 163*4882a593Smuzhiyun Trace pagefaults. Optionally, you can specify whether you want minor, 164*4882a593Smuzhiyun major or all pagefaults. Default value is maj. 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun--syscalls:: 167*4882a593Smuzhiyun Trace system calls. This options is enabled by default, disable with 168*4882a593Smuzhiyun --no-syscalls. 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun--call-graph [mode,type,min[,limit],order[,key][,branch]]:: 171*4882a593Smuzhiyun Setup and enable call-graph (stack chain/backtrace) recording. 172*4882a593Smuzhiyun See `--call-graph` section in perf-record and perf-report 173*4882a593Smuzhiyun man pages for details. The ones that are most useful in 'perf trace' 174*4882a593Smuzhiyun are 'dwarf' and 'lbr', where available, try: 'perf trace --call-graph dwarf'. 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun Using this will, for the root user, bump the value of --mmap-pages to 4 177*4882a593Smuzhiyun times the maximum for non-root users, based on the kernel.perf_event_mlock_kb 178*4882a593Smuzhiyun sysctl. This is done only if the user doesn't specify a --mmap-pages value. 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun--kernel-syscall-graph:: 181*4882a593Smuzhiyun Show the kernel callchains on the syscall exit path. 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun--max-events=N:: 184*4882a593Smuzhiyun Stop after processing N events. Note that strace-like events are considered 185*4882a593Smuzhiyun only at exit time or when a syscall is interrupted, i.e. in those cases this 186*4882a593Smuzhiyun option is equivalent to the number of lines printed. 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun--switch-on EVENT_NAME:: 189*4882a593Smuzhiyun Only consider events after this event is found. 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun--switch-off EVENT_NAME:: 192*4882a593Smuzhiyun Stop considering events after this event is found. 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun--show-on-off-events:: 195*4882a593Smuzhiyun Show the --switch-on/off events too. 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun--max-stack:: 198*4882a593Smuzhiyun Set the stack depth limit when parsing the callchain, anything 199*4882a593Smuzhiyun beyond the specified depth will be ignored. Note that at this point 200*4882a593Smuzhiyun this is just about the presentation part, i.e. the kernel is still 201*4882a593Smuzhiyun not limiting, the overhead of callchains needs to be set via the 202*4882a593Smuzhiyun knobs in --call-graph dwarf. 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun Implies '--call-graph dwarf' when --call-graph not present on the 205*4882a593Smuzhiyun command line, on systems where DWARF unwinding was built in. 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun Default: /proc/sys/kernel/perf_event_max_stack when present for 208*4882a593Smuzhiyun live sessions (without --input/-i), 127 otherwise. 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun--min-stack:: 211*4882a593Smuzhiyun Set the stack depth limit when parsing the callchain, anything 212*4882a593Smuzhiyun below the specified depth will be ignored. Disabled by default. 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun Implies '--call-graph dwarf' when --call-graph not present on the 215*4882a593Smuzhiyun command line, on systems where DWARF unwinding was built in. 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun--print-sample:: 218*4882a593Smuzhiyun Print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info for the 219*4882a593Smuzhiyun raw_syscalls:sys_{enter,exit} tracepoints, for debugging. 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun--proc-map-timeout:: 222*4882a593Smuzhiyun When processing pre-existing threads /proc/XXX/mmap, it may take a long time, 223*4882a593Smuzhiyun because the file may be huge. A time out is needed in such cases. 224*4882a593Smuzhiyun This option sets the time out limit. The default value is 500 ms. 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun--sort-events:: 227*4882a593Smuzhiyun Do sorting on batches of events, use when noticing out of order events that 228*4882a593Smuzhiyun may happen, for instance, when a thread gets migrated to a different CPU 229*4882a593Smuzhiyun while processing a syscall. 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun--libtraceevent_print:: 232*4882a593Smuzhiyun Use libtraceevent to print tracepoint arguments. By default 'perf trace' uses 233*4882a593Smuzhiyun the same beautifiers used in the strace-like enter+exit lines to augment the 234*4882a593Smuzhiyun tracepoint arguments. 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun--map-dump:: 237*4882a593Smuzhiyun Dump BPF maps setup by events passed via -e, for instance the augmented_raw_syscalls 238*4882a593Smuzhiyun living in tools/perf/examples/bpf/augmented_raw_syscalls.c. For now this 239*4882a593Smuzhiyun dumps just boolean map values and integer keys, in time this will print in hex 240*4882a593Smuzhiyun by default and use BTF when available, as well as use functions to do pretty 241*4882a593Smuzhiyun printing using the existing 'perf trace' syscall arg beautifiers to map integer 242*4882a593Smuzhiyun arguments to strings (pid to comm, syscall id to syscall name, etc). 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun 245*4882a593SmuzhiyunPAGEFAULTS 246*4882a593Smuzhiyun---------- 247*4882a593Smuzhiyun 248*4882a593SmuzhiyunWhen tracing pagefaults, the format of the trace is as follows: 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun<min|maj>fault [<ip.symbol>+<ip.offset>] => <addr.dso@addr.offset> (<map type><addr level>). 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun- min/maj indicates whether fault event is minor or major; 253*4882a593Smuzhiyun- ip.symbol shows symbol for instruction pointer (the code that generated the 254*4882a593Smuzhiyun fault); if no debug symbols available, perf trace will print raw IP; 255*4882a593Smuzhiyun- addr.dso shows DSO for the faulted address; 256*4882a593Smuzhiyun- map type is either 'd' for non-executable maps or 'x' for executable maps; 257*4882a593Smuzhiyun- addr level is either 'k' for kernel dso or '.' for user dso. 258*4882a593Smuzhiyun 259*4882a593SmuzhiyunFor symbols resolution you may need to install debugging symbols. 260*4882a593Smuzhiyun 261*4882a593SmuzhiyunPlease be aware that duration is currently always 0 and doesn't reflect actual 262*4882a593Smuzhiyuntime it took for fault to be handled! 263*4882a593Smuzhiyun 264*4882a593SmuzhiyunWhen --verbose specified, perf trace tries to print all available information 265*4882a593Smuzhiyunfor both IP and fault address in the form of dso@symbol+offset. 266*4882a593Smuzhiyun 267*4882a593SmuzhiyunEXAMPLES 268*4882a593Smuzhiyun-------- 269*4882a593Smuzhiyun 270*4882a593SmuzhiyunTrace only major pagefaults: 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun $ perf trace --no-syscalls -F 273*4882a593Smuzhiyun 274*4882a593SmuzhiyunTrace syscalls, major and minor pagefaults: 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun $ perf trace -F all 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun 1416.547 ( 0.000 ms): python/20235 majfault [CRYPTO_push_info_+0x0] => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0@0x61be0 (x.) 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun As you can see, there was major pagefault in python process, from 281*4882a593Smuzhiyun CRYPTO_push_info_ routine which faulted somewhere in libcrypto.so. 282*4882a593Smuzhiyun 283*4882a593SmuzhiyunTrace the first 4 open, openat or open_by_handle_at syscalls (in the future more syscalls may match here): 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun $ perf trace -e open* --max-events 4 286*4882a593Smuzhiyun [root@jouet perf]# trace -e open* --max-events 4 287*4882a593Smuzhiyun 2272.992 ( 0.037 ms): gnome-shell/1370 openat(dfd: CWD, filename: /proc/self/stat) = 31 288*4882a593Smuzhiyun 2277.481 ( 0.139 ms): gnome-shell/3039 openat(dfd: CWD, filename: /proc/self/stat) = 65 289*4882a593Smuzhiyun 3026.398 ( 0.076 ms): gnome-shell/3039 openat(dfd: CWD, filename: /proc/self/stat) = 65 290*4882a593Smuzhiyun 4294.665 ( 0.015 ms): sed/15879 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC) = 3 291*4882a593Smuzhiyun $ 292*4882a593Smuzhiyun 293*4882a593SmuzhiyunTrace the first minor page fault when running a workload: 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun # perf trace -F min --max-stack=7 --max-events 1 sleep 1 296*4882a593Smuzhiyun 0.000 ( 0.000 ms): sleep/18006 minfault [__clear_user+0x1a] => 0x5626efa56080 (?k) 297*4882a593Smuzhiyun __clear_user ([kernel.kallsyms]) 298*4882a593Smuzhiyun load_elf_binary ([kernel.kallsyms]) 299*4882a593Smuzhiyun search_binary_handler ([kernel.kallsyms]) 300*4882a593Smuzhiyun __do_execve_file.isra.33 ([kernel.kallsyms]) 301*4882a593Smuzhiyun __x64_sys_execve ([kernel.kallsyms]) 302*4882a593Smuzhiyun do_syscall_64 ([kernel.kallsyms]) 303*4882a593Smuzhiyun entry_SYSCALL_64 ([kernel.kallsyms]) 304*4882a593Smuzhiyun # 305*4882a593Smuzhiyun 306*4882a593SmuzhiyunTrace the next min page page fault to take place on the first CPU: 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun # perf trace -F min --call-graph=dwarf --max-events 1 --cpu 0 309*4882a593Smuzhiyun 0.000 ( 0.000 ms): Web Content/17136 minfault [js::gc::Chunk::fetchNextDecommittedArena+0x4b] => 0x7fbe6181b000 (?.) 310*4882a593Smuzhiyun js::gc::FreeSpan::initAsEmpty (inlined) 311*4882a593Smuzhiyun js::gc::Arena::setAsNotAllocated (inlined) 312*4882a593Smuzhiyun js::gc::Chunk::fetchNextDecommittedArena (/usr/lib64/firefox/libxul.so) 313*4882a593Smuzhiyun js::gc::Chunk::allocateArena (/usr/lib64/firefox/libxul.so) 314*4882a593Smuzhiyun js::gc::GCRuntime::allocateArena (/usr/lib64/firefox/libxul.so) 315*4882a593Smuzhiyun js::gc::ArenaLists::allocateFromArena (/usr/lib64/firefox/libxul.so) 316*4882a593Smuzhiyun js::gc::GCRuntime::tryNewTenuredThing<JSString, (js::AllowGC)1> (inlined) 317*4882a593Smuzhiyun js::AllocateString<JSString, (js::AllowGC)1> (/usr/lib64/firefox/libxul.so) 318*4882a593Smuzhiyun js::Allocate<JSThinInlineString, (js::AllowGC)1> (inlined) 319*4882a593Smuzhiyun JSThinInlineString::new_<(js::AllowGC)1> (inlined) 320*4882a593Smuzhiyun AllocateInlineString<(js::AllowGC)1, unsigned char> (inlined) 321*4882a593Smuzhiyun js::ConcatStrings<(js::AllowGC)1> (/usr/lib64/firefox/libxul.so) 322*4882a593Smuzhiyun [0x18b26e6bc2bd] (/tmp/perf-17136.map) 323*4882a593Smuzhiyun # 324*4882a593Smuzhiyun 325*4882a593SmuzhiyunTrace the next two sched:sched_switch events, four block:*_plug events, the 326*4882a593Smuzhiyunnext block:*_unplug and the next three net:*dev_queue events, this last one 327*4882a593Smuzhiyunwith a backtrace of at most 16 entries, system wide: 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun # perf trace -e sched:*switch/nr=2/,block:*_plug/nr=4/,block:*_unplug/nr=1/,net:*dev_queue/nr=3,max-stack=16/ 330*4882a593Smuzhiyun 0.000 :0/0 sched:sched_switch:swapper/2:0 [120] S ==> rcu_sched:10 [120] 331*4882a593Smuzhiyun 0.015 rcu_sched/10 sched:sched_switch:rcu_sched:10 [120] R ==> swapper/2:0 [120] 332*4882a593Smuzhiyun 254.198 irq/50-iwlwifi/680 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051f600 len=66 333*4882a593Smuzhiyun __dev_queue_xmit ([kernel.kallsyms]) 334*4882a593Smuzhiyun 273.977 :0/0 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051f600 len=78 335*4882a593Smuzhiyun __dev_queue_xmit ([kernel.kallsyms]) 336*4882a593Smuzhiyun 274.007 :0/0 net:net_dev_queue:dev=wlp3s0 skbaddr=0xffff93498051ff00 len=78 337*4882a593Smuzhiyun __dev_queue_xmit ([kernel.kallsyms]) 338*4882a593Smuzhiyun 2930.140 kworker/u16:58/2722 block:block_plug:[kworker/u16:58] 339*4882a593Smuzhiyun 2930.162 kworker/u16:58/2722 block:block_unplug:[kworker/u16:58] 1 340*4882a593Smuzhiyun 4466.094 jbd2/dm-2-8/748 block:block_plug:[jbd2/dm-2-8] 341*4882a593Smuzhiyun 8050.123 kworker/u16:30/2694 block:block_plug:[kworker/u16:30] 342*4882a593Smuzhiyun 8050.271 kworker/u16:30/2694 block:block_plug:[kworker/u16:30] 343*4882a593Smuzhiyun # 344*4882a593Smuzhiyun 345*4882a593SmuzhiyunSEE ALSO 346*4882a593Smuzhiyun-------- 347*4882a593Smuzhiyunlinkperf:perf-record[1], linkperf:perf-script[1] 348