ตรวจสอบการติดตาม

มุมมองการติดตามใน CPU Profiler มีหลายวิธีในการดูข้อมูล จากการติดตามที่บันทึกไว้

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

แป้นพิมพ์ลัดและเมาส์พร้อมให้ใช้งานเพื่อการนำทางที่ง่ายขึ้นในแผนภูมิการโทรหรือเหตุการณ์การติดตาม

ตรวจสอบการติดตามโดยใช้แผนภูมิการเรียก

แผนภูมิการเรียกแสดงภาพการติดตามเมธอดหรือการติดตามฟังก์ชัน โดยระยะเวลาและการกำหนดเวลาของการเรียกจะแสดงบนแกนนอน และผู้ถูกเรียกจะแสดงตามแกนตั้ง การเรียก API ของระบบจะแสดงเป็นสีส้ม การเรียกเมธอดของแอปจะแสดงเป็นสีเขียว และการเรียก API ของบุคคลที่สาม (รวมถึง API ของภาษา Java) จะแสดงเป็นสีน้ำเงิน รูปที่ 4 แสดงแผนภูมิการเรียกตัวอย่างและอธิบายแนวคิดของ เวลาของตัวเอง เวลาของฟังก์ชันย่อย และเวลารวมสำหรับเมธอดหรือฟังก์ชันที่กำหนด คุณดูข้อมูลเพิ่มเติมเกี่ยวกับแนวคิดเหล่านี้ได้ในส่วนวิธีตรวจสอบการติดตามโดยใช้ Top Down และ Bottom Up

รูปที่ 1 แผนภูมิการโทรตัวอย่างที่แสดง เวลาของตัวเอง เวลาของลูก และเวลารวมสำหรับเมธอด D

เคล็ดลับ: หากต้องการข้ามไปยังซอร์สโค้ดของเมธอดหรือฟังก์ชัน ให้คลิกขวาที่เมธอดหรือฟังก์ชันนั้น แล้วเลือกข้ามไปยังแหล่งที่มา ซึ่งใช้ได้จากแท็บใดก็ได้ในแผงการวิเคราะห์

ตรวจสอบร่องรอยโดยใช้แท็บแผนภูมิเปลวไฟ

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

ดูแผนภูมิการเรียกในรูปที่ 2 เพื่อช่วยอธิบายแนวคิดนี้ โปรดทราบว่าเมธอด D จะเรียก B หลายครั้ง (B1, B2 และ B3) และการเรียก B บางครั้งจะเรียก C (C1 และ C3)

รูปที่ 2 แผนภูมิการโทรที่มีการเรียกใช้เมธอดหลายรายการ ซึ่งใช้ลำดับผู้โทรร่วมกัน

เนื่องจาก B1, B2 และ B3 มีลำดับผู้โทรเหมือนกัน (A → D → B) ระบบจึงรวบรวมข้อมูลตามที่แสดงในรูปที่ 3 ในทํานองเดียวกัน ระบบจะรวบรวม C1 และ C3 เนื่องจากมีลําดับผู้โทรเหมือนกัน (A → D → B → C) โปรดทราบว่าระบบจะไม่รวม C2 เนื่องจากมีลําดับผู้โทรที่แตกต่างกัน (A → D → C)

รูปที่ 3 รวบรวมวิธีการที่เหมือนกันซึ่งใช้สแต็กการเรียกใช้เดียวกัน

ระบบจะใช้การเรียกที่รวบรวมไว้เพื่อสร้างแผนภูมิเปลวไฟ ดังแสดงในรูปที่ 4 โปรดทราบว่าสำหรับการเรียกใดๆ ในแผนภูมิเปลวเพลิง ผู้ถูกเรียกที่ใช้เวลา CPU มากที่สุดจะปรากฏก่อน

รูปที่ 4 แผนภูมิเปลวไฟแสดงการเรียก แผนภูมิที่แสดงในรูปที่ 5

ตรวจสอบการติดตามโดยใช้ "จากบนลงล่าง" และ "จากล่างขึ้นบน"

แท็บจากบนลงล่างจะแสดงรายการการเรียกที่การขยายเมธอดหรือ โหนดฟังก์ชันจะแสดงผู้ถูกเรียก รูปที่ 5 แสดงกราฟจากบนลงล่างสำหรับแผนภูมิการเรียกในรูปที่ 1 ลูกศรแต่ละอันในกราฟจะชี้จากผู้โทรไปยังผู้รับสาย

