Php nhận mức sử dụng cpu

Perf là ​​một công cụ hồ sơ cho Linux 2. Hơn 6 hệ thống dựa trên trừu tượng hóa sự khác biệt về phần cứng CPU trong các phép đo hiệu suất Linux và trình bày giao diện dòng lệnh đơn giản. Perf dựa trên giao diện perf_events được xuất bởi các phiên bản gần đây của nhân Linux. Bài viết này minh họa công cụ hoàn hảo thông qua các lần chạy ví dụ. Đầu ra thu được trên Ubuntu 11. 04 hệ thống với hạt nhân 2. 6. 38-8-kết quả chung chạy trên HP 6710b với CPU Intel Core2 T7100 lõi kép]. Để dễ đọc, một số đầu ra được viết tắt bằng dấu chấm lửng [[. ]]

lệnh

Công cụ hoàn hảo cung cấp một tập hợp phong phú các lệnh để thu thập và phân tích hiệu suất và theo dõi dữ liệu. Cách sử dụng dòng lệnh gợi nhớ đến git ở chỗ có một công cụ chung, perf, thực hiện một tập hợp các lệnh. thống kê, bản ghi, báo cáo, [. ]

Danh sách các lệnh được hỗ trợ

perf

 usage: perf [--version] [--help] COMMAND [ARGS]

 The most commonly used perf commands are:
  annotate        Read perf.data [created by perf record] and display annotated code
  archive         Create archive with object files with build-ids found in perf.data file
  bench           General framework for benchmark suites
  buildid-cache   Manage build-id cache.
  buildid-list    List the buildids in a perf.data file
  diff            Read two perf.data files and display the differential profile
  inject          Filter to augment the events stream with additional information
  kmem            Tool to trace/measure kernel memory[slab] properties
  kvm             Tool to trace/measure kvm guest os
  list            List all symbolic event types
  lock            Analyze lock events
  probe           Define new dynamic tracepoints
  record          Run a command and record its profile into perf.data
  report          Read perf.data [created by perf record] and display the profile
  sched           Tool to trace/measure scheduler properties [latencies]
  script          Read perf.data [created by perf record] and display trace output
  stat            Run a command and gather performance counter statistics
  test            Runs sanity tests.
  timechart       Tool to visualize total system behavior during a workload
  top             System profiling tool.

 See 'perf help COMMAND' for more information on a specific command.

Một số lệnh yêu cầu hỗ trợ đặc biệt trong kernel và có thể không khả dụng. Để có được danh sách các tùy chọn cho mỗi lệnh, chỉ cần nhập tên lệnh theo sau -h

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators

Sự kiện

Công cụ hoàn hảo hỗ trợ danh sách các sự kiện có thể đo lường. Công cụ và giao diện hạt nhân cơ bản có thể đo lường các sự kiện đến từ các nguồn khác nhau. Chẳng hạn, một số sự kiện là bộ đếm hạt nhân thuần túy, trong trường hợp này chúng được gọi là sự kiện phần mềm. Những ví dụ bao gồm. chuyển ngữ cảnh, lỗi nhỏ

Một nguồn sự kiện khác là chính bộ xử lý và Đơn vị Giám sát Hiệu suất [PMU] của nó. Nó cung cấp một danh sách các sự kiện để đo lường các sự kiện kiến ​​trúc vi mô như số chu kỳ, các lệnh đã ngừng hoạt động, lỗi bộ đệm L1, v.v. Các sự kiện đó được gọi là sự kiện phần cứng PMU hay gọi tắt là sự kiện phần cứng. Chúng thay đổi theo từng loại và kiểu bộ xử lý

Giao diện perf_events cũng cung cấp một tập hợp nhỏ các biệt danh sự kiện phần cứng phổ biến. Trên mỗi bộ xử lý, các sự kiện đó được ánh xạ vào một sự kiện thực tế do CPU cung cấp, nếu chúng tồn tại, nếu không thì sự kiện đó không thể được sử dụng. Hơi khó hiểu, chúng còn được gọi là sự kiện phần cứng và sự kiện bộ đệm phần cứng

Cuối cùng, cũng có các sự kiện theo dõi được triển khai bởi cơ sở hạ tầng kernel ftrace. Những thứ đó chỉ khả dụng với 2. 6. Hạt nhân 3x và mới hơn

Để có được danh sách các sự kiện được hỗ trợ

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

Một sự kiện có thể có các sự kiện phụ [hoặc mặt nạ đơn vị]. Trên một số bộ xử lý và đối với một số sự kiện, có thể kết hợp các mặt nạ đơn vị và đo lường khi một trong hai sự kiện phụ xảy ra. Cuối cùng, một sự kiện có thể có bổ ngữ, tôi. e. , bộ lọc thay đổi thời điểm hoặc cách tính sự kiện

sự kiện phần cứng

Các sự kiện phần cứng của PMU là CPU cụ thể và được ghi lại bởi nhà cung cấp CPU. Công cụ hoàn hảo, nếu được liên kết với thư viện libpfm4, sẽ cung cấp một số mô tả ngắn về các sự kiện. Để biết danh sách các sự kiện phần cứng PMU dành cho bộ xử lý Intel và AMD, hãy xem

  • Bảng sự kiện Intel PMU. Phụ lục A của sổ tay tại đây
  • Bảng sự kiện AMD PMU. phần 3. 14 của hướng dẫn ở đây

Đếm với chỉ số hoàn hảo

Đối với bất kỳ sự kiện nào được hỗ trợ, perf có thể duy trì số lần chạy trong quá trình thực thi quy trình. Trong các chế độ đếm, số lần xuất hiện của các sự kiện được tổng hợp đơn giản và được trình bày trên đầu ra tiêu chuẩn khi kết thúc quá trình chạy ứng dụng. Để tạo các số liệu thống kê này, hãy sử dụng lệnh stat của perf. Ví dụ

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

