-
Notifications
You must be signed in to change notification settings - Fork 78
Add flow transactions profile docs
#1645
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
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,262 @@ | ||||||||||||||||
| --- | ||||||||||||||||
| title: Profile a Transaction | ||||||||||||||||
| description: How to profile the computational performance of a Flow transaction | ||||||||||||||||
| sidebar_position: 9 | ||||||||||||||||
| keywords: | ||||||||||||||||
| - flow cli | ||||||||||||||||
| - transactions | ||||||||||||||||
| - profiling | ||||||||||||||||
| - performance | ||||||||||||||||
| - optimization | ||||||||||||||||
| - computation | ||||||||||||||||
| - pprof | ||||||||||||||||
| - gas optimization | ||||||||||||||||
| - cadence profiling | ||||||||||||||||
| --- | ||||||||||||||||
|
|
||||||||||||||||
| The Flow CLI provides a command to profile the computational performance of sealed transactions on any Flow network. This diagnostic tool generates detailed CPU profiles in the industry-standard `pprof` format, allowing you to analyze exactly where computation is being spent during transaction execution. | ||||||||||||||||
|
|
||||||||||||||||
| The command works by forking the blockchain state and replaying the transaction in an isolated environment, ensuring accurate profiling results that match the original execution. | ||||||||||||||||
|
|
||||||||||||||||
| ```shell | ||||||||||||||||
| flow transactions profile <tx_id> --network <network_name> [flags] | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| ## Use Cases | ||||||||||||||||
|
|
||||||||||||||||
| Transaction profiling helps developers: | ||||||||||||||||
|
|
||||||||||||||||
| - **Optimize Transaction Costs**: Identify computational bottlenecks and optimize gas-heavy operations | ||||||||||||||||
| - **Debug High Gas Usage**: Understand why a transaction consumed more computation than expected | ||||||||||||||||
| - **Analyze Production Transactions**: Profile real transactions on mainnet or testnet to understand actual performance | ||||||||||||||||
| - **Compare Implementations**: Evaluate different approaches by comparing their computational profiles | ||||||||||||||||
| - **Find Performance Issues**: Trace computation usage through contract calls and dependencies | ||||||||||||||||
|
|
||||||||||||||||
| ## Example Usage | ||||||||||||||||
|
|
||||||||||||||||
| Profile a mainnet transaction: | ||||||||||||||||
|
|
||||||||||||||||
| ```shell | ||||||||||||||||
| > flow transactions profile 07a8...b433 --network mainnet | ||||||||||||||||
|
|
||||||||||||||||
| Transaction Profiling Report | ||||||||||||||||
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ | ||||||||||||||||
|
|
||||||||||||||||
| Transaction ID: 07a8...b433 | ||||||||||||||||
| Network: mainnet | ||||||||||||||||
| Block Height: 12345678 | ||||||||||||||||
| Status: SEALED | ||||||||||||||||
| Events emitted: 5 | ||||||||||||||||
| Computation: 1234 | ||||||||||||||||
|
|
||||||||||||||||
| Profile saved: profile-07a8b433.pb.gz | ||||||||||||||||
|
|
||||||||||||||||
| Analyze with: | ||||||||||||||||
| go tool pprof -http=:8080 profile-07a8b433.pb.gz | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| Profile with custom output location: | ||||||||||||||||
|
|
||||||||||||||||
| ```shell | ||||||||||||||||
| > flow transactions profile 0xabc123 --network testnet --output my-profile.pb.gz | ||||||||||||||||
|
|
||||||||||||||||
| Profile saved: my-profile.pb.gz | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| Profile an emulator transaction: | ||||||||||||||||
|
|
||||||||||||||||
| ```shell | ||||||||||||||||
| > flow transactions profile 0xdef456 --network emulator | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| ## Analyzing Profile Data | ||||||||||||||||
|
|
||||||||||||||||
| The generated `.pb.gz` file can be analyzed using Go's pprof tools. If you don't have Go installed, see the [Go installation guide](https://go.dev/doc/install). | ||||||||||||||||
|
|
||||||||||||||||
| ### Interactive Web Interface | ||||||||||||||||
|
|
||||||||||||||||
| Open the profile in an interactive web interface: | ||||||||||||||||
|
|
||||||||||||||||
| ```bash | ||||||||||||||||
| go tool pprof -http=:8080 profile-07a8b433.pb.gz | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| Then navigate to `http://localhost:8080` in your browser. | ||||||||||||||||
|
|
||||||||||||||||
| The pprof web interface provides several visualization options: | ||||||||||||||||
|
|
||||||||||||||||
| | View | Description | | ||||||||||||||||
| |------|-------------| | ||||||||||||||||
| | **Flame Graph** | Visual representation of call stacks with computation costs | | ||||||||||||||||
| | **Graph** | Directed graph showing call relationships | | ||||||||||||||||
| | **Top** | List of functions sorted by computation usage | | ||||||||||||||||
| | **Source** | Source code annotated with computation costs | | ||||||||||||||||
|
|
||||||||||||||||
| ### Command-Line Analysis | ||||||||||||||||
|
|
||||||||||||||||
| View top computation consumers: | ||||||||||||||||
|
|
||||||||||||||||
| ```bash | ||||||||||||||||
| go tool pprof -top profile-07a8b433.pb.gz | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| List all functions with costs: | ||||||||||||||||
|
|
||||||||||||||||
| ```bash | ||||||||||||||||
| go tool pprof -list=. profile-07a8b433.pb.gz | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| Generate a flame graph image: | ||||||||||||||||
|
|
||||||||||||||||
| ```bash | ||||||||||||||||
| go tool pprof -png profile-07a8b433.pb.gz > profile.png | ||||||||||||||||
| ``` | ||||||||||||||||
|
|
||||||||||||||||
| For comprehensive information on analyzing computation profiles, see the [Cadence Computation Profiling guide](../../../cadence/advanced-concepts/computation-profiling.md). | ||||||||||||||||
|
|
||||||||||||||||
| ## How It Works | ||||||||||||||||
|
|
||||||||||||||||
| The profiling process: | ||||||||||||||||
|
|
||||||||||||||||
| 1. **Fetches the Transaction**: Retrieves the target sealed transaction by ID from the specified network | ||||||||||||||||
| 2. **Forks Blockchain State**: Creates a fork of the blockchain state from the block immediately before the transaction's block (uses the same forking mechanism as [Fork Testing](../fork-testing.md)) | ||||||||||||||||
| 3. **Replays Execution**: Replays all prior transactions in the same block to recreate the exact state | ||||||||||||||||
| 4. **Profiles Target Transaction**: Executes the target transaction with Cadence runtime profiling enabled | ||||||||||||||||
| 5. **Exports Profile**: Saves the profiling data to a pprof-compatible file | ||||||||||||||||
|
|
||||||||||||||||
| This ensures the profile accurately reflects the transaction's execution in its original context. | ||||||||||||||||
|
|
||||||||||||||||
| :::info | ||||||||||||||||
| The transaction profiling command uses Flow's state forking capabilities under the hood to create an accurate execution environment. Learn more about state forking in the [Fork Testing guide](../fork-testing.md). | ||||||||||||||||
| ::: | ||||||||||||||||
|
|
||||||||||||||||
| ## Arguments | ||||||||||||||||
|
|
||||||||||||||||
| ### Transaction ID | ||||||||||||||||
|
|
||||||||||||||||
| - Name: `<tx_id>` | ||||||||||||||||
| - Valid Input: transaction ID (with or without `0x` prefix) | ||||||||||||||||
|
|
||||||||||||||||
| The transaction ID to profile. The transaction must be sealed. | ||||||||||||||||
|
|
||||||||||||||||
| ## Flags | ||||||||||||||||
|
|
||||||||||||||||
| ### Network | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--network` | ||||||||||||||||
| - Short Flag: `-n` | ||||||||||||||||
| - Valid inputs: the name of a network defined in `flow.json` | ||||||||||||||||
| - **Required** | ||||||||||||||||
|
|
||||||||||||||||
| Specify which network the transaction was executed on (e.g., `mainnet`, `testnet`, `emulator`). | ||||||||||||||||
|
|
||||||||||||||||
| ### Output | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--output` | ||||||||||||||||
| - Short Flag: `-o` | ||||||||||||||||
| - Valid inputs: valid file path | ||||||||||||||||
| - Default: `profile-{tx_id_prefix}.pb.gz` | ||||||||||||||||
|
|
||||||||||||||||
| Custom output file path for the profile data. The file will be saved in compressed pprof format (`.pb.gz`). | ||||||||||||||||
|
|
||||||||||||||||
| ### Host | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--host` | ||||||||||||||||
| - Valid inputs: an IP address or hostname | ||||||||||||||||
| - Default: `127.0.0.1:3569` (Flow Emulator) | ||||||||||||||||
|
|
||||||||||||||||
| Specify the hostname of the Access API that will be used to fetch transaction data. This flag overrides any host defined by the `--network` flag. | ||||||||||||||||
|
|
||||||||||||||||
| ### Network Key | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--network-key` | ||||||||||||||||
| - Valid inputs: A valid network public key of the host in hex string format | ||||||||||||||||
|
|
||||||||||||||||
| Specify the network public key of the Access API that will be used to create a secure GRPC client when executing the command. | ||||||||||||||||
|
|
||||||||||||||||
| ### Filter | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--filter` | ||||||||||||||||
| - Short Flag: `-x` | ||||||||||||||||
| - Valid inputs: a case-sensitive name of the result property | ||||||||||||||||
|
|
||||||||||||||||
| Specify any property name from the result you want to return as the only value. | ||||||||||||||||
|
|
||||||||||||||||
| ### Output Format | ||||||||||||||||
|
|
||||||||||||||||
| - Flag: `--output` | ||||||||||||||||
| - Short Flag: `-o` | ||||||||||||||||
| - Valid inputs: `json`, `inline` | ||||||||||||||||
|
|
||||||||||||||||
| Specify the format of the command results displayed in the console. | ||||||||||||||||
|
|
||||||||||||||||
|
Comment on lines
+187
to
+194
|
||||||||||||||||
| ### Output Format | |
| - Flag: `--output` | |
| - Short Flag: `-o` | |
| - Valid inputs: `json`, `inline` | |
| Specify the format of the command results displayed in the console. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you link to forking here or put an info bubble like "To read more about forking..."