

บทนำ: ทำไม Linux Perf Tools ถึงสำคัญใน Code Review สมัยใหม่
ในยุคที่ประสิทธิภาพของซอฟต์แวร์เป็นปัจจัยชี้วัดความสำเร็จของผลิตภัณฑ์ การทำ Code Review ที่เน้นเพียงความถูกต้องของ logic หรือ security vulnerability นั้นไม่เพียงพออีกต่อไป นักพัฒนาระดับสูงจำเป็นต้องมองเห็นภาพรวมของประสิทธิภาพการทำงานของโค้ดตั้งแต่ในขั้นตอนการตรวจสอบ (Code Review) ซึ่งเครื่องมือที่ทรงพลังที่สุดในโลก Linux สำหรับการวิเคราะห์ประสิทธิภาพคือ Linux Perf Tools หรือที่รู้จักในชื่อ perf
บทความนี้จะพาคุณไปรู้จักกับแนวปฏิบัติที่ดีที่สุด (Best Practice) สำหรับการใช้ Linux Perf Tools ในกระบวนการ Code Review ตั้งแต่การตั้งค่าเครื่องมือ การตีความผลลัพธ์ ไปจนถึงการนำไปใช้ในสถานการณ์จริง โดยเน้นเนื้อหาที่อัปเดตสำหรับปี 2026 และอ้างอิงจากประสบการณ์ของทีม SiamCafe Blog
1. พื้นฐานของ Linux Perf Tools ที่ Developer ต้องรู้
1.1 perf คืออะไร และทำงานอย่างไร
perf เป็นเครื่องมือ profiling ที่ทำงานบน Linux kernel โดยตรง ใช้ประโยชน์จาก Performance Monitoring Unit (PMU) ของ CPU และ kernel tracepoints เพื่อเก็บข้อมูลประสิทธิภาพโดยมี overhead ต่ำมาก แตกต่างจากเครื่องมืออื่นเช่น gprof ที่ต้อง recompile โปรแกรม perf ทำงานได้โดยไม่ต้องแก้ไข source code
การทำงานของ perf แบ่งออกเป็น 2 โหมดหลัก:
- Sampling mode: เก็บตัวอย่างการทำงานของโปรแกรมเป็นระยะ (คล้ายการสุ่มตัวอย่างทางสถิติ)
- Counting mode: นับจำนวนเหตุการณ์ที่เกิดขึ้นทั้งหมด (เช่น จำนวน cache miss, จำนวน instruction)
1.2 คำสั่งพื้นฐานที่จำเป็น
# ตรวจสอบ hardware events ที่ support
perf list
# เก็บตัวอย่าง 10 วินาที สำหรับ PID 1234
perf record -p 1234 -- sleep 10
# เก็บตัวอย่างสำหรับ command ที่ระบุ
perf record -g ./my_application
# แสดงผลลัพธ์ที่เก็บไว้
perf report
# ดูสถิติแบบ real-time
perf stat -e cycles,instructions,cache-misses ./my_application
ตารางเปรียบเทียบ: perf vs strace vs gprof
| คุณสมบัติ | perf | strace | gprof |
|---|---|---|---|
| Overhead | ต่ำมาก (1-5%) | สูง (10-100x ช้า) | ปานกลาง (10-30%) |
| ต้องแก้ไขโค้ด | ไม่ต้อง | ไม่ต้อง | ต้อง compile ด้วย -pg |
| ข้อมูลที่ได้ | CPU, memory, I/O, kernel | System calls เท่านั้น | Function call graph |
| เหมาะสำหรับ | Production profiling | Debug system calls | Development profiling |
2. การตั้งค่า Environment สำหรับ Code Review ด้วย perf
2.1 การเตรียมระบบ
ก่อนเริ่มต้นใช้งาน perf จำเป็นต้องตรวจสอบสิทธิ์และการตั้งค่าบางอย่าง:
# ตรวจสอบว่า perf ติดตั้งแล้ว
which perf
# ติดตั้ง perf (Ubuntu/Debian)
sudo apt install linux-tools-common linux-tools-$(uname -r)
# เปิดใช้งาน kernel.perf_event_paranoid (ค่า 0-2)
sudo sysctl -w kernel.perf_event_paranoid=1
# สำหรับการดู kernel symbols
sudo sysctl -w kernel.kptr_restrict=0
ข้อควรระวัง: การตั้งค่า perf_event_paranoid เป็น 0 หรือ 1 อาจมีความเสี่ยงด้านความปลอดภัย ควรใช้เฉพาะใน environment ที่ควบคุมได้
2.2 การสร้าง baseline สำหรับ Code Review
การทำ Code Review ที่มีประสิทธิภาพต้องมี baseline ที่ชัดเจน ขั้นตอนที่แนะนำ:
- วัดก่อนเปลี่ยนแปลงโค้ด: ใช้
perf statเพื่อบันทึกค่าพื้นฐาน เช่น IPC (Instructions Per Cycle), cache miss rate - วัดหลังเปลี่ยนแปลงโค้ด: ทำการวัดซ้ำภายใต้สภาพแวดล้อมเดียวกัน
- เปรียบเทียบผลลัพธ์: ใช้
perf diffเพื่อดูความแตกต่าง
2.3 การใช้ perf ใน CI/CD Pipeline
สำหรับทีมที่ต้องการ automation สามารถ integrate perf เข้ากับ CI/CD โดยใช้ script ดังนี้:
#!/bin/bash
# ci_perf_check.sh
PERF_LOG="perf_result_$(git rev-parse --short HEAD).log"
BASELINE_LOG="perf_baseline.log"
# Run performance test
perf stat -e cycles,instructions,cache-misses,branch-misses \
-o $PERF_LOG \
./run_tests.sh
# Compare with baseline if exists
if [ -f "$BASELINE_LOG" ]; then
echo "=== Performance Comparison ==="
awk 'NR==FNR{a[$1]=$2; next} {print $0, "vs baseline:", a[$1]}' \
$BASELINE_LOG $PERF_LOG
# Check for regression > 10%
python3 -c "
import sys
with open('$PERF_LOG') as f:
perf_data = f.read()
with open('$BASELINE_LOG') as f:
baseline_data = f.read()
# Add your regression check logic here
print('Performance check completed')
"
fi
3. เทคนิคการวิเคราะห์ Code ด้วย perf ในระดับลึก
3.1 การระบุ Hotspot ด้วย Call Graph
หนึ่งในฟีเจอร์ที่มีประโยชน์ที่สุดของ perf คือการสร้าง call graph ที่แสดงว่า CPU time ถูกใช้ไปที่ฟังก์ชันใดบ้าง:
# เก็บข้อมูลพร้อม call graph
perf record -g --call-graph dwarf ./application
# ดู call graph แบบ interactive
perf report -g graph
# Export เป็น flamegraph
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
เทคนิคการอ่าน Flame Graph:
- ความกว้างของแถบแสดงสัดส่วน CPU time ที่ใช้
- สีที่ต่างกันช่วยแยกประเภทฟังก์ชัน (user space vs kernel space)
- มองหา “plateaus” หรือ “mesas” ซึ่งบ่งบอกถึง bottleneck
3.2 การวิเคราะห์ Cache Misses
Cache miss เป็นสาเหตุหลักของ performance degradation ในระบบสมัยใหม่ โดยเฉพาะกับ data-intensive applications:
# วัด cache misses เฉพาะเจาะจง
perf stat -e L1-dcache-load-misses,L1-dcache-loads \
-e LLC-load-misses,LLC-loads \
./my_application
# ระบุตำแหน่งที่เกิด cache miss
perf record -e cache-misses -g ./my_application
perf report
สาเหตุทั่วไปของ cache miss ที่พบใน Code Review:
- False sharing: ตัวแปรที่แชร์ระหว่าง thread แต่อยู่ใน cache line เดียวกัน
- Random access pattern: การเข้าถึงข้อมูลแบบสุ่มใน array ขนาดใหญ่
- Pointer chasing: การ traverse linked list ที่ไม่เป็นระเบียบ
3.3 การวิเคราะห์ Branch Prediction
Branch misprediction ส่งผลกระทบต่อ performance ใน CPU สมัยใหม่ที่ใช้ deep pipeline:
# วัด branch statistics
perf stat -e branch-misses,branch-instructions ./application
# หาว่า branch ไหน mispredict บ่อย
perf record -e branch-misses -g ./application
perf report
ตาราง: ผลกระทบของ Branch Misprediction ต่อ IPC
| Branch Miss Rate | IPC ที่คาดหวัง | ผลกระทบต่อ performance |
|---|---|---|
| < 1% | 3.0 – 4.0 | น้อยมาก |
| 1% – 5% | 2.0 – 3.0 | ปานกลาง |
| 5% – 10% | 1.0 – 2.0 | รุนแรง |
| > 10% | < 1.0 | วิกฤต |
4. Best Practices สำหรับการทำ Code Review ด้วย perf
4.1 หลักการสำคัญ 5 ข้อ
- วัดก่อนแก้ไขเสมอ: อย่าเดาว่าโค้ดส่วนไหนช้า ใช้ข้อมูลจาก perf เป็นหลักฐาน
- ใช้การทดสอบที่ reproducible: ต้องมั่นใจว่า environment และ input data เหมือนเดิมทุกครั้ง
- วิเคราะห์ทั้ง CPU และ I/O: บางครั้ง bottleneck อยู่ที่ disk หรือ network ไม่ใช่ CPU
- ตรวจสอบ false sharing ใน multi-thread: ใช้
perf c2c(cache-to-cache) สำหรับ NUMA systems - ไม่เชื่อถือ single measurement: ควรวัดซ้ำอย่างน้อย 3-5 ครั้งแล้วหาค่าเฉลี่ย
4.2 การเขียน Code Review Comments ที่มีประสิทธิภาพ
ตัวอย่าง comment ที่ดีและไม่ดี:
❌ ไม่ดี: “ฟังก์ชันนี้ช้า ควร optimize”
✅ ดี: “จาก perf report ฟังก์ชัน process_order() ใช้ CPU time 45% โดย 80% มาจาก std::unordered_map::find() แนะนำให้เปลี่ยนเป็น absl::flat_hash_map ซึ่งมี cache locality ดีกว่า จากการทดสอบใน PR #1234 ลด cache miss ลง 30%”
4.3 กรณีศึกษา: การ Optimize Web Server
สถานการณ์: ทีมพัฒนา REST API พบว่า response time เพิ่มขึ้นหลัง merge PR ใหม่
ขั้นตอนการวิเคราะห์:
- ใช้
perf topขณะ load test พบว่าjson_parse()ใช้ CPU มากที่สุด - ใช้
perf record -gดู call graph พบว่ามีการเรียกmalloc()ทุกครั้งที่ parse JSON - ตรวจสอบโค้ดพบว่ามีการสร้าง string object ใหม่ทุก iteration
- แก้ไขโดยใช้ string_view และ object pool
- วัดซ้ำพบว่า CPU usage ลดลง 60% และ response time ลดลง 40%
5. การใช้ perf ร่วมกับเครื่องมืออื่น
5.1 Flame Graph + perf
Flame Graph เป็น visualization ที่ได้รับความนิยมสูงสุดสำหรับการวิเคราะห์ performance การสร้างทำได้ง่าย:
# ติดตั้ง FlameGraph tools
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
# สร้าง flame graph
perf record -F 99 -g -- ./application
perf script | ./stackcollapse-perf.pl > out.folded
./flamegraph.pl out.folded > flame.svg
5.2 perf + Valgrind (สำหรับ memory analysis)
แม้ว่า perf จะเก่งด้าน CPU profiling แต่สำหรับ memory leak หรือ undefined behavior ควรใช้ Valgrind ร่วมด้วย:
# ใช้ perf หา hotspot ก่อน
perf record -g ./application
# จากนั้นใช้ Valgrind ตรวจสอบ memory
valgrind --tool=memcheck --leak-check=full ./application
5.3 การใช้ BPF Tools ร่วมกับ perf
ใน Linux 2026 มีเครื่องมือ BPF (Berkeley Packet Filter) ที่ทำงานร่วมกับ perf ได้อย่างมีประสิทธิภาพ:
# ใช้ bpftrace เพื่อ trace function เฉพาะ
bpftrace -e 'kprobe:do_sys_open { printf("%s %s\n", comm, str(arg1)); }'
# รวมกับ perf สำหรับการวิเคราะห์ที่ลึกขึ้น
perf record -e 'syscalls:sys_enter_openat' -a -- sleep 5
6. การจัดการกับความท้าทายที่พบบ่อย
6.1 Overhead ของ perf เอง
แม้ว่า perf จะมี overhead ต่ำ แต่ใน production environment ควรระมัดระวัง:
- ใช้
perf statแทนperf recordถ้าต้องการ only counting - ลด sampling frequency (
-F 99แทน-F 999) - ใช้
--no-inheritเพื่อไม่ trace child processes
6.2 การตีความข้อมูลที่ซับซ้อน
บางครั้งผลลัพธ์จาก perf อาจทำให้เข้าใจผิดได้ เช่น:
- High IPC ≠ Good performance: ถ้าโปรแกรมทำ useless work เร็วเกินไป
- Low cache miss ≠ Good locality: ถ้าข้อมูลไม่ถูกใช้เลย
- Kernel time สูง: อาจเกิดจาก system calls บ่อยเกินไป
6.3 การทำงานกับ Container และ Virtualization
ในยุคที่ container ถูกใช้แพร่หลาย การใช้ perf ต้องระวังเรื่อง permission:
# ใช้ perf ใน Docker container
docker run --privileged --pid=host \
-v /sys/kernel/debug:/sys/kernel/debug \
-v /proc:/host/proc \
ubuntu perf stat -a sleep 5
# หรือใช้ --cap-add=SYS_ADMIN
docker run --cap-add=SYS_ADMIN \
--security-opt seccomp=unconfined \
ubuntu perf record -g ./app
7. การสร้าง Culture ของ Performance Review ในทีม
7.1 การกำหนดมาตรฐานทีม
ทีม SiamCafe Blog แนะนำให้สร้าง Performance Review Checklist สำหรับทุก Pull Request:
- ✅ มีการวัด baseline ด้วย perf stat หรือยัง?
- ✅ มีการเปรียบเทียบก่อน-หลัง หรือยัง?
- ✅ มี flame graph แนบมาใน PR description หรือไม่?
- ✅ cache miss rate เพิ่มขึ้นหรือลดลง?
- ✅ มีการทดสอบภายใต้ load จริงหรือไม่?
7.2 การจัด Workshop ภายในทีม
ควรจัด session เพื่อสอนการใช้ perf ให้สมาชิกในทีม โดยเน้น:
- การตั้งค่า environment
- การอ่าน flame graph
- การ identify common patterns (false sharing, cache miss, branch mispredict)
- การเขียน script automation สำหรับ CI/CD
7.3 กรณีศึกษา: การลด latency ใน Real-time System
ปัญหา: ระบบ trading platform มี latency spike สูงถึง 500ms ในบางช่วง
การวิเคราะห์ด้วย perf:
# ใช้ perf วัด latency distribution
perf record -e cycles -c 10000 -g -- ./trading_app
# ดู call stack ที่ latency สูง
perf report --sort symbol --call-graph
ผลการวิเคราะห์: พบว่า garbage collector ของ Java ทำงานนานเกินไป แก้ไขโดยปรับ JVM flags และเปลี่ยนเป็น G1GC ทำให้ latency spike ลดลงเหลือ 50ms
8. เทคนิคขั้นสูงสำหรับปี 2026
8.1 การใช้ Hardware Tracing (Intel PT / AMD PT)
ใน CPU รุ่นใหม่ๆ (Intel 12th gen+, AMD Zen 4+) มี hardware tracing ที่ให้ข้อมูลละเอียดระดับ instruction:
# ใช้ Intel Processor Trace
perf record -e intel_pt//u ./application
# ดู instruction trace
perf script --itrace=i1ns -F time,pid,ip,sym,symoff
8.2 การวิเคราะห์ NUMA Effects
สำหรับระบบ multi-socket ควรตรวจสอบ NUMA locality:
# ดู NUMA statistics
perf stat -e numa_hit,numa_miss,numa_foreign ./application
# ใช้ perf c2c สำหรับ cache coherence
perf c2c record -g ./application
perf c2c report
8.3 การใช้ AI/ML ร่วมกับ perf Data
ในปี 2026 มีเครื่องมือที่ใช้ machine learning เพื่อวิเคราะห์ perf data โดยอัตโนมัติ:
- Perf-Insight: ใช้ neural network เพื่อแนะนำ optimization
- AutoPerf: ระบบที่ automate การหา bottleneck และเสนอ patch
- ML-based Anomaly Detection: ตรวจจับ performance regression โดยอัตโนมัติ
9. ข้อควรระวังและข้อจำกัด
9.1 สิ่งที่ perf ทำไม่ได้
- ไม่สามารถ trace user-space memory allocation ได้โดยตรง (ต้องใช้
perf memหรือ Valgrind) - ไม่เหมาะสำหรับ short-lived processes (sampling ไม่ทัน)
- ข้อมูล kernel symbols ต้องใช้
kptr_restrict=0ซึ่งอาจไม่ปลอดภัย
9.2 ปัญหาที่พบบ่อย
- Permission denied: ต้องใช้ sudo หรือตั้งค่า sysctl
- No symbols: ต้อง compile ด้วย
-gหรือใช้ debug packages - Inconsistent results: เนื่องจาก CPU frequency scaling หรือ thermal throttling
Summary
Linux Perf Tools เป็นเครื่องมือที่ทรงพลังที่สุดสำหรับการทำ Code Review ที่เน้นประสิทธิภาพในโลก Linux การนำ perf มาใช้ในกระบวนการพัฒนาซอฟต์แวร์ไม่เพียงช่วยค้นหา bottleneck ที่ซ่อนอยู่ แต่ยังช่วยสร้างวัฒนธรรมของ data-driven decision making ในทีม
ประเด็นสำคัญที่ควรจดจำจากบทความนี้:
- เริ่มต้นด้วยการตั้งค่า environment ที่ถูกต้องและปลอดภัย
- ใช้ perf stat สำหรับ quick check และ perf record สำหรับ deep analysis
- สร้าง baseline ทุกครั้งก่อนและหลังการเปลี่ยนแปลงโค้ด
- ใช้ flame graph เพื่อ visualize CPU usage
- ตรวจสอบ cache miss, branch mispredict, และ NUMA effects
- Integrate perf เข้ากับ CI/CD pipeline เพื่อป้องกัน regression
- สร้าง Performance Review Checklist เป็นมาตรฐานของทีม
ในปี 2026 ที่เทคโนโลยี hardware tracing และ AI/ML ถูกนำมาใช้ร่วมกับ perf มากขึ้น นักพัฒนาที่เชี่ยวชาญการใช้เครื่องมือเหล่านี้จะมีข้อได้เปรียบในการสร้างซอฟต์แวร์ที่มีประสิทธิภาพสูง ทีม SiamCafe Blog ขอแนะนำให้ทุกองค์กรเริ่มต้นนำ perf มาใช้ใน Code Review ตั้งแต่วันนี้ เพื่อเตรียมพร้อมสำหรับความท้าทายด้านประสิทธิภาพในอนาคต
สุดท้ายนี้ อย่าลืมว่าเครื่องมือที่ดีที่สุดก็ไร้ค่าหากไม่มีคนที่เข้าใจวิธีการใช้และตีความผลลัพธ์ การลงทุนในการฝึกอบรมสมาชิกในทีมให้มีความรู้ด้าน performance analysis จะให้ผลตอบแทนที่คุ้มค่าในระยะยาว ขอให้ทุกท่านมีความสุขกับการทำ Code Review ที่มีประสิทธิภาพ!