Không có sự kiện nào được chỉ định, perf stat thu thập các sự kiện phổ biến được liệt kê ở trên. Một số là sự kiện phần mềm, chẳng hạn như chuyển đổi ngữ cảnh, một số khác là sự kiện phần cứng chung, chẳng hạn như chu kỳ. Sau dấu thăng, số liệu dẫn xuất có thể được trình bày, chẳng hạn như 'IPC' [hướng dẫn trên mỗi chu kỳ]

Tùy chọn kiểm soát lựa chọn sự kiện

Có thể đo lường một hoặc nhiều sự kiện cho mỗi lần chạy công cụ hoàn hảo. Các sự kiện được chỉ định bằng tên tượng trưng của chúng, theo sau là mặt nạ đơn vị tùy chọn và công cụ sửa đổi. Tên sự kiện, mặt nạ đơn vị và công cụ sửa đổi không phân biệt chữ hoa chữ thường

Theo mặc định, các sự kiện được đo ở cả cấp độ người dùng và nhân

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000

Để chỉ đo lường ở cấp độ người dùng, cần phải chuyển một công cụ sửa đổi

perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000

Để đo lường cả người dùng và kernel [rõ ràng]

perf stat -e cycles:uk dd if=/dev/zero of=/dev/null count=100000

sửa đổi

Các sự kiện có thể tùy chọn có một công cụ sửa đổi bằng cách thêm dấu hai chấm và một hoặc nhiều công cụ sửa đổi. Công cụ sửa đổi cho phép người dùng hạn chế khi các sự kiện được tính

Để đo lường một sự kiện PMU và vượt qua các công cụ sửa đổi

perf stat -e instructions:u dd if=/dev/zero of=/dev/null count=100000

Trong ví dụ này, chúng tôi đang đo số lượng hướng dẫn ở cấp độ người dùng. Lưu ý rằng đối với các sự kiện thực tế, công cụ sửa đổi phụ thuộc vào mô hình PMU cơ bản. Tất cả các công cụ sửa đổi có thể được kết hợp theo ý muốn. Dưới đây là một bảng đơn giản để tóm tắt các công cụ sửa đổi phổ biến nhất cho bộ xử lý Intel và AMD x86

Công cụ sửa đổi Mô tảExampuMonitor ở cấp độ riêng tư 3, 2, 1 [người dùng]sự kiện. ukmonitor tại sự kiện private level 0 [kernel]. các sự kiện của trình ảo hóa khmonitor trên môi trường ảo hóasự kiện. Máy chủ hHmonitor trên môi trường ảo hóasự kiện. Máy khách HGmonitor trên môi trường ảo hóasự kiện. G

Tất cả các công cụ sửa đổi ở trên được coi là một boolean [cờ]

sự kiện phần cứng

Để đo một PMU thực tế như được cung cấp bởi tài liệu của nhà cung cấp CTNH, hãy chuyển mã tham số thập lục phân

________số 8

nhiều sự kiện

Để đo lường nhiều sự kiện, chỉ cần cung cấp một danh sách được phân tách bằng dấu phẩy và không có khoảng trắng

perf stat -e cycles,instructions,cache-misses [...]

Không có giới hạn lý thuyết về số lượng sự kiện có thể được cung cấp. Nếu có nhiều sự kiện hơn số lượng bộ đếm hw thực tế, kernel sẽ tự động ghép chúng lại. Không giới hạn số lượng sự kiện phần mềm. Có thể đo đồng thời các sự kiện đến từ các nguồn khác nhau

Tuy nhiên, do có một bộ mô tả tệp được sử dụng cho mỗi sự kiện và mỗi luồng [chế độ mỗi luồng] hoặc mỗi cpu [toàn hệ thống], có thể đạt đến số lượng bộ mô tả tệp mở tối đa cho mỗi quy trình như được áp đặt bởi . Trong trường hợp đó, perf sẽ báo lỗi. Xem phần khắc phục sự cố để được trợ giúp về vấn đề này

các sự kiện ghép kênh và chia tỷ lệ

Nếu có nhiều sự kiện hơn bộ đếm, thì hạt nhân sử dụng ghép kênh theo thời gian [tần số chuyển đổi = HZ, thường là 100 hoặc 1000] để mỗi sự kiện có cơ hội truy cập vào phần cứng giám sát. Ghép kênh chỉ áp dụng cho các sự kiện PMU. Với ghép kênh, một sự kiện không được đo lường mọi lúc. Khi kết thúc quá trình chạy, công cụ sẽ chia tỷ lệ số đếm dựa trên tổng thời gian được bật so với thời gian chạy. Công thức thực tế là

final_count = raw_count * time_enabled/time_running

Điều này cung cấp ước tính về số lượng sẽ là bao nhiêu, nếu sự kiện được đo lường trong toàn bộ quá trình chạy. Điều rất quan trọng là phải hiểu đây là ước tính không phải là số lượng thực tế. Tùy thuộc vào khối lượng công việc, sẽ có những điểm mù có thể gây ra lỗi trong quá trình mở rộng quy mô

Các sự kiện hiện đang được quản lý theo kiểu vòng tròn. Do đó, mỗi sự kiện cuối cùng sẽ có cơ hội chạy. Nếu có N bộ đếm, thì tối đa N sự kiện đầu tiên trong danh sách vòng tròn được lập trình trong PMU. Trong một số tình huống nhất định, nó có thể ít hơn vì một số sự kiện có thể không được đo cùng nhau hoặc chúng cạnh tranh cho cùng một bộ đếm. Hơn nữa, giao diện perf_events cho phép nhiều công cụ đo lường cùng một luồng hoặc CPU cùng một lúc. Mỗi sự kiện được thêm vào cùng một danh sách vòng tròn. Không có gì đảm bảo rằng tất cả các sự kiện của một công cụ được lưu trữ tuần tự trong danh sách

Để tránh mở rộng quy mô [khi chỉ có một người dùng perf_event đang hoạt động], người ta có thể thử và giảm số lượng sự kiện. Bảng sau đây cung cấp số lượng bộ đếm cho một số bộ xử lý phổ biến

