Profiling `influxdb3` ===================== This document explains several profiling strategies. # Preparation ## Choosing a profile You will need to choose a profile to build and run the `influxdb3` binary. Available profiles are configured in [Cargo.toml] and are listed here: - `release`: this is the profile used for release builds, and will produce a fully-optimized production quality release binary. The compile time for this profile can be quite long, so for rapid iteration, this profile is not recommended. - `quick-release`: this is a modified version of `release` intended to produce a close-to-production binary, but with a faster build time. So, it is more suitable to rapid iterations and testing out changes. - `bench`: this is the same as `release`, but will compile the binary with `debuginfo` turned on for more readable symbols in generated profiles. - `quick-bench`: a modified version of `quick-release` that compiles the binary with `debuginfo` turned on. - `dev`: this profile produces an unoptimized binary with `debuginfo` turned on. If you are getting started, we recommend using either the `quick-release` or `quick-bench` profiles to get up and running faster, then once you are ready, and need to get as much performance as possible out of the binary, use `release` or `bench`. ## Building and running the binary Once you have chosen a profile, you can build the `influxdb3` binary using cargo: ``` cargo build -p influxdb3 --profile ``` This will build the binary and place it in the `target` folder in your working directory, e.g., `target//influxdb3`. You can then prfile the `influxdb3` server, or whichever command, using the fully-qualified path and the profiling tools of your choice. For example, ``` /target//influxdb3 serve ``` # Profiling Tools ## macOS Instruments is a versatile profiling tool packaged with XCode on macOS that comes with several built-in profiling tools. In order to profile your compiled `influxdb3` binary, you will need to choose it as the target in Instruments, and then provide the necessary environment variables or command line arguments. For example, to profile a running `influxdb3` instance using the local file system for object storage, you would choose the compiled target as: ``` /target//influxdb3 ``` and then provide the command-line arguments: ``` serve --object-store=file --data-dir=~/.influxdb3 ``` You can then start your profiled binary by pressing the red record button, **File** > **Record Trace** , or with the shortcut `⌘`+`R`. If the default sampling frequency in Instruments is not resolute enough, then you can open the **File** > **Recording Options** and enable **High-Frequency** recording. ### Instruments: CPU/Performance Profiling There are several instruments useful for profiling the CPU and performance of `influxdb3`. - Time Profiler (sample-based CPU profiler) - CPU Profiler (cycle-based CPU profiler) - Filesystem Activity (file system and disk I/O activity) - System Call Trace (system calls and CPU scheduling) ### Instruments: Allocations The allocations instrument is a powerful tool for tracking heap allocations on macOS and recording call stacks. It can be used with Rust and `influxdb3`, but requires some additional steps on aarch64 and later versions of macOS due to increased security. #### Preparing binary You must compile `influxdb3` with `--no-default-features` to ensure the default system allocator is used. Following the compilation step, [you must codesign the binary][instruments-codesign-bin] with the `get-task-allow` entitlement set to `true`. Without the codesign step, the Allocations instrument will fail to start with an error similar to the following: > Required Kernel Recording Resources Are in Use First, generate a temporary entitlements plist file, named `tmp.entitlements`: ```sh /usr/libexec/PlistBuddy -c "Add :com.apple.security.get-task-allow bool true" tmp.entitlements ``` Then codesign the file with the `tmp.entitlements` file: ```sh codesign -s - --entitlements tmp.entitlements -f target/release/influxdb3 ``` You can verify the file is correctly code-signed as follows: ```sh codesign --display --entitlements - target/release/influxdb3 ``` ``` Executable=/target//influxdb3 [Dict] [Key] com.apple.security.get-task-allow [Value] [Bool] true ``` or the running `influxdb3` process using its PID: ```sh codesign --display --entitlements - + ``` [instruments-codesign-bin]: https://developer.apple.com/forums/thread/685964?answerId=683365022#683365022