ดังที่แสดงในรูปที่ 5 การขยายโหนดสำหรับเมธอด A ในแท็บจากบนลงล่าง จะแสดงเมธอดที่เรียกใช้ ซึ่งก็คือเมธอด B และ D หลังจากนั้น การขยายโหนดสำหรับเมธอด D จะแสดงผู้เรียก เมธอด B และ C และอื่นๆ คล้ายกับแท็บแผนภูมิเปลวไฟ แผนภูมิต้นไม้จากบนลงล่างจะรวบรวมข้อมูลการติดตามสำหรับเมธอดที่เหมือนกันซึ่ง ใช้สแต็กการเรียกเดียวกัน กล่าวคือ แท็บแผนภูมิเปลวไฟจะแสดงภาพ ของแท็บจากบนลงล่าง

แท็บจากบนลงล่างจะแสดงข้อมูลต่อไปนี้เพื่อช่วยอธิบายเวลา CPU ที่ใช้ในการเรียกแต่ละครั้ง (เวลาจะแสดงเป็นเปอร์เซ็นต์ของเวลาทั้งหมดของ เธรดในช่วงที่เลือกด้วย)

  • ตนเอง: เวลาที่ใช้ในการเรียกใช้เมธอดหรือฟังก์ชันในการดำเนินการโค้ดของตัวเอง และไม่ใช่โค้ดของผู้ที่ถูกเรียก ดังแสดงในรูปที่ 1 สำหรับเมธอด D
  • บุตรหลาน: เวลาที่ใช้ในการเรียกใช้เมธอดหรือฟังก์ชันในการดำเนินการ ผู้ถูกเรียกและไม่ใช่โค้ดของตัวเอง ดังแสดงในรูปที่ 1 สำหรับเมธอด D
  • ทั้งหมด: ผลรวมของเวลาที่ตนเองและบุตรหลานใช้ในวิธีการ ซึ่ง แสดงถึงเวลาทั้งหมดที่แอปใช้ในการดำเนินการโทร ตามที่แสดงใน รูปที่ 1 สำหรับวิธี D

รูปที่ 5 แผนผังจากบนลงล่าง

รูปที่ 6 แผนผังจากล่างขึ้นบนสำหรับเมธอด C จาก รูปที่ 5

แท็บจากล่างขึ้นบนจะแสดงรายการการเรียกที่การขยายโหนดของฟังก์ชันหรือเมธอดจะแสดงผู้เรียก การใช้ตัวอย่างการติดตามที่แสดงในรูปที่ 5 รูปที่ 6 แสดงแผนผังจากล่างขึ้นบนสำหรับเมธอด C การเปิดโหนดสำหรับเมธอด C ในแผนภูมิด้านล่างขึ้นบนจะแสดงผู้เรียกที่ไม่ซ้ำกันแต่ละราย ซึ่งก็คือเมธอด B และ D โปรดทราบ ว่าแม้ B จะเรียก C 2 ครั้ง แต่ B จะปรากฏเพียงครั้งเดียวเมื่อขยายโหนดสำหรับ เมธอด C ในแผนผังจากล่างขึ้นบน หลังจากนั้น การขยายโหนดสำหรับ B จะแสดง ผู้โทรของโหนด ซึ่งก็คือเมธอด A และ D

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