Bộ xử lýBộ đếm chungBộ đếm cố địnhIntel Core23Intel Nehalem43

Bộ đếm chung có thể đo bất kỳ sự kiện nào. Bộ đếm cố định chỉ có thể đo một sự kiện. Một số bộ đếm có thể được dành riêng cho các mục đích đặc biệt, chẳng hạn như bộ đếm thời gian giám sát

Các ví dụ sau đây cho thấy tác dụng của việc chia tỷ lệ

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
0

Ở đây, không có ghép kênh và do đó không có tỷ lệ. Hãy thêm một sự kiện nữa

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
1

Có ghép kênh và do đó nhân rộng. Có thể thú vị khi thử và sắp xếp các sự kiện theo cách đảm bảo rằng sự kiện A và B luôn được đo cùng nhau. Mặc dù giao diện kernel perf_events cung cấp hỗ trợ cho nhóm sự kiện, công cụ perf hiện tại không

Đo lường lặp đi lặp lại

Có thể sử dụng chỉ số hoàn hảo để chạy cùng một khối lượng công việc thử nghiệm nhiều lần và nhận được độ lệch chuẩn so với giá trị trung bình cho mỗi lần đếm

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
2

Ở đây, chế độ ngủ được chạy 5 lần và số lượng trung bình cho mỗi sự kiện, cùng với tỷ lệ std-dev/mean được in

Tùy chọn kiểm soát lựa chọn môi trường

Công cụ hoàn hảo có thể được sử dụng để đếm các sự kiện trên cơ sở mỗi luồng, mỗi quy trình, mỗi cpu hoặc toàn hệ thống. Ở chế độ mỗi luồng, bộ đếm chỉ giám sát việc thực hiện một luồng được chỉ định. Khi luồng được lên lịch, quá trình giám sát sẽ dừng lại. Khi một luồng di chuyển từ bộ xử lý này sang bộ xử lý khác, bộ đếm được lưu trên bộ xử lý hiện tại và được khôi phục trên bộ xử lý mới

Chế độ theo quy trình là một biến thể của chế độ theo luồng trong đó tất cả các luồng của quy trình đều được giám sát. Số lượng và mẫu được tổng hợp ở cấp độ quy trình. Giao diện perf_events cho phép kế thừa tự động trên fork[] và pthread_create[]. Theo mặc định, công cụ hoàn hảo kích hoạt tính kế thừa

Ở chế độ mỗi cpu, tất cả các luồng chạy trên bộ xử lý được chỉ định đều được theo dõi. Do đó, số lượng và mẫu được tổng hợp trên mỗi CPU. Một sự kiện chỉ giám sát một CPU tại một thời điểm. Để giám sát trên nhiều bộ xử lý, cần tạo nhiều sự kiện. Công cụ hoàn hảo có thể tổng hợp số lượng và mẫu trên nhiều bộ xử lý. Nó cũng chỉ có thể giám sát một tập hợp con của bộ xử lý

Đếm và kế thừa

Theo mặc định, chỉ số hoàn hảo được tính cho tất cả các luồng của quy trình và các quy trình và luồng con tiếp theo. Điều này có thể được thay đổi bằng tùy chọn -i. Không thể có được số lượng phân tích trên mỗi luồng hoặc trên mỗi quá trình

Chế độ toàn bộ bộ xử lý

Theo mặc định, chỉ số hoàn hảo được tính ở chế độ mỗi luồng. Để tính trên cơ sở mỗi cpu, hãy vượt qua tùy chọn -a. Khi nó được chỉ định bởi chính nó, tất cả các bộ xử lý trực tuyến được theo dõi và số lượng được tổng hợp. Ví dụ

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
3

Phép đo này thu thập các chu kỳ sự kiện và hướng dẫn trên tất cả các CPU. Thời lượng của phép đo được xác định bằng cách thực hiện dd. Nói cách khác, phép đo này ghi lại việc thực thi quy trình dd và bất kỳ thứ gì khác ngoài việc chạy ở cấp độ người dùng trên tất cả các CPU

Để tính thời gian của phép đo mà không tiêu thụ tích cực các chu kỳ, có thể sử dụng lệnh =/usr/bin/sleep=

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
4

Có thể hạn chế giám sát đối với một tập hợp con của CPU bằng tùy chọn -C. Một danh sách các CPU để giám sát có thể được thông qua. Chẳng hạn, để đo trên CPU0, CPU2 và CPU3

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
5

Máy trình diễn chỉ có hai CPU, nhưng chúng tôi có thể giới hạn ở CPU 1

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
6

Số lượng được tổng hợp trên tất cả các CPU được giám sát. Lưu ý cách số lượng chu kỳ và hướng dẫn được tính đều giảm một nửa khi đo một CPU

Gắn vào một tiến trình đang chạy

Có thể sử dụng perf để đính kèm vào một luồng hoặc quy trình đang chạy. Điều này yêu cầu quyền đính kèm cùng với chuỗi hoặc ID tiến trình. Để đính kèm vào một quy trình, tùy chọn -p phải là ID quy trình. Để đính kèm với dịch vụ sshd thường chạy trên nhiều máy Linux, hãy phát hành

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
7

Điều quyết định thời lượng của phép đo là lệnh thực hiện. Mặc dù chúng tôi đang đính kèm vào một quy trình, chúng tôi vẫn có thể chuyển tên của lệnh. Nó được sử dụng để đo thời gian. Không có nó, màn hình hoàn hảo cho đến khi nó bị giết. Cũng lưu ý rằng khi đính kèm vào một quy trình, tất cả các luồng của quy trình đều được theo dõi. Hơn nữa, do tính kế thừa được bật theo mặc định, các tiến trình hoặc luồng con cũng sẽ được theo dõi. Để tắt tính năng này, bạn phải sử dụng tùy chọn -i. Có thể đính kèm một luồng cụ thể trong một quy trình. Theo chủ đề, chúng tôi có nghĩa là chủ đề có thể nhìn thấy hạt nhân. Nói cách khác, một luồng có thể nhìn thấy bằng các lệnh ps hoặc top. Để đính kèm vào một chủ đề, tùy chọn -t phải được sử dụng. Chúng tôi xem rsyslogd, vì nó luôn chạy trên Ubuntu 11. 04, với nhiều chủ đề

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
8

