คอลเลกชันเบ็ดเตล็ดของเครื่องมือวิเคราะห์ประสิทธิภาพที่อยู่ระหว่างการพัฒนาและไม่รองรับสำหรับ Linux ftrace และ perf_events (หรือที่เรียกว่าคำสั่ง "perf") ทั้ง ftrace และ perf เป็นเครื่องมือติดตาม Linux หลักที่รวมอยู่ในซอร์สเคอร์เนล ระบบของคุณอาจมี ftrace อยู่แล้ว และ perf มักจะเป็นเพียงการเพิ่มแพ็คเกจ (ดูข้อกำหนดเบื้องต้น)
เครื่องมือเหล่านี้ได้รับการออกแบบมาให้ติดตั้งง่าย (มีการพึ่งพาน้อยที่สุด) ให้ความสามารถในการสังเกตประสิทธิภาพขั้นสูง และใช้งานง่าย: ทำสิ่งหนึ่งและทำได้ดี คอลเลกชันนี้สร้างโดย Brendan Gregg (ผู้เขียน DTraceToolkit)
เครื่องมือเหล่านี้จำนวนมากใช้วิธีแก้ปัญหาชั่วคราวเพื่อให้ฟังก์ชันการทำงานเป็นไปได้บนเคอร์เนล Linux ที่มีอยู่ ด้วยเหตุนี้ เครื่องมือจำนวนมากจึงมีคำเตือน (ดูหน้าคู่มือ) และการนำไปใช้งานควรได้รับการพิจารณาว่าเป็นตัวยึดตำแหน่งจนกว่าจะมีการเพิ่มคุณลักษณะเคอร์เนลในอนาคตหรือระบบย่อยการติดตามใหม่
สิ่งเหล่านี้มีไว้สำหรับ Linux 3.2 และเคอร์เนลที่ใหม่กว่า สำหรับ Linux 2.6.x โปรดดูคำเตือน
เครื่องมือเหล่านี้ถูกนำมาใช้ในการนำเสนอ USENIX LISA 2014: การวิเคราะห์ประสิทธิภาพของ Linux: เครื่องมือใหม่และความลับเก่า
ใช้ ftrace:
การใช้ perf_events:
การใช้ eBPF:
กำลังแสดงกระบวนการและข้อโต้แย้งใหม่:
# ./execsnoop ติดตามผู้บริหาร () Ctrl-C เพื่อสิ้นสุด PID PPID ARGS 22898 22004 ชาย ls 22905 22898 การแปลงล่วงหน้า -e UTF-8 22908 22898 เพจเจอร์ -s 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8 22906 22898 ช้อนโต๊ะ 22911 22910 เสน่ห์ของสถานที่ 22912 22907 groff -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 แย่มาก
การวัดเวลาแฝง I/O ของอุปกรณ์บล็อกตั้งแต่การแทรกคิวจนถึงเสร็จสมบูรณ์:
# ./iolatency -Q ติดตามบล็อก I/O ส่งออกทุกๆ 1 วินาที Ctrl-C เพื่อสิ้นสุด >=(ms) .. <(ms) : I/O |การกระจาย | 0 -> 1 : 1913 |######################################| 1 -> 2 : 438 |######### | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | -
ติดตามจุดติดตาม block:block_rq_insert ด้วยการติดตามสแต็กเคอร์เนล และสำหรับการอ่านเท่านั้น:
# ./tpoint -s block:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d... 7269839.919098: block_rq_insert: 202,1 R 0 () 736560 + 136 [cksum] cksum-11908 [000] ด... 7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => ondemand_readahead => page_cache_async_readahead => generic_file_read_iter => new_sync_read => vfs_read => SyS_read => system_call_fastpath -
นับการเรียกใช้ฟังก์ชันเคอร์เนลที่ขึ้นต้นด้วย "bio_" สรุปทุกวินาที:
# ./funccount -i 1 'bio_*' ติดตาม "bio_*"... Ctrl-C เพื่อสิ้นสุด ฟังก์ชันนับ bio_attempt_back_merge 26 bio_get_nr_vecs 361 bio_alloc 536 bio_alloc_bioset 536 bio_endio 536 ปลอดสารชีวภาพ 536 bio_fs_destructor 536 bio_init 536 bio_integrity_enabled 536 bio_put 729 bio_add_page 1004 -
มีตัวอย่างอีกมากมายในไดเร็กทอรีตัวอย่าง ดูหน้าคนด้วย
ความตั้งใจมีน้อยที่สุดเท่าที่จะเป็นไปได้ เช่น เซิร์ฟเวอร์ Linux 3.2 ที่ไม่มีข้อมูลการดีบัก ดูหน้าคู่มือเครื่องมือสำหรับข้อมูลเฉพาะ
FTRACE กำหนดค่าในเคอร์เนล คุณอาจกำหนดค่านี้แล้วและพร้อมใช้งานในเวอร์ชันเคอร์เนลของคุณ เนื่องจาก FTRACE ถูกเพิ่มครั้งแรกใน 2.6.27 ต้องใช้ CONFIG_FTRACE และตัวเลือก FTRACE อื่นๆ ขึ้นอยู่กับเครื่องมือ เครื่องมือบางอย่าง (เช่น funccount) จำเป็นต้องมี CONFIG_FUNCTION_PROFILER
จำเป็นต้องติดตั้งคำสั่ง "perf" นี่คือแพ็คเกจ linux-tools-common หลังจากติดตั้งแล้ว perf อาจบอกให้คุณติดตั้งแพ็คเกจ linux-tools เพิ่มเติม (linux-tools- kernel_version ) perf สามารถสร้างได้ภายใต้ tools/perf ในแหล่งเคอร์เนล ดูข้อกำหนดเบื้องต้นของ perf_events สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการทำให้ perf_events ทำงานอย่างสมบูรณ์
ต้องใช้เคอร์เนลที่เปิดใช้งานตัวเลือก CONFIG_DEBUG_FS เช่นเดียวกับ FTRACE สิ่งนี้อาจถูกเปิดใช้งานอยู่แล้ว (เพิ่ม debugfs ใน 2.6.10-rc3) จำเป็นต้องติดตั้ง debugfs ด้วย:
# mount -t debugfs none /sys/kernel/debug
สคริปต์จำนวนมากใช้ awk และจะพยายามใช้ mawk หรือ gawk ขึ้นอยู่กับพฤติกรรมที่ต้องการ: mawk สำหรับเอาต์พุตบัฟเฟอร์ (เนื่องจากความเร็ว) และ gawk สำหรับเอาต์พุตแบบซิงโครนัส (เนื่องจาก fflush() ทำงาน ทำให้การจัดกลุ่มมีประสิทธิภาพมากขึ้น เขียน)
นี่เป็นเพียงสคริปต์ หรือคว้าทุกอย่าง:
git clone --depth 1 https://github.com/brendangregg/perf-tools
หรือใช้ลิงก์ Raw บน GitHub เพื่อดาวน์โหลดสคริปต์แต่ละรายการ เช่น:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
สิ่งนี้จะรักษาแท็บ (ซึ่งการคัดลอกและวางอาจทำให้เลอะเทอะ)
Ftrace ถูกเพิ่มครั้งแรกใน Linux 2.6.27 และ perf_events ใน Linux 2.6.31 เวอร์ชันแรกๆ เหล่านี้มีข้อบกพร่องของเคอร์เนล และมีการรายงานการล็อกและการตื่นตระหนกในเคอร์เนลซีรีส์ 2.6.32 ซึ่งรวมถึง CentOS 6.x หากคุณต้องวิเคราะห์เคอร์เนลรุ่นเก่า เครื่องมือเหล่านี้อาจมีประโยชน์เฉพาะในสภาพแวดล้อมที่ทนทานต่อข้อผิดพลาด เช่น ห้องปฏิบัติการที่มีปัญหาจำลอง เครื่องมือเหล่านี้ได้รับการพัฒนาบน Linux 3.2 และเคอร์เนลรุ่นใหม่กว่าเป็นหลัก
อาจมีค่าใช้จ่ายเกิดขึ้น ทั้งนี้ขึ้นอยู่กับเครื่องมือ ดูหัวข้อถัดไป
perf_events กำลังพัฒนา คอลเลกชันนี้เริ่มต้นการพัฒนาประมาณ Linux 3.16 โดยมีเซิร์ฟเวอร์ Linux 3.2 เป็นเป้าหมายหลัก ในเวลาที่ perf_events ขาดความสามารถทางโปรแกรมบางอย่าง (เช่น การรวมในเคอร์เนลแบบกำหนดเอง) เป็นไปได้ว่าสิ่งเหล่านี้จะถูกเพิ่มเข้าไปในเคอร์เนลรุ่นที่กำลังจะมีขึ้น ก่อนหน้านั้น เครื่องมือเหล่านี้จำนวนมากใช้วิธีแก้ไขปัญหา เทคนิค และการแฮ็กเพื่อให้สามารถทำงานได้ เครื่องมือเหล่านี้บางส่วนส่งข้อมูลเหตุการณ์ไปยังพื้นที่ผู้ใช้สำหรับการประมวลผลภายหลัง ซึ่งมีต้นทุนค่าใช้จ่ายสูงกว่าการรวมในเคอร์เนลมาก ค่าใช้จ่ายของแต่ละเครื่องมือมีการอธิบายไว้ในหน้าคู่มือ
คำเตือน : ในกรณี ที่ร้ายแรง แอปพลิเคชันเป้าหมายของคุณอาจทำงานช้าลง 5 เท่าเมื่อใช้เครื่องมือเหล่านี้ อาจมีความเสี่ยงที่จะเกิดการตื่นตระหนกของเคอร์เนล ทั้งนี้ขึ้นอยู่กับเครื่องมือและเวอร์ชันของเคอร์เนล อ่านคำเตือนส่วนหัวของโปรแกรม และทดสอบก่อนใช้งาน
หากค่าใช้จ่ายเป็นปัญหา สามารถปรับปรุงเครื่องมือเหล่านี้ได้ หากยังไม่มีเครื่องมือ ก็สามารถเขียนใหม่ในภาษา C เพื่อใช้ perf_events_open() และ mmap() สำหรับบัฟเฟอร์การติดตาม นอกจากนี้ยังสามารถใช้การนับความถี่ในภาษา C และดำเนินการบน mmap() โดยตรง แทนที่จะใช้ awk/Perl/Python การปรับปรุงเพิ่มเติมสามารถทำได้สำหรับเครื่องมือที่ใช้ ftrace เช่น การใช้สแน็ปช็อตและบัฟเฟอร์ต่ออินสแตนซ์
เครื่องมือเหล่านี้บางส่วนมีจุดมุ่งหมายเพื่อใช้เป็นวิธีแก้ปัญหาระยะสั้นจนกว่าจะมีความสามารถเคอร์เนลเพิ่มขึ้น ซึ่ง ณ จุดนี้จึงสามารถเขียนใหม่ได้อย่างมาก เครื่องมือเหล่านี้เวอร์ชันเก่าจะถูกเก็บไว้ในที่เก็บนี้ สำหรับเคอร์เนลเวอร์ชันเก่า
เนื่องจากเป้าหมายหลักของฉันคือกลุ่มเซิร์ฟเวอร์ Linux 3.2 ที่ไม่มีข้อมูลการดีบัก เครื่องมือเหล่านี้จึงพยายามไม่ต้องใช้มัน ในบางครั้ง สิ่งนี้ทำให้เครื่องมือเปราะบางเกินกว่าที่จำเป็น เนื่องจากฉันใช้วิธีแก้ปัญหา (ซึ่งอาจเป็นเวอร์ชันเคอร์เนลและแพลตฟอร์มเฉพาะ) แทนที่จะใช้ข้อมูล debuginfo (ซึ่งอาจเป็นแบบทั่วไป) ดูหน้าคู่มือสำหรับข้อกำหนดเบื้องต้นโดยละเอียดสำหรับแต่ละเครื่องมือ
ฉันได้ลองใช้ perf_events ("perf") เมื่อเป็นไปได้ เนื่องจากอินเทอร์เฟซนั้นได้รับการพัฒนาสำหรับผู้ใช้หลายคน ด้วยเหตุผลหลายประการ ฉันมักจะต้องใช้ ftrace แทน ftrace นั้นทรงพลังอย่างน่าประหลาดใจ (ขอบคุณ Steven Rostedt!) และฟีเจอร์บางอย่างของมันก็ไม่ได้ถูกเปิดเผยผ่าน perf หรือในการใช้งานทั่วไป ชุดเครื่องมือนี้เป็นการสาธิตคุณสมบัติ Linux ที่ซ่อนอยู่โดยใช้ ftrace
เนื่องจากสิ่งต่างๆ มีการเปลี่ยนแปลง จึงเป็นไปได้มากที่คุณอาจพบว่าเครื่องมือบางอย่างใช้ไม่ได้กับเวอร์ชันเคอร์เนล Linux ของคุณ จะต้องอาศัยความเชี่ยวชาญและการประกอบบางอย่างในการซ่อมแซม
กรณีศึกษาและบทสรุป:
บทความที่เกี่ยวข้อง: