- 
                Notifications
    You must be signed in to change notification settings 
- Fork 468
perf(profiling): use echion with memcpy #15030
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
| 
  | 
7fab4f9    to
    d7a59f4      
    Compare
  
    | Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 238 ± 2 ms. The average import time from base is: 240 ± 2 ms. The import time difference between this PR and base is: -2.2 ± 0.1 ms. Import time breakdownThe following import paths have shrunk: 
             | 
| Performance SLOsComparing candidate kowalski/profiling-use-echion-with-memcpy (c1433c1) with baseline main (13e4d43) 🟡 Near SLO Breach (5 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 20.441ms (SLO: <22.300ms -8.3%) vs baseline: ~same Memory: ✅ 65.979MB (SLO: <67.000MB 🟡 -1.5%) vs baseline: +4.7% ✅ exception-replay-enabledTime: ✅ 1.341ms (SLO: <1.450ms -7.5%) vs baseline: -0.3% Memory: ✅ 64.268MB (SLO: <67.000MB -4.1%) vs baseline: +4.9% ✅ iastTime: ✅ 20.450ms (SLO: <22.250ms -8.1%) vs baseline: ~same Memory: ✅ 66.044MB (SLO: <67.000MB 🟡 -1.4%) vs baseline: +5.0% ✅ profilerTime: ✅ 15.562ms (SLO: <16.550ms -6.0%) vs baseline: +0.3% Memory: ✅ 54.066MB (SLO: <54.500MB 🟡 -0.8%) vs baseline: +5.0% ✅ resource-renamingTime: ✅ 20.501ms (SLO: <21.750ms -5.7%) vs baseline: -0.2% Memory: ✅ 66.033MB (SLO: <67.000MB 🟡 -1.4%) vs baseline: +4.8% ✅ span-code-originTime: ✅ 25.463ms (SLO: <28.200ms -9.7%) vs baseline: +0.1% Memory: ✅ 67.148MB (SLO: <69.500MB -3.4%) vs baseline: +4.8% ✅ tracerTime: ✅ 20.449ms (SLO: <21.750ms -6.0%) vs baseline: ~same Memory: ✅ 66.054MB (SLO: <67.000MB 🟡 -1.4%) vs baseline: +4.8% ✅ tracer-and-profilerTime: ✅ 22.689ms (SLO: <23.500ms -3.5%) vs baseline: -0.3% Memory: ✅ 67.498MB (SLO: <68.000MB 🟡 -0.7%) vs baseline: +5.0% ✅ tracer-dont-create-db-spansTime: ✅ 19.292ms (SLO: <21.500ms 📉 -10.3%) vs baseline: ~same Memory: ✅ 66.016MB (SLO: <67.000MB 🟡 -1.5%) vs baseline: +4.8% ✅ tracer-minimalTime: ✅ 16.610ms (SLO: <17.500ms -5.1%) vs baseline: +0.2% Memory: ✅ 65.959MB (SLO: <67.000MB 🟡 -1.6%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 20.447ms (SLO: <21.750ms -6.0%) vs baseline: +0.1% Memory: ✅ 71.619MB (SLO: <72.500MB 🟡 -1.2%) vs baseline: +4.9% ✅ tracer-no-cachesTime: ✅ 18.529ms (SLO: <19.650ms -5.7%) vs baseline: +0.5% Memory: ✅ 65.959MB (SLO: <67.000MB 🟡 -1.6%) vs baseline: +4.8% ✅ tracer-no-databasesTime: ✅ 18.808ms (SLO: <20.100ms -6.4%) vs baseline: ~same Memory: ✅ 65.934MB (SLO: <67.000MB 🟡 -1.6%) vs baseline: +4.8% ✅ tracer-no-middlewareTime: ✅ 20.184ms (SLO: <21.500ms -6.1%) vs baseline: +0.2% Memory: ✅ 66.038MB (SLO: <67.000MB 🟡 -1.4%) vs baseline: +4.9% ✅ tracer-no-templatesTime: ✅ 20.346ms (SLO: <22.000ms -7.5%) vs baseline: +0.2% Memory: ✅ 65.963MB (SLO: <67.000MB 🟡 -1.5%) vs baseline: +4.8% 🟡 errortrackingdjangosimple - 6/6✅ errortracking-enabled-allTime: ✅ 18.117ms (SLO: <19.850ms -8.7%) vs baseline: +0.1% Memory: ✅ 65.918MB (SLO: <66.500MB 🟡 -0.9%) vs baseline: +5.0% ✅ errortracking-enabled-userTime: ✅ 18.015ms (SLO: <19.400ms -7.1%) vs baseline: ~same Memory: ✅ 66.026MB (SLO: <66.500MB 🟡 -0.7%) vs baseline: +5.1% ✅ tracer-enabledTime: ✅ 18.055ms (SLO: <19.450ms -7.2%) vs baseline: +0.2% Memory: ✅ 65.910MB (SLO: <66.500MB 🟡 -0.9%) vs baseline: +4.9% 🟡 errortrackingflasksqli - 6/6✅ errortracking-enabled-allTime: ✅ 2.067ms (SLO: <2.300ms 📉 -10.1%) vs baseline: +0.1% Memory: ✅ 52.632MB (SLO: <53.500MB 🟡 -1.6%) vs baseline: +4.8% ✅ errortracking-enabled-userTime: ✅ 2.065ms (SLO: <2.250ms -8.2%) vs baseline: +0.1% Memory: ✅ 52.612MB (SLO: <53.500MB 🟡 -1.7%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 2.068ms (SLO: <2.300ms 📉 -10.1%) vs baseline: ~same Memory: ✅ 52.573MB (SLO: <53.500MB 🟡 -1.7%) vs baseline: +4.7% 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 4.591ms (SLO: <4.750ms -3.4%) vs baseline: +0.2% Memory: ✅ 62.356MB (SLO: <65.000MB -4.1%) vs baseline: +4.8% ✅ appsec-postTime: ✅ 6.634ms (SLO: <6.750ms 🟡 -1.7%) vs baseline: +0.3% Memory: ✅ 62.336MB (SLO: <65.000MB -4.1%) vs baseline: +4.9% ✅ appsec-telemetryTime: ✅ 4.603ms (SLO: <4.750ms -3.1%) vs baseline: +0.5% Memory: ✅ 62.375MB (SLO: <65.000MB -4.0%) vs baseline: +4.8% ✅ debuggerTime: ✅ 1.856ms (SLO: <2.000ms -7.2%) vs baseline: ~same Memory: ✅ 45.329MB (SLO: <47.000MB -3.6%) vs baseline: +4.7% ✅ iast-getTime: ✅ 1.861ms (SLO: <2.000ms -6.9%) vs baseline: +0.2% Memory: ✅ 42.179MB (SLO: <49.000MB 📉 -13.9%) vs baseline: +4.7% ✅ profilerTime: ✅ 1.918ms (SLO: <2.100ms -8.7%) vs baseline: +0.2% Memory: ✅ 46.356MB (SLO: <47.000MB 🟡 -1.4%) vs baseline: +4.7% ✅ resource-renamingTime: ✅ 3.372ms (SLO: <3.650ms -7.6%) vs baseline: +0.2% Memory: ✅ 52.691MB (SLO: <53.500MB 🟡 -1.5%) vs baseline: +4.8% ✅ tracerTime: ✅ 3.357ms (SLO: <3.650ms -8.0%) vs baseline: +0.3% Memory: ✅ 52.744MB (SLO: <53.500MB 🟡 -1.4%) vs baseline: +5.1% ✅ tracer-nativeTime: ✅ 3.357ms (SLO: <3.650ms -8.0%) vs baseline: +0.3% Memory: ✅ 58.235MB (SLO: <60.000MB -2.9%) vs baseline: +5.0% 🟡 flasksqli - 6/6✅ appsec-enabledTime: ✅ 3.972ms (SLO: <4.200ms -5.4%) vs baseline: -0.1% Memory: ✅ 62.246MB (SLO: <66.000MB -5.7%) vs baseline: +4.8% ✅ iast-enabledTime: ✅ 2.441ms (SLO: <2.800ms 📉 -12.8%) vs baseline: +0.5% Memory: ✅ 59.179MB (SLO: <60.000MB 🟡 -1.4%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 2.060ms (SLO: <2.250ms -8.4%) vs baseline: -0.2% Memory: ✅ 52.612MB (SLO: <54.500MB -3.5%) vs baseline: +4.8% 
 | 
d7a59f4    to
    d1af0c8      
    Compare
  
    d1af0c8    to
    c1433c1      
    Compare
  
    
Description
This PR updates
dd-trace-pyto use the latest version of Echion.The main change is the new "fast memory copy" feature that significantly reduces the time it takes to copy memory from the Python process by using a SEGV-guarded
memcpy(no system call involved) instead ofprocess_vm_readv.echion/perf: use memcpy instead of process_vm_readv
This feature is experimental and we intend to test it within Datadog before making it widely available (and eventually, hopefully making it the default/only available option).
Currently,
ddtracecannot enable/disable the feature itself; the Echion library relies on theECHION_USE_FAST_COPY_MEMORYenvironment variable on startup to enable/disable it.Testing
The change has been tested on benchmarks, in the CI and inside the reliability environment. No crashes are happening.