Trong ví dụ này, luồng 932 không chạy trong 2 giây của phép đo. Nếu không, chúng ta sẽ thấy một giá trị đếm. Có thể gắn vào các luồng nhân, mặc dù không thực sự được khuyến nghị. Cho rằng các luồng nhân có xu hướng được ghim vào một CPU cụ thể, tốt nhất nên sử dụng chế độ toàn cpu

Tùy chọn kiểm soát đầu ra

perf stat có thể sửa đổi đầu ra để phù hợp với các nhu cầu khác nhau

In số lượng lớn đẹp

Đối với hầu hết mọi người, thật khó để đọc số lớn. Với chỉ số hoàn hảo, có thể in số lượng lớn bằng cách sử dụng dấu phẩy tách hàng nghìn [kiểu Hoa Kỳ]. Đối với điều đó, tùy chọn -B và ngôn ngữ chính xác cho LC_NUMERIC phải được đặt. Như ví dụ trên cho thấy, Ubuntu đã đặt chính xác thông tin ngôn ngữ. Một cuộc gọi rõ ràng trông như sau

perf stat -h

 usage: perf stat [] []

    -e, --event    event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid          stat events on existing process id
    -t, --tid          stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose [show counter open errors, etc]
    -r, --repeat       repeat command and print average + stddev [max: 100]
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
9

Đầu ra có thể đọc được bằng máy

perf stat cũng có thể in số lượng ở định dạng có thể dễ dàng nhập vào bảng tính hoặc phân tích cú pháp bằng tập lệnh. Tùy chọn -x thay đổi định dạng của đầu ra và cho phép người dùng chuyển dấu phân cách trường. Điều này giúp dễ dàng tạo đầu ra kiểu CSV

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

0

Lưu ý rằng tùy chọn -x không tương thích với -B

Lấy mẫu với bản ghi hoàn hảo

Công cụ hoàn hảo có thể được sử dụng để thu thập hồ sơ trên cơ sở mỗi luồng, mỗi quy trình và mỗi cpu

Có một số lệnh liên quan đến lấy mẫu. ghi lại, báo cáo, chú thích. Trước tiên, bạn phải thu thập các mẫu bằng bản ghi hoàn hảo. Điều này tạo ra một tệp đầu ra gọi là perf. dữ liệu. Sau đó, tệp đó có thể được phân tích, có thể trên một máy khác, sử dụng báo cáo hoàn hảo và các lệnh chú thích hoàn hảo. Mô hình khá giống với mô hình của OProfile

Tổng quan về lấy mẫu dựa trên sự kiện

Perf_events dựa trên lấy mẫu dựa trên sự kiện. Khoảng thời gian được biểu thị bằng số lần xuất hiện của một sự kiện, không phải số lần tích tắc của bộ đếm thời gian. Một mẫu được ghi lại khi bộ đếm lấy mẫu bị tràn, tôi. e. , kết thúc tốt đẹp từ 2^64 trở lại 0. Không có PMU nào triển khai bộ đếm phần cứng 64 bit, nhưng perf_events mô phỏng các bộ đếm đó trong phần mềm

Cách perf_events mô phỏng bộ đếm 64 bit bị giới hạn trong việc thể hiện các khoảng thời gian lấy mẫu bằng cách sử dụng số bit trong bộ đếm phần cứng thực tế. Nếu giá trị này nhỏ hơn 64, hạt nhân sẽ âm thầm cắt bớt khoảng thời gian trong trường hợp này. Do đó, tốt nhất là khoảng thời gian luôn nhỏ hơn 2^31 nếu chạy trên hệ thống 32 bit

Khi tràn bộ đếm, hạt nhân ghi lại thông tin, tôi. e. , một mẫu, về việc thực hiện chương trình. Nội dung được ghi lại tùy thuộc vào loại phép đo. Tất cả điều này được chỉ định bởi người dùng và công cụ. Nhưng thông tin chính phổ biến trong tất cả các mẫu là con trỏ lệnh, tôi. e. chương trình ở đâu khi nó bị gián đoạn

Lấy mẫu dựa trên ngắt giới thiệu đường trượt trên bộ xử lý hiện đại. Điều đó có nghĩa là con trỏ lệnh được lưu trữ trong mỗi mẫu chỉ định nơi chương trình bị ngắt để xử lý ngắt PMU, không phải nơi bộ đếm thực sự bị tràn, i. e. , vị trí của nó vào cuối giai đoạn lấy mẫu. Trong một số trường hợp, khoảng cách giữa hai điểm đó có thể là vài chục lệnh hoặc hơn nếu có các nhánh được lấy. Khi chương trình không thể thực hiện tiến trình chuyển tiếp, hai vị trí đó thực sự giống hệt nhau. Vì lý do này, cần phải cẩn thận khi giải thích hồ sơ

sự kiện mặc định. đếm chu kỳ

Theo mặc định, bản ghi hoàn hảo sử dụng sự kiện chu kỳ làm sự kiện lấy mẫu. Đây là một sự kiện phần cứng chung được ánh xạ tới một sự kiện PMU dành riêng cho phần cứng bởi hạt nhân. Đối với Intel, nó được ánh xạ tới UNHALTED_CORE_CYCLES. Sự kiện này không duy trì mối tương quan liên tục với thời gian khi có sự thay đổi tần số CPU. Intel cung cấp một sự kiện khác, được gọi là UNHALTED_REFERENCE_CYCLES nhưng sự kiện này hiện KHÔNG khả dụng với perf_events

Trên các hệ thống AMD, sự kiện được ánh xạ tới CPU_CLK_UNHALTED và sự kiện này cũng có thể thay đổi tần số. Trên bất kỳ bộ xử lý Intel hoặc AMD nào, sự kiện chu kỳ không được tính khi bộ xử lý không hoạt động, tôi. e. , khi nó gọi mwait[]

