martin-g commented on code in PR #3628:
URL: https://github.com/apache/datafusion-comet/pull/3628#discussion_r2895473530


##########
docs/source/contributor-guide/profiling.md:
##########
@@ -0,0 +1,293 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Profiling
+
+This guide covers profiling tools and techniques for Comet development. 
Because Comet
+spans JVM (Spark) and native (Rust) code, choosing the right profiler depends 
on what
+you are investigating.
+
+## Choosing a Profiling Tool
+
+| Tool                                                                         
  | JVM Frames | Native (Rust) Frames | Install Required | Best For             
                                                          |
+| 
------------------------------------------------------------------------------ 
| ---------- | -------------------- | ---------------- | 
------------------------------------------------------------------------------ |
+| [async-profiler](https://github.com/async-profiler/async-profiler)           
  | Yes        | Yes                  | Yes              | End-to-end Comet 
profiling with unified JVM + native flame graphs              |
+| [Java Flight Recorder 
(JFR)](https://docs.oracle.com/en/java/javase/17/jfapi/) | Yes        | No      
             | No (JDK 11+)     | GC pressure, allocations, thread contention, 
I/O — any JVM-level investigation |
+| [cargo-flamegraph](https://github.com/flamegraph-rs/flamegraph)              
  | No         | Yes                  | Yes              | Isolated Rust 
micro-benchmarks without a JVM                                   |
+
+**Recommendation:** Use **async-profiler** when profiling Spark queries with 
Comet enabled —
+it is the only tool that shows both JVM and native frames in a single flame 
graph.
+Use **JFR** when you need rich JVM event data (GC, locks, I/O) without 
installing anything.
+Use **cargo-flamegraph** when working on native code in isolation via `cargo 
bench`.
+
+## Profiling with async-profiler
+
+[async-profiler](https://github.com/async-profiler/async-profiler) captures 
JVM and
+native code in the same flame graph by using Linux `perf_events` or macOS 
`dtrace`.
+This makes it ideal for profiling Comet, where hot paths cross the JNI 
boundary between
+Spark and Rust.
+
+### Installation
+
+Download a release from the [async-profiler releases 
page](https://github.com/async-profiler/async-profiler/releases):
+
+```shell
+# Linux x64
+wget 
https://github.com/async-profiler/async-profiler/releases/download/v3.0/async-profiler-3.0-linux-x64.tar.gz
+tar xzf async-profiler-3.0-linux-x64.tar.gz -C /opt/async-profiler 
--strip-components=1
+export ASYNC_PROFILER_HOME=/opt/async-profiler
+```
+
+On macOS, download the appropriate `macos` archive instead.
+
+### Attaching to a running Spark application
+
+Use the `asprof` launcher to attach to a running JVM by PID:
+
+```shell
+# Start CPU profiling for 30 seconds, output an HTML flame graph
+$ASYNC_PROFILER_HOME/bin/asprof -d 30 -f flamegraph.html <pid>
+
+# Wall-clock profiling
+$ASYNC_PROFILER_HOME/bin/asprof -e wall -d 30 -f flamegraph.html <pid>
+
+# Start profiling (no duration limit), then stop later
+$ASYNC_PROFILER_HOME/bin/asprof start -e cpu <pid>
+# ... run your query ...
+$ASYNC_PROFILER_HOME/bin/asprof stop -f flamegraph.html <pid>
+```
+
+Find the Spark driver/executor PID with `jps` or `pgrep -f SparkSubmit`.
+
+### Passing profiler flags via spark-submit
+
+You can also attach async-profiler as a Java agent at JVM startup:
+
+```shell
+spark-submit \
+  --conf 
"spark.driver.extraJavaOptions=-agentpath:/opt/async-profiler/lib/libasyncProfiler.so=start,event=cpu,file=driver.html"
 \
+  --conf 
"spark.executor.extraJavaOptions=-agentpath:/opt/async-profiler/lib/libasyncProfiler.so=start,event=cpu,file=executor.html"
 \
+  ...
+```
+
+### Choosing an event type

Review Comment:
   ```suggestion
   Note: If the executor is distributed then `executor.html` will be written on 
the remote node.
   
   ### Choosing an event type
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to