
โครงการนี้เป็นความพยายามของ KDAB R&D ในการสร้าง GUI แบบสแตนด์อโลนสำหรับข้อมูลประสิทธิภาพ ในฐานะเป้าหมายแรกเราต้องการจัดหา UI เช่น Kcachegrind รอบ ๆ Linux Perf มองไปข้างหน้าเราตั้งใจที่จะสนับสนุนรูปแบบข้อมูลประสิทธิภาพอื่น ๆ ภายใต้ร่มนี้
นี่คือภาพหน้าจอบางส่วนที่แสดงคุณสมบัติที่สำคัญที่สุดของฮอตสปอตในการดำเนินการ:
คุณสมบัติหลักของฮอตสปอตคือการสร้างภาพกราฟิกของไฟล์ perf.data


หมายเหตุ: ฟังก์ชั่น Inlined มีเส้นขอบสีเข้มกว่าฟังก์ชั่นที่ไม่ได้ จำกัด





เส้นเวลาอนุญาตให้กรองผลลัพธ์ตามเวลากระบวนการหรือเธรด มุมมองข้อมูลได้รับการอัปเดตตามนั้น



นอกจากนี้คุณยังสามารถเปิด perf จากฮอตสปอตเพื่อโปรไฟล์แอปพลิเคชันที่เริ่มต้นใหม่หรือแนบไปยังกระบวนการที่กำลังทำงานอยู่แล้ว คำนึงถึงข้อแม้ด้านล่าง