Thời gian và tỷ lệ

Giao diện perf_events cho phép hai chế độ thể hiện khoảng thời gian lấy mẫu

  • số lần xuất hiện của sự kiện [thời gian]
  • tốc độ trung bình của mẫu/giây [tần suất]

Công cụ perf mặc định là tỷ lệ trung bình. Nó được đặt thành 1000Hz hoặc 1000 mẫu/giây. Điều đó có nghĩa là hạt nhân đang tự động điều chỉnh khoảng thời gian lấy mẫu để đạt được tốc độ trung bình mục tiêu. Việc điều chỉnh trong thời gian được báo cáo trong dữ liệu hồ sơ thô. Ngược lại, với chế độ còn lại, khoảng thời gian lấy mẫu do người dùng đặt và không thay đổi giữa các mẫu. Hiện tại không có hỗ trợ cho ngẫu nhiên thời gian lấy mẫu

Thu mẫu

Theo mặc định, bản ghi hoàn hảo hoạt động ở chế độ mỗi luồng, với chế độ kế thừa được bật. Chế độ đơn giản nhất trông như sau, khi thực hiện một chương trình đơn giản có các vòng lặp bận

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

1

Ví dụ trên thu thập các mẫu cho các chu kỳ sự kiện ở tốc độ mục tiêu trung bình là 1000Hz. Các mẫu kết quả được lưu vào perf. tập tin dữ liệu. Nếu tệp đã tồn tại, bạn có thể được nhắc chuyển -f để ghi đè lên tệp. Để đưa kết quả vào một tệp cụ thể, hãy sử dụng tùy chọn -o

CẢNH BÁO. Số lượng mẫu được báo cáo chỉ là ước tính. Nó không phản ánh số lượng mẫu thực tế được thu thập. Ước tính dựa trên số byte được ghi vào perf. tệp dữ liệu và kích thước mẫu tối thiểu. Nhưng kích thước của mỗi mẫu phụ thuộc vào loại phép đo. Một số mẫu được tạo bởi chính bộ đếm nhưng những mẫu khác được ghi lại để hỗ trợ tương quan ký hiệu trong quá trình xử lý hậu kỳ, ví dụ:. g. thông tin , mmap[]

Để có được số lượng mẫu chính xác cho sự hoàn hảo. tệp dữ liệu, có thể sử dụng lệnh báo cáo hoàn hảo

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

2

Để chỉ định tỷ lệ tùy chỉnh, cần sử dụng tùy chọn -F. Chẳng hạn, để lấy mẫu các hướng dẫn sự kiện chỉ ở cấp độ người dùng và

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

3____24

Thay vào đó, để chỉ định khoảng thời gian lấy mẫu, phải sử dụng tùy chọn -c. Chẳng hạn, để thu thập một mẫu sau mỗi 2000 lần xuất hiện của các hướng dẫn sự kiện chỉ ở cấp độ người dùng

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

5

Chế độ toàn bộ bộ xử lý

Ở chế độ chế độ trên mỗi cpu, các mẫu được thu thập cho tất cả các luồng đang thực thi trên CPU được giám sát. Để chuyển bản ghi hiệu suất ở chế độ mỗi cpu, phải sử dụng tùy chọn -a. Theo mặc định ở chế độ này, TẤT CẢ các CPU trực tuyến đều được giám sát. Có thể giới hạn một tập hợp con CPU bằng tùy chọn -C, như đã giải thích với chỉ số hoàn hảo ở trên

Để lấy mẫu theo chu kỳ ở cả cấp độ người dùng và nhân trong 5 giây trên tất cả các CPU với tốc độ mục tiêu trung bình là 1000 mẫu/giây

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

6

Phân tích mẫu với báo cáo hoàn hảo

Các mẫu được thu thập bởi bản ghi perf được lưu vào một tệp nhị phân có tên là perf theo mặc định. dữ liệu. Lệnh báo cáo hoàn hảo đọc tệp này và tạo một hồ sơ thực thi ngắn gọn. Theo mặc định, các mẫu được sắp xếp theo chức năng có nhiều mẫu nhất trước tiên. Có thể tùy chỉnh thứ tự sắp xếp và do đó xem dữ liệu theo cách khác

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

7

Cột 'Chi phí chung' cho biết tỷ lệ phần trăm của các mẫu tổng thể được thu thập trong chức năng tương ứng. Cột thứ hai báo cáo quá trình thu thập các mẫu. Ở chế độ mỗi luồng/mỗi quá trình, đây luôn là tên của lệnh được giám sát. Nhưng ở chế độ toàn cpu, lệnh có thể thay đổi. Cột thứ ba hiển thị tên của hình ảnh ELF nơi lấy mẫu. Nếu một chương trình được liên kết động, thì chương trình này có thể hiển thị tên của thư viện được chia sẻ. Khi các mẫu đến từ kernel, thì tên hình ảnh ELF giả [kernel. kallsyms] được sử dụng. Cột thứ tư cho biết mức đặc quyền mà tại đó mẫu được lấy, i. e. khi chương trình đang chạy khi nó bị gián đoạn

  • [. ]. cấp độ người dùng
  • [k]. cấp hạt nhân
  • [g]. mức nhân khách [ảo hóa]
  • [u]. không gian người dùng hệ điều hành khách
  • [H]. siêu giám sát

Cột cuối cùng hiển thị tên biểu tượng

Có nhiều cách khác nhau để trình bày mẫu, tôi. e. , sắp xếp. Để sắp xếp theo đối tượng dùng chung, tôi. e. , dso

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

8

Tùy chọn kiểm soát đầu ra

Để làm cho đầu ra dễ phân tích cú pháp hơn, có thể thay đổi dấu tách cột thành một ký tự

perf list