ตนเอง เด็ก รวม
วิธีการหรือฟังก์ชันที่ด้านบนของแผนผังจากล่างขึ้นบน (โหนดบนสุด) แสดงเวลาทั้งหมดที่เมธอดหรือฟังก์ชันใช้ในการเรียกใช้ โค้ดของตัวเอง ไม่ใช่โค้ดของผู้ที่เรียกใช้ เมื่อเทียบกับแผนภูมิต้นทาง ข้อมูลการจับเวลานี้แสดงถึงผลรวมของการเรียกทั้งหมดไปยังเมธอดหรือฟังก์ชันนี้ ตลอดระยะเวลาการบันทึก แสดงเวลาทั้งหมดที่เมธอดหรือฟังก์ชันใช้ในการเรียกใช้ ผู้ถูกเรียกและไม่ใช่โค้ดของตัวเอง เมื่อเทียบกับแผนภูมิต้นไม้จากบนลงล่าง ข้อมูลการจับเวลานี้แสดงถึงผลรวมของการเรียกทั้งหมดไปยัง วิธีการหรือฟังก์ชันที่เรียกใช้ในช่วงระยะเวลาของการบันทึก ผลรวมของเวลาของฟังก์ชันเองและเวลาของฟังก์ชันย่อย
ผู้โทร (โหนดย่อย) แสดงเวลาที่ใช้ด้วยตนเองทั้งหมดของผู้ถูกเรียกเมื่อผู้เรียกเรียก การใช้แผนผังจากล่างขึ้นบนในรูปที่ 6 เป็นตัวอย่าง เวลาของเมธอด B จะเท่ากับผลรวมของเวลาของเมธอดเอง สำหรับการดำเนินการแต่ละครั้งของเมธอด C เมื่อ B เรียกใช้ แสดงเวลารวมของบุตรหลานของผู้รับสายเมื่อผู้โทรเรียกใช้ การใช้แผนผังจากล่างขึ้นบนในรูปที่ 6 เป็นตัวอย่าง เวลาของบุตรหลานสำหรับเมธอด B จะเท่ากับผลรวมของ เวลาของบุตรหลานสำหรับการดำเนินการแต่ละครั้งของเมธอด C เมื่อเรียกใช้โดย B ผลรวมของเวลาของฟังก์ชันเองและเวลาของฟังก์ชันย่อย

หมายเหตุ: สำหรับการบันทึกที่กำหนด Android Studio จะหยุดรวบรวมข้อมูลใหม่ เมื่อโปรไฟล์เลอร์ถึงขีดจำกัดขนาดไฟล์ (แต่การดำเนินการนี้จะไม่หยุด การบันทึก) โดยปกติแล้ว การดำเนินการนี้จะเกิดขึ้นเร็วกว่ามากเมื่อทำการติดตามที่มีการวัดประสิทธิภาพ เนื่องจากประเภทการติดตามนี้จะรวบรวมข้อมูลได้มากกว่าในเวลาที่สั้นกว่าเมื่อเทียบกับการติดตามแบบสุ่มตัวอย่าง หากคุณขยายเวลาการตรวจสอบเป็น ระยะเวลาของการบันทึกที่เกิดขึ้นหลังจากถึงขีดจำกัด ข้อมูลเวลาใน แผงการติดตามจะไม่เปลี่ยนแปลง (เนื่องจากไม่มีข้อมูลใหม่) นอกจากนี้ แผงการติดตามจะแสดง NaN สำหรับข้อมูลการจับเวลาเมื่อคุณเลือกเฉพาะ ส่วนของการบันทึกที่ไม่มีข้อมูล

ตรวจสอบการติดตามโดยใช้ตารางเหตุการณ์

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

รูปที่ 7 การดูแท็บเหตุการณ์ในแผงการวิเคราะห์

ตรวจสอบเฟรม Callstack

Callstack มีประโยชน์ในการทำความเข้าใจว่าส่วนใดของโค้ดที่ได้รับการดำเนินการ และเหตุใดจึงมีการเรียกใช้ หากมีการรวบรวมการบันทึกตัวอย่าง Callstack สำหรับโปรแกรม Java/Kotlin โดยปกติแล้ว Callstack จะไม่เพียงรวมโค้ด Java/Kotlin แต่ยังรวมเฟรมจากโค้ดเนทีฟ JNI, เครื่องเสมือน Java (เช่น android::AndroidRuntime::start) และเคอร์เนลของระบบ ([kernel.kallsyms]+offset) เนื่องจากโดยปกติแล้วโปรแกรม Java/Kotlin จะ ดำเนินการผ่านเครื่องเสมือน Java ต้องใช้โค้ดที่มาพร้อมเครื่องเพื่อเรียกใช้ โปรแกรมเองและเพื่อให้โปรแกรมสื่อสารกับระบบและฮาร์ดแวร์ได้ Profiler จะแสดงเฟรมเหล่านี้เพื่อให้มีความแม่นยำ อย่างไรก็ตาม คุณอาจพบหรือไม่พบว่าเฟรมการเรียกเพิ่มเติมเหล่านี้มีประโยชน์ ทั้งนี้ขึ้นอยู่กับ การตรวจสอบ Profiler มีวิธีพับเฟรมที่คุณไม่สนใจ เพื่อให้คุณซ่อนข้อมูลที่ไม่เกี่ยวข้องกับการตรวจสอบได้