หมายเหตุ: ฮอตสปอตยังไม่ได้บรรจุในการแจกแจง Linux ทั้งหมด ในกรณีเช่นนี้หรือหากคุณต้องการใช้เวอร์ชันล่าสุดโปรดใช้ AppImage ซึ่งจะทำงานกับ Linux Distro ล่าสุดได้ดี
ฮอตสปอตมีอยู่ใน AUR (https://aur.archlinux.org/packages/hotspot)
ฮอตสปอตมีให้บริการใน Debian (https://packages.debian.org/hotspot) และ Ubuntu (https://packages.ubuntu.com/hotspot)
ฮอตสปอต ebuilds มีให้บริการจากการซ้อนทับของเรา (https://github.com/kdab/kdab-overlay)
ฮอตสปอตมีอยู่ใน Fedora (https://packages.fedoraproject.org/pkgs/hotspot/hotspot/)
คุณสามารถตรงไปที่การเปิดตัวล่าสุดหรือการสร้างอย่างต่อเนื่อง ในทั้งสองกรณีคุณจะพบกับ appimage ภายใต้ "สินทรัพย์" ที่คุณสามารถดาวน์โหลดได้ ไม่ใช้ไฟล์ appimage (ในกรณีที่มีการเปิดตัวล่าสุด) จากนั้นทำให้สามารถเรียกใช้งานได้แล้วเรียกใช้
โปรดใช้บิลด์ล่าสุดเพื่อรับเวอร์ชันล่าสุด หากไม่ได้ผลโปรดรายงานข้อผิดพลาดและทดสอบเวอร์ชันที่เสถียรล่าสุด
หมายเหตุ: ไลบรารีระบบหรือการตั้งค่าของคุณจะไม่เปลี่ยนแปลง ในกรณีที่คุณต้องการลบฮอตสปอตอีกครั้งเพียงลบไฟล์ที่ดาวน์โหลด เรียนรู้เพิ่มเติมเกี่ยวกับ appimage ที่นี่
หากต้องการค้นหาวิธีการดีบัก AppImage ดูการแฮ็ค
การสร้างฮอตสปอตจากแหล่งกำเนิดช่วยให้คุณได้รับล่าสุดและยิ่งใหญ่ที่สุด แต่คุณจะต้องตรวจสอบให้แน่ใจว่ามีการพึ่งพาทั้งหมด ผู้ใช้ส่วนใหญ่ควรติดตั้งฮอตสปอตจาก Distro Package Manager หรือเป็น Appimage
สำหรับทุกคนที่ต้องการมีส่วนร่วมในฮอตสปอตหรือใช้เวอร์ชันใหม่ล่าสุดโดยไม่พบโน้ตรายละเอียดที่น่าสนใจในการแฮ็ก
ก่อนอื่นบันทึกข้อมูลบางอย่างด้วย perf ในการรับ backtraces คุณจะต้องเปิดใช้งานโหมด CallGraph Dwarf:
perf record --call-graph dwarf < your application >
...
[ perf record: Woken up 58 times to write data ]
[ perf record: Captured and wrote 14.874 MB perf.data (1865 samples) ] ตอนนี้ถ้าคุณมีฮอตสปอตพร้อมใช้งานในเครื่องเดียวกันสิ่งที่คุณต้องทำคือเปิดตัว มันจะเปิดไฟล์ perf.data โดยอัตโนมัติในไดเรกทอรีปัจจุบัน (คล้ายกับ perf report )
หรือคุณสามารถระบุเส้นทางไปยังไฟล์ข้อมูลบนคอนโซล:
hotspot /path/to/perf.data ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการผ่านตัวเลือกบรรทัดคำสั่งเพิ่มเติมไปยังฮอตสปอต สิ่งนี้ช่วยให้ตัวเลือกการกำหนดค่าชุดครั้งเดียวที่พบใน GUI ภายใต้ "การตั้งค่า" และยังช่วยให้สามารถแปลงไฟล์ข้อมูล Linux Perf เป็นรูปแบบ PerfData ขนาดเล็กและพกพาได้ (ดูนำเข้า / ส่งออกสำหรับรายละเอียดเกี่ยวกับสิ่งนั้น) ตัวเลือกบรรทัดคำสั่งทั้งหมดจะแสดงด้วย --help :
Usage: hotspot [options] [files...]
Linux perf GUI for performance analysis.
Options:
-h, --help Displays help on commandline options.
--help-all Displays help including Qt specific options.
-v, --version Displays version information.
--sysroot <path> Path to sysroot which is used to find libraries.
--kallsyms <path> Path to kallsyms file which is used to resolve
kernel symbols.
--debugPaths <paths> Colon separated list of paths that contain debug
information. These paths are relative to the
executable and not to the current working directory.
--extraLibPaths <paths> Colon separated list of extra paths to find
libraries.
--appPath <path> Path to folder containing the application executable
and libraries.
--sourcePaths <paths> Colon separated list of search paths for the source
code.
--arch <path> Architecture to use for unwinding.
--exportTo <path> Path to .perfparser output file to which the input
data should be exported. A single input file has to
be given too.
--perf-binary <path> Path to the perf binary.
--objdump-binary <path> Path to the objdump binary.
Arguments:
files Optional input files to open on startup, i.e.
perf.data files.
ฮอตสปอตรองรับวิธีที่ทรงพลังมากในการวิเคราะห์เวลารอหรือไม่หรือการทำโปรไฟล์ OFF-CPU การวิเคราะห์นี้ขึ้นอยู่กับเคอร์เนล tracepoints ใน Linux Scheduler โดยการบันทึกข้อมูลนั้นเราสามารถค้นหาเวลาเดลต้าในระหว่างที่เธรดไม่ทำงานบน CPU แต่แทนที่จะเป็น OFF-CPU อาจมีหลายเหตุผลสำหรับสิ่งนั้นซึ่งทั้งหมดสามารถพบได้โดยใช้เทคนิคนี้:
read() หรือ write()mmap() 'EDnanosleep() หรือ yield()futex() ฯลฯด้วยการใช้ประโยชน์จากคะแนนการติดตามเคอร์เนลในตารางเวลาค่าใช้จ่ายนั้นสามารถจัดการได้ค่อนข้างมากและเราจ่ายเฉพาะราคาเมื่อกระบวนการเริ่มต้นขึ้นจริง ที่สะดุดตาที่สุดเราจะไม่จ่ายราคาเมื่อการดำเนินการล็อค Mutex สามารถจัดการได้โดยตรงในพื้นที่ผู้ใช้
ในการทำการวิเคราะห์ OFF-CPU ด้วยฮอตสปอตคุณต้องบันทึกข้อมูลด้วยคำสั่งเฉพาะ:
perf record
-e cycles # on-CPU profiling
-e sched:sched_switch --switch-events # off-CPU profiling
--sample-cpu # track on which core code is executed
-m 8M # reduce chance of event loss
--aio -z # reduce disk-I/O overhead and data size
--call-graph dwarf # we definitely want backtraces
< your application >หรือคุณสามารถใช้ช่องทำเครื่องหมาย OFF-CPU ในหน้าบันทึกรวมของฮอตสปอต
ในระหว่างการวิเคราะห์คุณสามารถสลับระหว่างมุมมองต้นทุน "รอบ" สำหรับข้อมูล ON-CPU เป็นมุมมองต้นทุน "OFF-CPU เวลา" สำหรับการวิเคราะห์เวลารอ บ่อยครั้งที่คุณจะต้องเปลี่ยนแปลงระหว่างทั้งสองเช่นเพื่อค้นหาสถานที่ในรหัสของคุณซึ่งอาจต้องใช้การขนานเพิ่มเติม (ดูกฎหมายของ Amdahl)
ค่าใช้จ่าย "schede: sched_switch" จะแสดงให้คุณเห็นด้วย แต่ในความคิดของฉันที่มีประโยชน์น้อยกว่าเพราะมันระบุจำนวนสวิตช์ตารางเวลาเท่านั้น ความยาวของเวลาในระหว่างนั้นมักจะน่าสนใจสำหรับฉันมากขึ้น - และนั่นคือสิ่งที่แสดงให้คุณเห็นในตัวชี้วัด "OFF -CPU Time"
หากคุณกำลังบันทึกในระบบฝังตัวคุณจะต้องวิเคราะห์ข้อมูลบนเครื่องพัฒนาของคุณด้วยฮอตสปอต ในการทำเช่นนั้นตรวจสอบให้แน่ใจว่าระบบของคุณมีข้อมูลการดีบักที่จำเป็นสำหรับการคลี่คลาย (ดูด้านล่าง) จากนั้นบันทึกข้อมูลในระบบฝังตัวของคุณ:
embedded$ perf record --call-graph dwarf < your application >
...
[ perf record: Woken up 58 times to write data ]
[ perf record: Captured and wrote 14.874 MB perf.data (1865 samples) ]
embedded$ cp /proc/kallsyms /tmp/kallsyms # make pseudo-file a real fileไม่เป็นไรถ้าเครื่องฝังตัวของคุณใช้แพลตฟอร์มที่แตกต่างจากโฮสต์ของคุณ บนโฮสต์ของคุณทำตามขั้นตอนต่อไปนี้เพื่อวิเคราะห์ข้อมูล:
host$ scp embedded:perf.data embedded:/tmp/kallsyms .
host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms
perf.dataหากคุณปรับใช้แอปพลิเคชันจากเส้นทางนอกระบบของคุณด้วยตนเองให้ทำสิ่งนี้แทน:
host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app
perf.dataหากแอปพลิเคชันของคุณใช้ไลบรารีนอกระบบของคุณและ AppPath ให้ทำเช่นนี้:
host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app
--extraLibPaths /path/to/lib1:/path/to/lib2:...
perf.dataและกรณีที่เลวร้ายที่สุดหากคุณใช้ไฟล์ debug แยกในตำแหน่งที่ไม่ได้มาตรฐานให้ทำสิ่งนี้:
host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app
--extraLibPaths /path/to/lib1:/path/to/lib2:...
--debugPaths /path/to/debug1:/path/to/debug2:...
perf.data รูปแบบไฟล์ perf.data ไม่ได้อยู่ในตัวเอง ในการวิเคราะห์คุณต้องเข้าถึงผู้ดำเนินการและไลบรารีของกระบวนการที่มีประวัติพร้อมกับสัญลักษณ์การดีบัก สิ่งนี้ทำให้ไม่สามารถแบ่งปันไฟล์ดังกล่าวได้ในเครื่องจักรเช่นเพื่อรับความช่วยเหลือจากเพื่อนร่วมงานเพื่อตรวจสอบปัญหาประสิทธิภาพหรือเพื่อวัตถุประสงค์ในการรายงานข้อผิดพลาด
ฮอตสปอตช่วยให้คุณสามารถส่งออกข้อมูลที่วิเคราะห์ได้ซึ่งมีอยู่ในตัวเองอย่างเต็มที่ คุณสมบัตินี้สามารถเข้าถึงได้ผ่านการดำเนินการเมนู "ไฟล์> บันทึกเป็น" ข้อมูลจะถูกบันทึกไว้ในไฟล์ *.perfparser ที่อยู่ในตัวเอง หากต้องการนำเข้าข้อมูลลงในฮอตสปอตอีกครั้งเพียงเปิดไฟล์นั้นโดยตรงแทนไฟล์ perf.data ดั้งเดิม
อีกทางเลือกหนึ่งคุณสามารถทำการส่งออกจากบรรทัดคำสั่ง (โดยไม่มี GUI ดังนั้นจึงสามารถใช้งานได้กับการสร้างอัตโนมัติ) โดยใช้ตัวเลือก --exportTo
หมายเหตุ: รูปแบบไฟล์ยัง ไม่ เสถียร ความหมายของข้อมูลที่ส่งออกโดยฮอตสปอตรุ่นเดียวสามารถอ่านได้ในเวอร์ชันเดียวกันเท่านั้น ปัญหานี้จะได้รับการแก้ไขในอนาคตตามเวลาอนุญาต
ปัจจุบันฮอตสปอตแสดงชื่อของ tracepoints ในไทม์ไลน์เท่านั้น


ฮอตสปอตรวมถึงการถอดชิ้นส่วนซึ่งสามารถแสดงค่าใช้จ่ายต่อการเรียนการสอน Disassembler ใช้สีเพื่อระบุว่าสายการประกอบใดที่สอดคล้องกับบรรทัดซอร์สโค้ด เพื่อการนำทางที่ง่ายขึ้นคุณสามารถคลิกที่บรรทัดและมุมมองอื่น ๆ จะข้ามไป คุณสามารถติดตามการโทรฟังก์ชั่นด้วยการคลิกสองครั้ง ในมุมมอง sourcecode คุณสามารถกด Ctrl+F หรือกดไอคอนการค้นหาเพื่อเปิดหน้าต่างการค้นหา
หากคุณมีแหล่งที่มาในไดเรกทอรีที่แตกต่างกันคุณสามารถใช้ --sourcePaths หรือการตั้งค่าเพื่อเลือกบอก disassembler เพื่อค้นหาที่นั่นสำหรับซอร์สโค้ด
หากมีสิ่งใดแบ่งในด้านบนและเอาต์พุตใช้งานได้น้อยกว่า perf report โปรดรายงานปัญหาเกี่ยวกับ GitHub ที่กล่าวว่ามีปัญหาบางอย่างที่ผู้คนอาจเดินทางข้าม:
การคลี่คลายสแต็กเพื่อผลิต backtrace เป็นศิลปะมืดและสามารถผิดพลาดได้หลายวิธี ฮอตสปอตอาศัย perfparser (ดูด้านล่าง) ซึ่งขึ้นอยู่กับ libdw จาก elfutils ไปยังสแต็ก วิธีนี้ใช้งานได้ดีเกือบตลอดเวลา แต่ก็ยังผิดพลาดได้ ที่สะดุดตาที่สุดคือการคลี่คลายจะล้มเหลวเมื่อ:
perf.data หายไป--debugPaths <paths> : ใช้สิ่งนี้เมื่อคุณแยกไฟล์ดีบั๊กในตำแหน่งที่ไม่ได้มาตรฐาน--extraLibPaths <paths> : ใช้สิ่งนี้เมื่อคุณย้ายไลบรารีไปยังสถานที่อื่นตั้งแต่การบันทึก--appPath <paths> : นี่คือการรวมกันของสองฟิลด์ข้างต้น เส้นทางนั้นถูกสำรวจซ้ำ ๆ มองหาไฟล์ดีบั๊กและไลบรารี--sysroot <path> : ใช้สิ่งนี้เมื่อคุณพยายามตรวจสอบไฟล์ข้อมูลที่บันทึกไว้ในแพลตฟอร์มฝังตัว-O2 -g คุณจะต้องทำซ้ำขั้นตอน perf record โดยค่าเริ่มต้น perf record จะคัดลอกส่วนหนึ่งของสแต็กไปยังไฟล์ข้อมูล สิ่งนี้สามารถนำไปสู่ปัญหาเกี่ยวกับสแต็คการโทรที่ลึกมากซึ่งจะถูกตัดออกในบางจุด ปัญหานี้จะทำลายต้นไม้โทรจากบนลงล่างในฮอตสปอตซึ่งมองเห็นได้ในมุมมองบนลงล่างหรือกราฟเปลวไฟ ในการแก้ไขปัญหานี้คุณสามารถลองเพิ่มขนาดการถ่ายโอนข้อมูลสแต็กเช่น:
perf record --call-graph dwarf,32768
โปรดทราบว่าสิ่งนี้สามารถเพิ่มขนาดของไฟล์ perf.data ได้อย่างมาก - ใช้ด้วยความระมัดระวัง ดูที่ man perf record
สำหรับบางสถานการณ์การเรียกใช้ฟังก์ชันเรียกซ้ำไม่สามารถคลี่คลายได้ ดู #93
Hotspot รองรับการดาวน์โหลดสัญลักษณ์การดีบักผ่าน DebuginFod สิ่งนี้สามารถเปิดใช้งานได้โดยการเพิ่ม URL ดาวน์โหลดในการตั้งค่าหรือเปิดฮอตสปอตด้วย DEBUGINFOD_URLS ที่กำหนดไว้ในสภาพแวดล้อม
เมื่อเปรียบเทียบกับ perf report Hotspot พลาดคุณสมบัติมากมาย บางส่วนของสิ่งเหล่านี้มีการวางแผนที่จะได้รับการแก้ไขในอนาคต คนอื่นอาจไม่เคยถูกนำไปใช้ แต่โปรดทราบว่า ไม่มี คุณสมบัติต่อไปนี้ในฮอตสปอตในปัจจุบัน:
--itrace --mem-mode --branch-stack และ --branch-history ไม่ได้รับการสนับสนุน ไม่ใช่ ความคิดที่ดีที่จะเปิดฮอตสปอตด้วย sudo หรือเป็นผู้ใช้ root ดูไฟล์แก้ไขเช่นรูทสำหรับบทความเกี่ยวกับเรื่องนั้น ปัญหา #83 ก็เกี่ยวข้องกับผู้ติดต่อนี้เช่นกัน
แต่หากไม่มีสิทธิ์ superuser คุณอาจเห็นข้อความแสดงข้อผิดพลาดเช่นต่อไปนี้เมื่อใช้คุณสมบัติบันทึกของฮอตสปอต:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv
เพื่อแก้ปัญหาข้อ จำกัด นี้ฮอตสปอตสามารถเรียกใช้ Perf ได้ด้วยสิทธิพิเศษที่สูงขึ้น
การส่งออกข้อมูลปัจจุบันนั้น จำกัด อยู่ที่รูปแบบที่สามารถอ่านได้โดยฮอตสปอตของเวอร์ชันเดียวกันเท่านั้น สิ่งนี้ทำให้ interop กับเครื่องมือการสร้างภาพอื่น ๆ เป็นไปไม่ได้ สิ่งนี้เป็นที่รู้จักและจะได้รับการปรับปรุงในอนาคต การสนับสนุนที่โดดเด่นที่สุดสำหรับการส่งออกไปยังผู้ชมเว็บเช่น Perfetto หรือ Mozilla Profiler มีการวางแผน แต่ยังไม่ได้ดำเนินการ แพทช์ยินดีต้อนรับ!
โครงการนี้ใช้ประโยชน์จากยูทิลิตี้ perfparser ที่ยอดเยี่ยมที่สร้างขึ้นโดย บริษัท QT สำหรับผู้สร้าง QT IDE หากคุณใช้ QT Creator อยู่แล้วให้พิจารณาใช้ประโยชน์จากเครื่องวิเคราะห์การใช้งาน CPU แบบบูรณาการ
ฮอตสปอตได้รับใบอนุญาตภายใต้ GPL V2+ ดู license.gpl.txt สำหรับข้อมูลเพิ่มเติมหรือติดต่อ [email protected] หากเงื่อนไขใด ๆ ของการออกใบอนุญาตนี้ไม่ชัดเจนสำหรับคุณ