List of pre-defined events [to be used in -e]:

 cpu-cycles OR cycles                       [Hardware event]
 instructions                               [Hardware event]
 cache-references                           [Hardware event]
 cache-misses                               [Hardware event]
 branch-instructions OR branches            [Hardware event]
 branch-misses                              [Hardware event]
 bus-cycles                                 [Hardware event]

 cpu-clock                                  [Software event]
 task-clock                                 [Software event]
 page-faults OR faults                      [Software event]
 minor-faults                               [Software event]
 major-faults                               [Software event]
 context-switches OR cs                     [Software event]
 cpu-migrations OR migrations               [Software event]
 alignment-faults                           [Software event]
 emulation-faults                           [Software event]

 L1-dcache-loads                            [Hardware cache event]
 L1-dcache-load-misses                      [Hardware cache event]
 L1-dcache-stores                           [Hardware cache event]
 L1-dcache-store-misses                     [Hardware cache event]
 L1-dcache-prefetches                       [Hardware cache event]
 L1-dcache-prefetch-misses                  [Hardware cache event]
 L1-icache-loads                            [Hardware cache event]
 L1-icache-load-misses                      [Hardware cache event]
 L1-icache-prefetches                       [Hardware cache event]
 L1-icache-prefetch-misses                  [Hardware cache event]
 LLC-loads                                  [Hardware cache event]
 LLC-load-misses                            [Hardware cache event]
 LLC-stores                                 [Hardware cache event]
 LLC-store-misses                           [Hardware cache event]

 LLC-prefetch-misses                        [Hardware cache event]
 dTLB-loads                                 [Hardware cache event]
 dTLB-load-misses                           [Hardware cache event]
 dTLB-stores                                [Hardware cache event]
 dTLB-store-misses                          [Hardware cache event]
 dTLB-prefetches                            [Hardware cache event]
 dTLB-prefetch-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]

 rNNN [see 'perf list --help' on how to encode it] [Raw hardware event descriptor]

 mem:[:access]                        [Hardware breakpoint]

 kvmmmu:kvm_mmu_pagetable_walk              [Tracepoint event]

 [...]

 sched:sched_stat_runtime                   [Tracepoint event]
 sched:sched_pi_setprio                     [Tracepoint event]
 syscalls:sys_enter_socket                  [Tracepoint event]
 syscalls:sys_exit_socket                   [Tracepoint event]

 [...]

9

Tùy chọn kiểm soát báo cáo hạt nhân

Công cụ hoàn hảo không biết cách trích xuất các ký hiệu từ hình ảnh hạt nhân đã nén [vmlinuz]. Do đó, người dùng phải chuyển đường dẫn của kernel không nén bằng tùy chọn -k

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

0

Tất nhiên, điều này chỉ hoạt động nếu hạt nhân được biên dịch thành các ký hiệu gỡ lỗi

Chế độ toàn bộ bộ xử lý

Ở chế độ trên mỗi cpu, các mẫu được ghi lại từ tất cả các luồng đang chạy trên các CPU được giám sát. Do đó, các mẫu từ nhiều quy trình khác nhau có thể được thu thập. Chẳng hạn, nếu chúng tôi giám sát trên tất cả các CPU trong 5 giây

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

1

Khi ký hiệu được in dưới dạng địa chỉ thập lục phân, điều này là do hình ảnh ELF không có bảng ký hiệu. Điều này xảy ra khi các tệp nhị phân bị tước. Chúng ta cũng có thể sắp xếp theo cpu. Điều này có thể hữu ích để xác định xem khối lượng công việc có được cân bằng tốt hay không

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

2

tính toán chi phí

Chi phí hoạt động có thể được hiển thị trong hai cột là 'Trẻ em' và 'Bản thân' khi perf thu thập chuỗi cuộc gọi. Chi phí 'bản thân' được tính đơn giản bằng cách cộng tất cả các giá trị khoảng thời gian của mục nhập - thường là một hàm [ký hiệu]. Đây là giá trị mà perf hiển thị theo truyền thống và tổng của tất cả các giá trị chi phí 'tự' phải là 100%

Chi phí 'con' được tính bằng cách cộng tất cả các giá trị chu kỳ của các hàm con để nó có thể hiển thị tổng chi phí của các hàm cấp cao hơn ngay cả khi chúng không thực thi trực tiếp nhiều. 'Trẻ em' ở đây có nghĩa là các hàm được gọi từ một hàm [cha] khác

Có thể gây nhầm lẫn khi tổng của tất cả các giá trị chi phí 'con' vượt quá 100% vì mỗi giá trị trong số chúng đã là sự tích lũy chi phí 'bản thân' của các hàm con của nó. Nhưng với tính năng này được bật, người dùng có thể tìm thấy chức năng nào có nhiều chi phí nhất ngay cả khi các mẫu trải rộng trên trẻ em

Hãy xem xét ví dụ sau;

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

3

Trong trường hợp này, 'foo' là con của 'bar' và 'bar' là con trực tiếp của 'main' nên 'foo' cũng là con của 'main'. Nói cách khác, 'main' là cấp độ gốc của 'foo' và 'bar' và 'bar' là cấp độ gốc của 'foo'

Giả sử tất cả các mẫu chỉ được ghi trong 'foo' và 'bar'. Khi nó được ghi lại bằng chuỗi cuộc gọi, đầu ra sẽ hiển thị một cái gì đó giống như bên dưới trong đầu ra thông thường [chỉ dành cho bản thân] của báo cáo hoàn hảo

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

4

Khi tùy chọn --children được bật, các giá trị 'tự' của các hàm con [i. e. 'foo' và 'bar'] được thêm vào cha mẹ để tính chi phí 'con'. Trong trường hợp này, báo cáo có thể được hiển thị dưới dạng

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

5

Trong đầu ra ở trên, chi phí 'tự' của 'foo' [60%] đã được thêm vào chi phí 'con' của 'bar', 'main' và '__libc_start_main'. Tương tự như vậy, chi phí 'tự' của 'thanh' [40%] đã được thêm vào chi phí 'con' của 'chính' và '__libc_start_main'