ในตัวอย่างด้านล่างนี้ Trace ด้านล่างมีเฟรมจำนวนมากที่มีป้ายกำกับ [kernel.kallsyms]+offset ซึ่งปัจจุบันไม่มีประโยชน์ต่อการพัฒนา

ตัวอย่างการติดตามการโทร

หากต้องการยุบเฟรมเหล่านี้ให้เหลือเฟรมเดียว ให้เลือกปุ่มยุบเฟรม จากแถบเครื่องมือ เลือกเส้นทางที่จะยุบ แล้วเลือกปุ่มใช้ เพื่อใช้การเปลี่ยนแปลง ในตัวอย่างนี้ เส้นทางคือ [kernel.kallsyms]

ตัวอย่างเมนู simpleperf

การทำเช่นนี้จะยุบเฟรมที่สอดคล้องกับเส้นทางที่เลือกในทั้งแผงด้านซ้ายและด้านขวา ดังที่แสดงด้านล่าง

ตัวอย่างเฟรมที่ยุบของ simpleperf

ตรวจสอบการติดตามระบบ

เมื่อตรวจสอบการติดตามระบบ คุณจะตรวจสอบเหตุการณ์การติดตามในไทม์ไลน์เธรดเพื่อดูรายละเอียดของเหตุการณ์ที่เกิดขึ้นในแต่ละเธรดได้ วางเคอร์เซอร์เมาส์เหนือเหตุการณ์เพื่อดูชื่อเหตุการณ์และ เวลาที่ใช้ในแต่ละสถานะ คลิกเหตุการณ์เพื่อดูข้อมูลเพิ่มเติมในแผงการวิเคราะห์

ตรวจสอบการติดตามระบบ: แกน CPU

นอกเหนือจากข้อมูลการจัดกำหนดการ CPU แล้ว การติดตามระบบยังรวมถึงความถี่ CPU ต่อคอร์ด้วย ซึ่งจะแสดงปริมาณกิจกรรมในแต่ละแกนและอาจช่วยให้คุณทราบว่าแกนใดเป็น"แกนใหญ่" หรือ "แกนเล็ก" ในโปรเซสเซอร์อุปกรณ์เคลื่อนที่สมัยใหม่

รูปที่ 8 การดูกิจกรรมของ CPU และเหตุการณ์การติดตามสำหรับเธรดการแสดงผล

แผงแกน CPU (ดังที่แสดงในรูปที่ 8) จะแสดงกิจกรรมของเธรดที่กำหนดเวลา ในทุกแกน วางเคอร์เซอร์เมาส์เหนือกิจกรรมของเธรดเพื่อดูว่าเธรดใดที่แกนนี้ทำงานอยู่ ณ เวลาดังกล่าว

ดูข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบข้อมูลการติดตามระบบได้ที่ส่วนตรวจสอบปัญหาด้านประสิทธิภาพ UI ของเอกสารประกอบ systrace

ตรวจสอบการติดตามระบบ: ไทม์ไลน์การแสดงผลเฟรม

คุณสามารถตรวจสอบระยะเวลาที่แอปใช้ในการแสดงผลแต่ละเฟรมในเทรดหลักและRenderThreadเพื่อตรวจสอบคอขวดที่ทำให้ UI กระตุกและมีอัตราเฟรมต่ำได้ ดูวิธีใช้การติดตามระบบเพื่อตรวจสอบและช่วยลดอาการ UI Jank ได้ที่การตรวจหา UI Jank

ตรวจสอบการติดตามระบบ: หน่วยความจำของกระบวนการ (RSS)

สำหรับแอปที่ติดตั้งใช้งานในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป ส่วนหน่วยความจำของกระบวนการ (RSS) จะแสดงปริมาณหน่วยความจำจริงที่แอปใช้อยู่ในปัจจุบัน

รูปที่ 9 การดูหน่วยความจำจริงในโปรไฟล์เลอร์

รวม

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

สำหรับนักพัฒนาแอป Windows ขนาดชุดข้อมูลที่อยู่ในหน่วยความจำจะคล้ายกับขนาดชุดข้อมูลที่ใช้งาน

จัดสรรแล้ว

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

การแมปไฟล์

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

แชร์

ตัวนับนี้จะติดตามปริมาณหน่วยความจำจริงที่ใช้เพื่อแชร์หน่วยความจำ ระหว่างกระบวนการนี้กับกระบวนการอื่นๆ ในระบบ