4.9 KiB
4.9 KiB
Performance Profiling & Analysis
YAMS supports multiple profiling and analysis tools to help identify performance bottlenecks and optimize critical paths.
Profiling Build
The Profiling build type enables instrumentation for various profiling tools:
# Build with profiling support
./setup.sh Profiling
# Compile
meson compile -C build/profiling
This build:
- Uses Debug as base (symbols + assertions enabled)
- Enables Tracy profiler integration
- Includes test binaries for benchmarking
- Outputs to
build/profiling/directory
Tracy Profiler
Tracy provides real-time, low-overhead performance profiling with frame-by-frame analysis.
Setup
- Download Tracy: Get the profiler from https://github.com/wolfpld/tracy/releases
- Build with Tracy:
./setup.sh Profiling - Start Tracy Server: Run the Tracy GUI application
- Run YAMS: Tracy automatically connects and captures data
Usage Example
# Build with profiling
./setup.sh Profiling
meson compile -C build/profiling
# Run commands (Tracy server should be running)
build/profiling/tools/yams-cli/yams search "query" --limit 20
build/profiling/tools/yams-cli/yams add large_corpus/ --recursive
# Observe in Tracy:
# - Function execution times
# - Call stack flamegraphs
# - Memory allocations
# - Lock contention
Key Areas to Profile
For PBI-080 Hierarchical Search:
twoStageVectorSearch()total overhead- Document grouping (hash map operations)
- Hierarchical boosting calculation
- Final result sorting
For General Performance:
- Search query execution paths
- Document ingestion throughput
- Vector index operations
- Metadata repository queries
Valgrind
Valgrind provides detailed memory profiling, leak detection, and cache analysis.
Memory Leak Detection
# Build profiling binary
./setup.sh Profiling
meson compile -C build/profiling
# Run with Valgrind
valgrind --leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
--verbose \
--log-file=valgrind-out.txt \
build/profiling/tools/yams-cli/yams search "test query"
# Check results
less valgrind-out.txt
Callgrind (CPU Profiling)
# Run with callgrind
valgrind --tool=callgrind \
--dump-instr=yes \
--collect-jumps=yes \
build/profiling/tools/yams-cli/yams search "query"
# Visualize with kcachegrind
kcachegrind callgrind.out.*
Massif (Heap Profiling)
# Track heap usage over time
valgrind --tool=massif \
build/profiling/tools/yams-cli/yams add large_directory/ --recursive
# Visualize with massif-visualizer
massif-visualizer massif.out.*
Cachegrind (Cache Analysis)
# Analyze cache behavior
valgrind --tool=cachegrind \
build/profiling/tools/yams-cli/yams search "query"
# View cache statistics
cg_annotate cachegrind.out.*
Perf (Linux Profiling)
For system-wide profiling on Linux:
# Record performance data
perf record -g build/profiling/tools/yams-cli/yams search "query"
# Generate report
perf report
# Generate flamegraph (requires flamegraph tools)
perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg
Fuzzing Build (Stub)
The Fuzzing build type is reserved for future AFL++/libFuzzer integration:
# TODO: Not yet implemented
# ./setup.sh Fuzzing
When implemented, this will enable:
- AFL++ instrumentation for coverage-guided fuzzing
- libFuzzer support for targeted fuzzing
- Sanitizer integration (ASan, UBSan, MSan)
- Corpus generation and minimization
Target areas for fuzzing:
- Query parser (malformed queries)
- Content handlers (malicious file formats)
- IPC protocol (invalid protobuf messages)
- Metadata repository (SQL injection vectors)
Build Comparison
| Build Type | Use Case | Overhead | Tools |
|---|---|---|---|
Debug |
Development | Low | GDB, basic profiling |
Release |
Production | None | Minimal instrumentation |
Profiling |
Performance analysis | Low-Medium | Tracy, Valgrind, Perf |
Fuzzing |
Security testing | High | AFL++, libFuzzer (TODO) |
Best Practices
- Start with Tracy for interactive, real-time profiling
- Use Valgrind for deep memory analysis and leak detection
- Use Perf for system-wide CPU profiling on Linux
- Profile realistic workloads - synthetic benchmarks may not represent production
- Focus on hot paths - optimize where it matters most
- Measure before and after - validate optimizations with data
Disabling Profiling
Regular builds have no profiling overhead:
./setup.sh Debug # Standard debug build
./setup.sh Release # Optimized production build