Vì vậy, '__libc_start_main' và 'main' được hiển thị đầu tiên vì chúng có cùng [100%] chi phí 'con' [mặc dù chúng không có chi phí 'self'] và chúng là cha của 'foo' và 'bar'

kể từ v3. 16 chi phí 'con' được hiển thị theo mặc định và đầu ra được sắp xếp theo giá trị của nó. Chi phí 'trẻ em' bị vô hiệu hóa bằng cách chỉ định tùy chọn --no-children trên dòng lệnh hoặc bằng cách thêm 'báo cáo. trẻ em = false' hoặc 'top. children = false' trong tệp cấu hình perf

Phân tích mức nguồn với chú thích hoàn hảo

Có thể đi sâu vào cấp độ hướng dẫn với chú thích hoàn hảo. Đối với điều đó, bạn cần gọi perf chú thích với tên của lệnh để chú thích. Tất cả các chức năng với các mẫu sẽ được phân tách và mỗi hướng dẫn sẽ có tỷ lệ phần trăm mẫu tương đối được báo cáo

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

6

Cột đầu tiên báo cáo tỷ lệ phần trăm mẫu cho chức năng ==noploop[]== được chụp cho hướng dẫn đó. Như đã giải thích trước đó, bạn nên diễn giải thông tin này một cách cẩn thận

chú thích perf có thể tạo thông tin cấp mã nguồn nếu ứng dụng được biên dịch bằng -ggdb. Đoạn mã sau hiển thị đầu ra nhiều thông tin hơn cho cùng một lần thực thi noploop khi được biên dịch với thông tin gỡ lỗi này

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

7

Sử dụng chú thích perf trên mã kernel

Công cụ hoàn hảo không biết cách trích xuất các biểu tượng từ hình ảnh hạt nhân đã nén [vmlinuz]. Như trong trường hợp báo cáo hoàn hảo, người dùng phải chuyển đường dẫn của kernel không nén bằng tùy chọn -k

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

8

Một lần nữa, điều này chỉ hoạt động nếu kernel được biên dịch thành các ký hiệu gỡ lỗi

Phân tích trực tiếp với perf top

Công cụ hoàn hảo có thể hoạt động ở chế độ tương tự như công cụ hàng đầu của Linux, in các chức năng được lấy mẫu trong thời gian thực. Sự kiện lấy mẫu mặc định là các chu kỳ và thứ tự mặc định là số lượng mẫu giảm dần trên mỗi ký hiệu, do đó perf top hiển thị các chức năng chiếm phần lớn thời gian. Theo mặc định, perf top hoạt động ở chế độ toàn bộ xử lý, giám sát tất cả các CPU trực tuyến ở cả cấp độ người dùng và nhân. Chỉ có thể giám sát một tập hợp con của CPU bằng tùy chọn -C

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes [512 MB] copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec [scaled from 66.58%]
          235,384 cache-references         #      0.246 M/sec [scaled from 66.56%]
        9,281,660 branch-misses            #      3.858 %     [scaled from 33.50%]
      240,609,766 branches                 #    251.559 M/sec [scaled from 33.66%]
    1,403,561,257 instructions             #      0.679 IPC   [scaled from 50.23%]
    2,066,201,729 cycles                   #   2160.227 M/sec [scaled from 66.67%]
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

9

Theo mặc định, cột đầu tiên hiển thị tổng số mẫu kể từ khi bắt đầu chạy. Bằng cách nhấn phím 'Z', điều này có thể được thay đổi để in số lượng mẫu kể từ lần làm mới cuối cùng. Nhớ lại rằng sự kiện chu kỳ đếm chu kỳ CPU khi bộ xử lý không ở trạng thái tạm dừng, tôi. e. không nhàn rỗi. Do đó, điều này không tương đương với thời gian đồng hồ treo tường. Hơn nữa, sự kiện này cũng có thể thay đổi tần số

Cũng có thể đi sâu vào các chức năng đơn lẻ để xem hướng dẫn nào có nhiều mẫu nhất. Để đi sâu vào một chức năng xác định, nhấn phím 's' và nhập tên của chức năng. Ở đây chúng tôi đã chọn chức năng hàng đầu noploop [không hiển thị ở trên]

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
0

Đo điểm chuẩn với băng ghế hoàn hảo

Lệnh băng ghế dự bị hoàn hảo bao gồm một số điểm chuẩn vi mô đa luồng để thực hiện các hệ thống con khác nhau trong nhân Linux và các cuộc gọi hệ thống. Điều này cho phép tin tặc dễ dàng nhấn mạnh và đo lường tác động của các thay đổi, do đó giúp giảm thiểu hiệu suất hồi quy

Nó cũng phục vụ như một khung chuẩn chung, cho phép các nhà phát triển dễ dàng tạo các trường hợp thử nghiệm và tích hợp một cách minh bạch và sử dụng hệ thống con công cụ hoàn hảo phong phú

lịch trình. Điểm chuẩn của bộ lập lịch biểu

Đo hoạt động của đường ống [2] và ổ cắm [2] giữa nhiều tác vụ. Cho phép đo lường hiệu suất chuyển ngữ cảnh của luồng so với quy trình

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
1

mem. Điểm chuẩn truy cập bộ nhớ

numa. Lập lịch NUMA và điểm chuẩn MM

cầu lông. Điểm chuẩn nhấn mạnh Futex

Giải quyết các khía cạnh chi tiết hơn của việc triển khai futexes của kernel. Nó chủ yếu hữu ích cho việc hack kernel. Nó hiện hỗ trợ các hoạt động đánh thức và yêu cầu/chờ đợi, cũng như nhấn mạnh sơ đồ băm cho cả futex riêng tư và chia sẻ. Một ví dụ chạy cho các luồng nCPU, mỗi xử lý 1024 futex đo logic băm

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
2

Khắc phục sự cố và mẹo

Phần này liệt kê một số mẹo để tránh những cạm bẫy phổ biến khi sử dụng perf

Mở giới hạn tệp

Thiết kế của giao diện hạt nhân perf_event được sử dụng bởi công cụ perf sao cho nó sử dụng một bộ mô tả tệp cho mỗi sự kiện trên mỗi luồng hoặc trên mỗi cpu

Trên hệ thống 16 chiều, khi bạn làm

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
3

Bạn đang tạo 16 sự kiện một cách hiệu quả và do đó sử dụng 16 bộ mô tả tệp

Ở chế độ mỗi luồng, khi bạn đang lấy mẫu một quy trình có 100 luồng trên cùng một hệ thống 16 chiều

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
4

Sau đó, khi tất cả các luồng được tạo, bạn sẽ có 100 * 1 [sự kiện] * 16 [cpus] = 1600 bộ mô tả tệp. Perf tạo một phiên bản của sự kiện trên mỗi CPU. Chỉ khi luồng thực thi trên CPU đó thì sự kiện mới đo lường hiệu quả. Cách tiếp cận này thực thi cục bộ bộ đệm lấy mẫu và do đó giảm thiểu chi phí lấy mẫu. Khi kết thúc quá trình chạy, công cụ sẽ tổng hợp tất cả các mẫu vào một tệp đầu ra duy nhất

Trong trường hợp perf bị hủy do lỗi 'too many open files', có một vài giải pháp

  • tăng số lượng tệp mở trên mỗi quy trình bằng cách sử dụng ulimit -n. báo trước. bạn phải root
  • giới hạn số lượng sự kiện bạn đo lường trong một lần chạy
  • giới hạn số lượng CPU bạn đang đo

tăng giới hạn tệp mở

Siêu người dùng có thể ghi đè giới hạn tệp mở cho mỗi quá trình bằng cách sử dụng lệnh dựng sẵn shell ulimit

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
5

Lệnh ghi perf lưu trong perf. dữ liệu định danh duy nhất cho tất cả các hình ảnh ELF có liên quan đến phép đo. Ở chế độ mỗi luồng, điều này bao gồm tất cả các hình ảnh ELF của các quy trình được giám sát. Ở chế độ toàn cpu, nó bao gồm tất cả các tiến trình đang chạy trên hệ thống. Các mã định danh duy nhất đó được tạo bởi trình liên kết nếu tùy chọn -Wl,--build-id được sử dụng. Vì vậy, chúng được gọi là build-id. Id bản dựng là một công cụ hữu ích khi liên kết địa chỉ hướng dẫn với hình ảnh ELF. Để trích xuất tất cả các mục nhập id bản dựng được sử dụng trong một buổi hoàn thiện. tập tin dữ liệu, vấn đề

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
6

Bộ đệm id bản dựng

Vào cuối mỗi lần chạy, lệnh bản ghi perf cập nhật bộ đệm id bản dựng, với các mục mới cho hình ảnh ELF có mẫu. Bộ đệm chứa

  • build-id cho hình ảnh ELF với các mẫu
  • bản sao của hình ảnh ELF với các mẫu

Cho rằng id bản dựng là bất biến, chúng xác định duy nhất một tệp nhị phân. Nếu tệp nhị phân được biên dịch lại, id bản dựng mới sẽ được tạo và bản sao mới của hình ảnh ELF được lưu trong bộ đệm. Bộ đệm được lưu trên đĩa trong một thư mục theo mặc định là $HOME/. gỡ lỗi. Có một tệp cấu hình chung ==/etc/perfconfig== có thể được sysadmin sử dụng để chỉ định một thư mục chung thay thế cho bộ đệm

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
7

Trong một số trường hợp nhất định, có thể tắt hoàn toàn các bản cập nhật bộ nhớ cache của id bản dựng. Để làm được điều đó, bạn phải chuyển tùy chọn -N để hoàn thành bản ghi

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
8

Kiểm soát truy cập

Đối với một số sự kiện, cần phải root để gọi công cụ hoàn hảo. Tài liệu này giả định rằng người dùng có quyền root. Nếu bạn cố chạy perf mà không đủ đặc quyền, nó sẽ báo

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
9

Các tình huống khác

Tính năng này cho biết vị trí và thời gian một chương trình đang ngủ hoặc chờ một thứ gì đó

Bước đầu tiên là thu thập dữ liệu. Chúng tôi cần thu thập các sự kiện sched_stat và sched_switch. Các sự kiện Sched_stat là không đủ, bởi vì chúng được tạo trong ngữ cảnh của một tác vụ, sẽ đánh thức một tác vụ đích [e. g. phát hành một khóa]. Chúng tôi cần cùng một sự kiện nhưng với chuỗi cuộc gọi của tác vụ đích. Chuỗi cuộc gọi này có thể được trích xuất từ ​​sự kiện sched_switch trước đó

Bước thứ hai là hợp nhất các sự kiện sched_start và sched_switch. Nó có thể được thực hiện với sự trợ giúp của "perf injection -s"

perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000
0
perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000
1

Các nguồn lực khác

mã nguồn Linux

Mã nguồn của công cụ hoàn hảo sống trong cây nhân Linux bên dưới /tools/perf. Bạn sẽ tìm thấy nhiều tài liệu hơn trong. /công cụ/hoàn hảo/Tài liệu. Để xây dựng các trang, trang thông tin, v.v., hãy cài đặt các công cụ này

  • asciidoc
  • phông chữ tetex
  • tetex-dvips
  • hộp thoại
  • dây buộc
  • tetex-latex
  • xmltex
  • thụ động
  • w3m
  • xmlto

và đưa ra một make install-man từ /tools/perf. Bước này cũng được yêu cầu để có thể chạy perf help

Hướng dẫn này được điều chỉnh từ hướng dẫn của Stephane Eranian tại Google, với sự đóng góp của Eric Gouriou, Tipp Moseley và Willem de Bruijn. Nội dung gốc được nhập vào wiki. hoàn hảo. Google. com được cung cấp theo CreativeCommons ghi công sharealike 3. 0 giấy phép

Chủ Đề