diff --git a/plans/sqlite_off_main_thread_plan.md b/plans/sqlite_off_main_thread_plan.md
new file mode 100644
index 0000000..a455988
--- /dev/null
+++ b/plans/sqlite_off_main_thread_plan.md
@@ -0,0 +1,379 @@
+# Plan: Remove All SQLite from lws-main Thread
+
+## Problem Statement
+
+After implementing the 4 offload fixes (v2.1.4), `lws-main` still consumes **53.87% avg CPU** (down from 68.71%). Perf profiling shows **100% of the top symbols are SQLite** — B-tree traversal, page cache, VFS reads. The worker threads (`db-read`, `db-write`, `event-worker`) are nearly idle at 0.0–0.1%.
+
+The goal is to eliminate all synchronous SQLite access from `lws-main` so it only does: JSON parsing, WebSocket I/O, subscription matching (in-memory), and message queuing.
+
+## Thread Architecture Change
+
+Reduce from 7 threads to 4:
+
+```
+Current: lws-main, db-read-1, db-read-2, db-read-3, db-read-4, db-write, event-worker
+Proposed: lws-main, db-read, db-write, event-worker
+```
+
+The 4 reader threads are overkill — they average 0.07–0.10% CPU each. A single `db-read` thread is sufficient for the current workload. This can be made configurable later if needed.
+
+## Remaining SQLite Calls on lws-main
+
+Every synchronous SQLite call that currently runs on `lws-main`:
+
+### Hot Path — Per-Event (every incoming EVENT message)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `event_id_exists_in_db()` | websockets.c:1324, 2134 | Every EVENT | ~10-50us per B-tree lookup |
+| `get_config_value("relay_pubkey")` | websockets.c:2050 | Every kind-14 EVENT | SQLite SELECT |
+| `get_config_value("admin_pubkey")` | websockets.c:2073 | Every kind-23456 EVENT | SQLite SELECT |
+
+### Hot Path — Per-Connection (every new WebSocket connection)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_bool("trust_proxy_headers")` | websockets.c:1071 | Every connection | SQLite SELECT |
+| `get_config_bool("nip42_auth_required_events")` | websockets.c:1134 | Every connection | SQLite SELECT |
+| `get_config_bool("nip42_auth_required_subscriptions")` | websockets.c:1135 | Every connection | SQLite SELECT |
+
+### Hot Path — Per-REQ (every subscription request)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_bool("expiration_enabled")` | main.c:1424 | Every REQ | SQLite SELECT |
+| `get_config_bool("expiration_filter")` | main.c:1425 | Every REQ | SQLite SELECT |
+| `check_database_auth_rules()` | websockets.c:1706 | Every REQ when WoT enabled | SQLite SELECT |
+
+### Medium Path — Per-COUNT (NIP-45)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `thread_pool_execute_count_sync()` | websockets.c:3689 | Every COUNT message | Blocks main thread waiting for db-read |
+
+### Low Path — Periodic (every 60s or on timer)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `refresh_hot_config_if_needed()` | websockets.c:228-247 | Every 5s | 8 SQLite SELECTs |
+| `generate_and_post_status_event()` | websockets.c:3213 | Every N hours | store_event + broadcast |
+| `ip_ban_cleanup/log_stats` | websockets.c:3004-3005 | Every 60s | SQLite reads/writes |
+
+### Per-EVENT — Validator Path (called from event-worker AND sync path)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_value("admin_pubkey")` | request_validator.c:308 | Every kind-23456 EVENT | SQLite SELECT |
+| `get_config_value("nip42_auth_enabled")` | request_validator.c:326 | Every EVENT | SQLite SELECT |
+| `get_config_bool("pow_enabled")` | request_validator.c:370 | Every EVENT | SQLite SELECT |
+| `get_config_int("pow_min_difficulty")` | request_validator.c:371 | Every EVENT | SQLite SELECT |
+| `get_config_int("pow_validation_flags")` | request_validator.c:372 | Every EVENT | SQLite SELECT |
+| `get_config_int("nip40_expiration_grace_period")` | request_validator.c:432 | Every EVENT with expiration | SQLite SELECT |
+| `get_config_value("auth_enabled")` | request_validator.c:212 | Every EVENT (reload_auth_config) | SQLite SELECT |
+| `get_config_value("auth_rules_enabled")` | request_validator.c:220 | Every EVENT (reload_auth_config) | SQLite SELECT |
+| `db_count_active_whitelist_rules()` | request_validator.c:536 | Every 5s (cached) | Opens separate SQLite connection |
+
+**Note:** These run on the **event-worker** thread for async-eligible events, but on **lws-main** for special kinds (14, 1059, 23456) that go through the sync validation path. They also run on lws-main for the `nostr_validate_unified_request()` call in the sync fallback.
+
+### Per-EVENT — NIP-13 PoW Validation
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_bool("pow_enabled")` | nip013.c:27 | Every EVENT | SQLite SELECT |
+| `get_config_int("pow_min_difficulty")` | nip013.c:28 | Every EVENT | SQLite SELECT |
+| `get_config_value("pow_mode")` | nip013.c:29 | Every EVENT | SQLite SELECT |
+
+### Per-Broadcast — NIP-40 Expiration Check
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_bool("expiration_enabled")` | subscriptions.c:764 | Every broadcast | SQLite SELECT |
+| `get_config_bool("expiration_filter")` | subscriptions.c:765 | Every broadcast | SQLite SELECT |
+
+### Per-NIP-11 Request (HTTP, not WebSocket)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| 15+ `get_config_value()` calls | nip011.c:96-110 | Every NIP-11 HTTP request | 15 SQLite SELECTs |
+| 10+ `get_config_int()`/`get_config_bool()` calls | nip011.c:113-123 | Every NIP-11 HTTP request | 10 SQLite SELECTs |
+
+### Per-NIP-42 Auth Event
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_value("relay_url")` | nip042.c:99 | Every AUTH event | SQLite SELECT |
+| `get_config_int("relay_port")` | nip042.c:103 | Every AUTH event (fallback) | SQLite SELECT |
+
+### Per-NIP-40 Expiration Check (EVENT submission)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| 5 `get_config_bool()`/`get_config_int()` calls | nip040.c:37-41 | Every EVENT with expiration tag | 5 SQLite SELECTs |
+
+### Subscription Lifecycle (per sub create/close/disconnect)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `db_log_subscription_created()` | subscriptions.c:1043 | Every REQ | SQLite INSERT |
+| `db_log_subscription_closed()` | subscriptions.c:1053 | Every CLOSE | SQLite INSERT + UPDATE |
+| `db_log_subscription_disconnected()` | subscriptions.c:1060 | Every disconnect | SQLite UPDATE + INSERT |
+| `db_update_subscription_events_sent()` | subscriptions.c:1088 | Every broadcast match | SQLite UPDATE |
+| `db_cleanup_orphaned_subscriptions()` | subscriptions.c:1100 | Startup only | SQLite DELETE |
+
+### IP Ban System (per-connection and periodic)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_value("idle_ban_whitelist")` | ip_ban.c:254 | Every ban check | SQLite SELECT |
+| `get_config_bool("auth_fail_ban_enabled")` | ip_ban.c:301, 343 | Every ban check + failure | SQLite SELECT |
+| `get_config_bool("idle_ban_enabled")` | ip_ban.c:307, 394 | Every ban check + idle failure | SQLite SELECT |
+| 6+ `get_config_int()` calls | ip_ban.c:345-399, 464-465 | Every failure recording | SQLite SELECTs |
+| `db_prepare()`/`db_step_stmt()` for ip_bans | ip_ban.c:141-238 | Load at startup + periodic save | SQLite reads/writes |
+
+### Special Kind Sync Path (kinds 14, 1059, 23456)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `store_event()` | websockets.c:1548-1629 | Every special-kind EVENT | Full sync store |
+| `process_admin_event_in_config()` | websockets.c:1468 | Every kind-23456 | Config DB writes |
+| `process_nip17_admin_message()` | websockets.c:1523 | Every kind-1059 when enabled | Decrypt + DB |
+| `process_dm_stats_command()` | websockets.c:3240 | Admin DM stats | Decrypt + query + encrypt |
+| `generate_stats_json()` | api.c:1167 (via dm_admin.c:805) | Admin stats command | Multiple SQLite queries |
+
+### DM Admin Path (called from lws-main for kind 1059/14)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `get_config_value("relay_pubkey")` | dm_admin.c:358, 451 | Every admin DM | SQLite SELECT |
+| `get_config_value("admin_pubkey")` | dm_admin.c:504 | Every admin DM | SQLite SELECT |
+| `get_config_int("nip59_timestamp_max_delay_sec")` | dm_admin.c:373 | Every admin DM | SQLite SELECT |
+| `get_config_int("wot_enabled")` | dm_admin.c:613, 640, 660 | WoT commands | SQLite SELECT |
+
+### API/Monitoring (called from lws-main periodic timer)
+
+| Call | Location | Frequency | Cost |
+|------|----------|-----------|------|
+| `generate_stats_json()` | api.c:1167 | Status post + admin stats | ~10 SQLite queries |
+| `query_time_based_statistics()` | api.c:102 | Monitoring events | SQLite queries |
+| `query_subscription_details()` | api.c:197 | Monitoring events | SQLite queries |
+| `get_config_value("relay_pubkey")` | api.c:419, 821, 1291 | Every monitoring event | SQLite SELECT |
+| `get_config_int("kind_1_status_posts_hours")` | api.c:547 | Status post check | SQLite SELECT |
+| `get_config_int("kind_24567_reporting_throttle_sec")` | api.c:60 | Monitoring throttle | SQLite SELECT |
+
+## Implementation Plan
+
+### Fix 1: Create Global Config Cache — Eliminate ALL get_config_* SQLite Calls
+
+**Impact: Very High** — eliminates 50+ distinct `get_config_value/int/bool` call sites across 8 source files
+
+The audit found `get_config_value/int/bool` calls in: `websockets.c`, `main.c`, `subscriptions.c`, `request_validator.c`, `nip011.c`, `nip013.c`, `nip040.c`, `nip042.c`, `ip_ban.c`, `dm_admin.c`, `api.c`, `config.c`. Every single one does a `SELECT value FROM config WHERE key=?` SQLite query.
+
+**Approach:** Replace `get_config_value_from_table()` with an in-memory hash map that is loaded once at startup and refreshed periodically (every 5s) or on admin config change events.
+
+**Changes:**
+
+1. **New: `config_cache` in config.c** — A simple hash map or fixed array of key-value pairs loaded from the config table:
+ ```c
+ typedef struct {
+ char key[64];
+ char value[512];
+ } config_cache_entry_t;
+
+ static config_cache_entry_t g_config_cache[256];
+ static int g_config_cache_count = 0;
+ static time_t g_config_cache_last_refresh = 0;
+ static pthread_mutex_t g_config_cache_mutex;
+ #define CONFIG_CACHE_TTL_SEC 5
+ ```
+
+2. **Modify `get_config_value_from_table()`** — Instead of querying SQLite, look up in the in-memory cache. If cache is stale, refresh from SQLite (but only once per TTL period, not per call).
+
+3. **Add `config_cache_refresh()`** — Loads all rows from `SELECT key, value FROM config` into the hash map. Called:
+ - Once at startup after config table is populated
+ - Every 5 seconds from the existing `refresh_hot_config_if_needed()` timer
+ - Immediately after `process_admin_event_in_config()` modifies config
+
+4. **Thread safety:** The cache is read from lws-main and event-worker threads. Use a read-write lock or double-buffer pattern. Since config changes are rare, a simple mutex with short hold time is fine.
+
+5. **Remove the existing `hot_config_cache_t`** in websockets.c — it becomes redundant since the global config cache serves the same purpose with broader coverage.
+
+This single change eliminates SQLite calls from:
+- Per-connection: `trust_proxy_headers`, `nip42_auth_required_*` (websockets.c)
+- Per-REQ: `expiration_enabled`, `expiration_filter` (main.c)
+- Per-EVENT: `admin_pubkey`, `relay_pubkey`, `nip42_auth_enabled`, `pow_*` (request_validator.c, nip013.c)
+- Per-broadcast: `expiration_enabled`, `expiration_filter` (subscriptions.c)
+- Per-NIP-11: 25+ config values (nip011.c)
+- Per-NIP-42: `relay_url`, `relay_port` (nip042.c)
+- Per-NIP-40: 5 expiration config values (nip040.c)
+- Per-IP-ban: `idle_ban_*`, `auth_fail_*` config values (ip_ban.c)
+- Per-admin-DM: `relay_pubkey`, `admin_pubkey`, `wot_enabled` (dm_admin.c)
+- Per-monitoring: `relay_pubkey`, throttle values (api.c)
+
+### Fix 2: Move Duplicate Check to Event Worker Thread
+
+**Impact: High** — eliminates the most frequent per-EVENT SQLite call from lws-main
+
+Currently `event_id_exists_in_db()` runs on lws-main before async submission. Move it into the `async_event_worker_main()` function, which already has its own SQLite connection.
+
+**Changes:**
+- Remove `event_id_exists_in_db()` calls from both EVENT paths in websockets.c (lines 1324 and 2134)
+- Add the duplicate check at the start of `async_event_worker_main()` before `nostr_validate_unified_request()`
+- If duplicate found, set `completion->success = 1` and `completion->error_message = "duplicate: already have this event"` and skip crypto
+- The completion handler already sends OK responses, so this works seamlessly
+
+**Trade-off:** Without the early dedup check on lws-main, duplicate events will be submitted to the event worker queue and consume a queue slot + thread wakeup before being detected. This is acceptable because:
+- The worker thread dedup check is still fast (B-tree index lookup)
+- It avoids the much larger cost of running SQLite on lws-main for every event
+- Queue depth is 4096, so even under heavy duplicate traffic this won't overflow
+
+### Fix 3: Make COUNT Queries Async
+
+**Impact: Medium** — eliminates blocking wait on lws-main for NIP-45 COUNT
+
+Currently `handle_count_message()` calls `thread_pool_execute_count_sync()` which blocks lws-main waiting for the db-read worker. Convert to the same async pattern used for REQ queries.
+
+**Changes:**
+- Create `count_async_state_t` similar to `req_async_state_t`
+- Create `count_async_completion_t` with count result
+- Add `submit_count_query_async()` that uses `thread_pool_submit_read()` with a callback
+- The callback pushes to a count completion queue
+- Add `process_count_async_completions()` to drain the queue on lws-main and send COUNT responses
+- Call it from the main event loop alongside `process_req_async_completions()`
+
+### Fix 4: Cache Auth Rules Check Result
+
+**Impact: Low-Medium** — eliminates per-REQ SQLite when WoT is enabled
+
+`check_database_auth_rules()` at websockets.c:1706 runs a SQLite query for every REQ when `wot_enabled == 2`. Cache the result per-session.
+
+**Changes:**
+- Add `wot_checked` and `wot_allowed` fields to `per_session_data`
+- On first REQ, call `check_database_auth_rules()` and cache the result
+- On subsequent REQs from the same session, use the cached value
+- Reset cache when auth state changes (e.g., after NIP-42 AUTH)
+
+### Fix 5: Move Special-Kind EVENT Store to Event Worker
+
+**Impact: Low** — special kinds are rare but currently do full sync store on lws-main
+
+Kinds 14, 1059, and 23456 are currently excluded from async processing because they have special handling. However, the `store_event()` call within those paths still blocks lws-main.
+
+**Changes:**
+- For kind 1059 and kind 14: after special processing completes, submit the store to the event worker instead of calling `store_event()` synchronously
+- For kind 23456: admin events are not stored (processed by admin API), so no change needed
+- This requires the special processing (decryption, admin check) to still happen on lws-main (it needs `pss` context), but the final DB write goes async
+
+### Fix 6: Reduce Reader Threads from 4 to 1
+
+**Impact: Resource savings** — 3 fewer threads, 3 fewer SQLite connections
+
+**Changes:**
+- Change default `reader_threads` in `thread_pool_init()` from 4 to 1
+- Or make it configurable via config with default 1
+- The single `db-read` thread handles all REQ and COUNT queries sequentially
+- If future profiling shows the read thread becoming a bottleneck, increase back to 2+
+
+### Fix 7: Move Subscription Logging Off Main Thread
+
+**Impact: Medium** — eliminates per-REQ INSERT, per-CLOSE UPDATE, per-broadcast UPDATE
+
+The subscription lifecycle functions in subscriptions.c do synchronous SQLite writes on lws-main:
+- `db_log_subscription_created()` — INSERT on every REQ
+- `db_log_subscription_closed()` — INSERT + UPDATE on every CLOSE
+- `db_log_subscription_disconnected()` — UPDATE + INSERT on every disconnect
+- `db_update_subscription_events_sent()` — UPDATE on every broadcast match
+
+**Changes:**
+- Submit these as fire-and-forget write jobs to the db-write thread via `thread_pool_submit_write()`
+- Create a new job type `THREAD_POOL_JOB_SUBSCRIPTION_LOG` or simply use a generic callback job
+- The main thread doesn't need to wait for these to complete — they're purely observational logging
+
+### Fix 8: Move Periodic Tasks Off Main Thread
+
+**Impact: Low** — these run every 60s but can still cause latency spikes
+
+- `generate_and_post_status_event()`: Submit as an async job to the event worker
+- `ip_ban_cleanup()`/`ip_ban_log_stats()`/`ip_ban_save()`: These do SQLite reads/writes. Move to a periodic job on the db-write thread
+- Config cache refresh (Fix 1) replaces the old `refresh_hot_config_if_needed()` SQLite queries
+
+### Fix 9: Cache NIP-11 Response
+
+**Impact: Low-Medium** — eliminates 25+ SQLite SELECTs per NIP-11 HTTP request
+
+`generate_relay_info_json()` in nip011.c calls `get_config_value()` 15 times and `get_config_int()`/`get_config_bool()` 10 times. After Fix 1 (global config cache), these become in-memory lookups. But we can go further:
+
+**Changes:**
+- Cache the serialized NIP-11 JSON response string with a TTL (e.g., 60 seconds)
+- On NIP-11 request, return the cached string directly without rebuilding
+- Invalidate on admin config change events
+
+## Implementation Order
+
+| # | Fix | Risk | Complexity |
+|---|-----|------|------------|
+| 1 | Global config cache (replaces all get_config_* SQLite) | Low | Medium |
+| 2 | Move dedup check to event worker | Low | Low |
+| 3 | Async COUNT queries | Low | Medium |
+| 4 | Cache WoT auth rules per-session | Very Low | Low |
+| 5 | Async store for special kinds | Medium | Medium |
+| 6 | Reduce reader threads to 1 | Very Low | Trivial |
+| 7 | Move subscription logging off main thread | Low | Low-Medium |
+| 8 | Move periodic tasks off main thread | Low | Medium |
+| 9 | Cache NIP-11 response | Very Low | Low |
+
+## Expected Impact
+
+After all 9 fixes, `lws-main` should have **zero direct SQLite calls**. Its work becomes:
+- JSON parse incoming messages (~fast)
+- In-memory subscription matching (~fast)
+- In-memory config lookups (~fast, hash map)
+- Message formatting and queuing (~fast)
+- `lws_service()` I/O (~fast)
+- Draining completion queues (~fast)
+
+### Impact by fix
+
+| Fix | SQLite calls eliminated | Frequency |
+|-----|------------------------|-----------|
+| Fix 1: Global config cache | ~50+ `get_config_*` call sites across 8 files | Per-event, per-connection, per-REQ, per-broadcast, per-NIP-11 |
+| Fix 2: Dedup to event worker | 2 `event_id_exists_in_db()` calls | Per-EVENT |
+| Fix 3: Async COUNT | 1 `thread_pool_execute_count_sync()` | Per-COUNT message |
+| Fix 4: WoT cache per-session | 1 `check_database_auth_rules()` | Per-REQ when WoT enabled |
+| Fix 5: Async special-kind store | ~6 `store_event()` calls | Per special-kind EVENT |
+| Fix 6: Reduce readers | N/A (resource savings) | N/A |
+| Fix 7: Async subscription logging | 4 `db_log_*`/`db_update_*` calls | Per-REQ, per-CLOSE, per-broadcast |
+| Fix 8: Async periodic tasks | `generate_stats_json()`, `ip_ban_*` | Every 60s |
+| Fix 9: Cache NIP-11 | 25+ config lookups per request | Per NIP-11 HTTP request |
+
+Estimated main-thread CPU reduction: from **54% to ~5-10%** (mostly WebSocket I/O, subscription matching, and JSON parsing).
+
+## Thread Model After Changes
+
+```
+lws-main — WebSocket I/O, JSON parse, subscription match, message queue
+ NO SQLite. Pure compute + I/O.
+
+db-read — All SELECT queries: REQ results, COUNT results, config refresh,
+ auth rule checks, event dedup checks via completion queue
+
+db-write — All INSERT/UPDATE: event storage, tag inserts, IP ban persistence,
+ status event generation
+
+event-worker — EVENT validation: signature verification, then submits store to
+ db-write via completion queue, results flow back to lws-main
+```
+
+```mermaid
+flowchart LR
+ CLIENT[Nostr Clients] --> LWS[lws-main
WebSocket I/O
JSON parse
Sub matching
NO SQLite]
+
+ LWS -->|EVENT submit| EW[event-worker
Sig verify
Dedup check]
+ EW -->|store job| DW[db-write
INSERT events
INSERT tags
IP ban save]
+ EW -->|completion| LWS
+ DW -->|completion| LWS
+
+ LWS -->|REQ/COUNT submit| DR[db-read
SELECT queries
Config refresh
Auth checks]
+ DR -->|completion| LWS
+
+ LWS -->|OK/EVENT/EOSE| CLIENT
+```
diff --git a/relay.pid b/relay.pid
index fbaa489..f4595fb 100644
--- a/relay.pid
+++ b/relay.pid
@@ -1 +1 @@
-678119
+694269
diff --git a/src/config.c b/src/config.c
index b6ea34a..afc93df 100644
--- a/src/config.c
+++ b/src/config.c
@@ -251,14 +251,21 @@ const char* get_config_value(const char* key) {
if (!key) {
return NULL;
}
- return get_config_value_from_table(key);
+
+ const char* cached = get_config_value_from_table(key);
+ if (!cached) {
+ return NULL;
+ }
+
+ // Public API returns an owned string; callers may free it.
+ return cached;
}
int get_config_int(const char* key, int default_value) {
if (!key) {
return default_value;
}
- const char* value = get_config_value_from_table(key);
+ const char* value = get_config_value(key);
if (!value) {
return default_value;
}
@@ -271,7 +278,7 @@ int get_config_bool(const char* key, int default_value) {
if (!key) {
return default_value;
}
- const char* value = get_config_value_from_table(key);
+ const char* value = get_config_value(key);
if (!value) {
return default_value;
}
@@ -1606,13 +1613,7 @@ int handle_configuration_event(cJSON* event, char* error_message, size_t error_s
// Note: Config table is now created via embedded schema in sql_schema.h
// Get value from config table
-const char* get_config_value_from_table(const char* key) {
- if (!db_is_available() || !key) {
- return NULL;
- }
-
- return db_get_config_value_dup(key);
-}
+const char* get_config_value_from_table(const char* key);
// Set value in config table
int set_config_value_in_table(const char* key, const char* value, const char* data_type,
@@ -1621,7 +1622,12 @@ int set_config_value_in_table(const char* key, const char* value, const char* da
return -1;
}
- return db_set_config_value_full(key, value, data_type, description, category, requires_restart);
+ int rc = db_set_config_value_full(key, value, data_type, description, category, requires_restart);
+ if (rc == 0) {
+ invalidate_config_cache();
+ }
+
+ return rc;
}
// Update config in table (simpler version of set_config_value_in_table)
@@ -1637,7 +1643,12 @@ int update_config_in_table(const char* key, const char* value) {
return -1;
}
- return db_update_config_value_only(key, value);
+ int rc = db_update_config_value_only(key, value);
+ if (rc == 0) {
+ invalidate_config_cache();
+ }
+
+ return rc;
}
// DEPRECATED: This function is no longer used in the unified startup flow.
@@ -4454,6 +4465,108 @@ int populate_all_config_values_atomic(const char* admin_pubkey, const char* rela
// CONFIGURATION CACHE MANAGEMENT
// ================================
+#define CONFIG_CACHE_MAX_ITEMS 256
+
+typedef struct {
+ char key[128];
+ char value[CONFIG_VALUE_MAX_LENGTH + 1];
+ int in_use;
+} config_cache_entry_t;
+
+static config_cache_entry_t g_config_cache[CONFIG_CACHE_MAX_ITEMS];
+static pthread_mutex_t g_config_cache_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static int find_cache_index_by_key(const char* key) {
+ if (!key) {
+ return -1;
+ }
+
+ for (int i = 0; i < CONFIG_CACHE_MAX_ITEMS; i++) {
+ if (g_config_cache[i].in_use && strcmp(g_config_cache[i].key, key) == 0) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static int find_empty_cache_index(void) {
+ for (int i = 0; i < CONFIG_CACHE_MAX_ITEMS; i++) {
+ if (!g_config_cache[i].in_use) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static void clear_config_cache_locked(void) {
+ memset(g_config_cache, 0, sizeof(g_config_cache));
+}
+
+void invalidate_config_cache(void) {
+ pthread_mutex_lock(&g_config_cache_mutex);
+ clear_config_cache_locked();
+ pthread_mutex_unlock(&g_config_cache_mutex);
+}
+
+void force_config_cache_refresh(void) {
+ invalidate_config_cache();
+}
+
+int reload_config_from_table(void) {
+ force_config_cache_refresh();
+ return 0;
+}
+
+const char* get_config_value_from_table(const char* key) {
+ if (!db_is_available() || !key) {
+ return NULL;
+ }
+
+ pthread_mutex_lock(&g_config_cache_mutex);
+
+ int idx = find_cache_index_by_key(key);
+ if (idx >= 0) {
+ const char* result = strdup(g_config_cache[idx].value);
+ pthread_mutex_unlock(&g_config_cache_mutex);
+ return result;
+ }
+
+ pthread_mutex_unlock(&g_config_cache_mutex);
+
+ char* db_value = db_get_config_value_dup(key);
+ if (!db_value) {
+ return NULL;
+ }
+
+ pthread_mutex_lock(&g_config_cache_mutex);
+
+ idx = find_cache_index_by_key(key);
+ if (idx < 0) {
+ idx = find_empty_cache_index();
+ }
+
+ if (idx >= 0) {
+ g_config_cache[idx].in_use = 1;
+ strncpy(g_config_cache[idx].key, key, sizeof(g_config_cache[idx].key) - 1);
+ g_config_cache[idx].key[sizeof(g_config_cache[idx].key) - 1] = '\0';
+ strncpy(g_config_cache[idx].value, db_value, sizeof(g_config_cache[idx].value) - 1);
+ g_config_cache[idx].value[sizeof(g_config_cache[idx].value) - 1] = '\0';
+ }
+
+ pthread_mutex_unlock(&g_config_cache_mutex);
+
+ return db_value;
+}
+
+const char* get_admin_pubkey_cached(void) {
+ return get_config_value_from_table("admin_pubkey");
+}
+
+const char* get_relay_pubkey_cached(void) {
+ return get_config_value_from_table("relay_pubkey");
+}
// ================================
// HYBRID CONFIG ACCESS FUNCTIONS
diff --git a/src/main.c b/src/main.c
index 2391ec8..d255571 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2301,7 +2301,7 @@ int main(int argc, char* argv[]) {
if (thread_pool_enabled) {
thread_pool_config_t tp_cfg;
memset(&tp_cfg, 0, sizeof(tp_cfg));
- tp_cfg.reader_threads = get_config_int("thread_pool_readers", 4);
+ tp_cfg.reader_threads = get_config_int("thread_pool_readers", 1);
tp_cfg.max_queue_depth = get_config_int("thread_pool_max_queue_depth", 4096);
tp_cfg.db_path = g_database_path;
tp_cfg.wake_loop_cb = wake_event_loop_from_thread_pool;
diff --git a/src/main.h b/src/main.h
index cc12a14..af3d1ce 100644
--- a/src/main.h
+++ b/src/main.h
@@ -13,8 +13,8 @@
// Using CRELAY_ prefix to avoid conflicts with nostr_core_lib VERSION macros
#define CRELAY_VERSION_MAJOR 2
#define CRELAY_VERSION_MINOR 1
-#define CRELAY_VERSION_PATCH 4
-#define CRELAY_VERSION "v2.1.4"
+#define CRELAY_VERSION_PATCH 5
+#define CRELAY_VERSION "v2.1.5"
// Relay metadata (authoritative source for NIP-11 information)
#define RELAY_NAME "C-Relay"
diff --git a/src/nip011.c b/src/nip011.c
index 065cc82..ae6ed13 100644
--- a/src/nip011.c
+++ b/src/nip011.c
@@ -23,6 +23,67 @@ int get_config_bool(const char* key, int default_value);
#define HTTP_STATUS_INTERNAL_SERVER_ERROR 500
+#define NIP11_CACHE_TTL_SEC 5
+
+static pthread_mutex_t g_nip11_cache_mutex = PTHREAD_MUTEX_INITIALIZER;
+static char* g_nip11_cached_json = NULL;
+static size_t g_nip11_cached_json_len = 0;
+static time_t g_nip11_cache_expires_at = 0;
+
+cJSON* generate_relay_info_json();
+
+static void invalidate_nip11_cache_locked(void) {
+ if (g_nip11_cached_json) {
+ free(g_nip11_cached_json);
+ g_nip11_cached_json = NULL;
+ }
+ g_nip11_cached_json_len = 0;
+ g_nip11_cache_expires_at = 0;
+}
+
+static char* get_nip11_json_cached_dup(size_t* out_len) {
+ time_t now = time(NULL);
+
+ pthread_mutex_lock(&g_nip11_cache_mutex);
+ if (g_nip11_cached_json && now < g_nip11_cache_expires_at) {
+ char* copy = strdup(g_nip11_cached_json);
+ if (copy && out_len) {
+ *out_len = g_nip11_cached_json_len;
+ }
+ pthread_mutex_unlock(&g_nip11_cache_mutex);
+ return copy;
+ }
+ pthread_mutex_unlock(&g_nip11_cache_mutex);
+
+ cJSON* info_json = generate_relay_info_json();
+ if (!info_json) {
+ return NULL;
+ }
+
+ char* fresh_json = cJSON_Print(info_json);
+ cJSON_Delete(info_json);
+ if (!fresh_json) {
+ return NULL;
+ }
+
+ size_t fresh_len = strlen(fresh_json);
+
+ pthread_mutex_lock(&g_nip11_cache_mutex);
+ invalidate_nip11_cache_locked();
+ g_nip11_cached_json = strdup(fresh_json);
+ if (g_nip11_cached_json) {
+ g_nip11_cached_json_len = fresh_len;
+ g_nip11_cache_expires_at = now + NIP11_CACHE_TTL_SEC;
+ }
+ pthread_mutex_unlock(&g_nip11_cache_mutex);
+
+ if (out_len) {
+ *out_len = fresh_len;
+ }
+ return fresh_json;
+}
+
+
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// NIP-11 RELAY INFORMATION DOCUMENT
@@ -80,8 +141,9 @@ void init_relay_info() {
// Clean up relay information JSON objects
void cleanup_relay_info() {
- // NIP-11 relay information is now generated dynamically from config table
- // No cleanup needed - data is fetched directly from database when requested
+ pthread_mutex_lock(&g_nip11_cache_mutex);
+ invalidate_nip11_cache_locked();
+ pthread_mutex_unlock(&g_nip11_cache_mutex);
}
// Generate NIP-11 compliant JSON document
@@ -348,9 +410,10 @@ int handle_nip11_http_request(struct lws* wsi, const char* accept_header) {
return -1; // Close connection
}
- // Generate relay information JSON
- cJSON* info_json = generate_relay_info_json();
- if (!info_json) {
+ // Generate (or fetch cached) relay information JSON
+ size_t json_len = 0;
+ char* json_string = get_nip11_json_cached_dup(&json_len);
+ if (!json_string) {
DEBUG_ERROR("Failed to generate relay info JSON");
unsigned char buf[LWS_PRE + 256];
unsigned char *p = &buf[LWS_PRE];
@@ -373,34 +436,6 @@ int handle_nip11_http_request(struct lws* wsi, const char* accept_header) {
return -1;
}
- char* json_string = cJSON_Print(info_json);
- cJSON_Delete(info_json);
-
- if (!json_string) {
- DEBUG_ERROR("Failed to serialize relay info JSON");
- unsigned char buf[LWS_PRE + 256];
- unsigned char *p = &buf[LWS_PRE];
- unsigned char *start = p;
- unsigned char *end = &buf[sizeof(buf) - 1];
-
- if (lws_add_http_header_status(wsi, HTTP_STATUS_INTERNAL_SERVER_ERROR, &p, end)) {
- return -1;
- }
- if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE, (unsigned char*)"text/plain", 10, &p, end)) {
- return -1;
- }
- if (lws_add_http_header_content_length(wsi, 0, &p, end)) {
- return -1;
- }
- if (lws_finalize_http_header(wsi, &p, end)) {
- return -1;
- }
- lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS);
- return -1;
- }
-
- size_t json_len = strlen(json_string);
-
// Allocate session data to manage buffer lifetime across callbacks
struct nip11_session_data* session_data = malloc(sizeof(struct nip11_session_data));
if (!session_data) {
diff --git a/src/websockets.c b/src/websockets.c
index 313c5cb..6a0df96 100644
--- a/src/websockets.c
+++ b/src/websockets.c
@@ -330,6 +330,7 @@ typedef struct async_event_completion {
int success;
int should_broadcast;
int run_post_actions;
+ char ok_message[128];
char error_message[512];
struct async_event_completion* next;
} async_event_completion_t;
@@ -346,6 +347,27 @@ static async_event_completion_t* g_async_event_completion_tail = NULL;
static pthread_t g_async_event_worker_thread;
static int g_async_event_worker_running = 0;
+typedef struct count_async_state {
+ char sub_id[SUBSCRIPTION_ID_MAX_LENGTH];
+ struct lws* wsi;
+ struct per_session_data* pss_token;
+ int pending_jobs;
+ int total_count;
+ int had_error;
+ char error_message[256];
+} count_async_state_t;
+
+typedef struct count_async_completion {
+ count_async_state_t* state;
+ thread_pool_status_t status;
+ int count;
+ struct count_async_completion* next;
+} count_async_completion_t;
+
+static pthread_mutex_t g_count_async_completion_mutex = PTHREAD_MUTEX_INITIALIZER;
+static count_async_completion_t* g_count_async_completion_head = NULL;
+static count_async_completion_t* g_count_async_completion_tail = NULL;
+
static void map_validation_error_message(int validation_result, char* out, size_t out_size) {
if (!out || out_size == 0) return;
@@ -506,38 +528,46 @@ static void* async_event_worker_main(void* arg) {
strncpy(completion->event_id, job->event_id, sizeof(completion->event_id) - 1);
completion->event_id[sizeof(completion->event_id) - 1] = '\0';
- int validation_result = nostr_validate_unified_request(completion->event_json, strlen(completion->event_json));
- if (validation_result != NOSTR_SUCCESS) {
- completion->success = 0;
+ if (job->event_id[0] != '\0' && event_id_exists_in_db(job->event_id)) {
+ completion->success = 1;
completion->should_broadcast = 0;
- map_validation_error_message(validation_result, completion->error_message, sizeof(completion->error_message));
+ completion->run_post_actions = 0;
+ snprintf(completion->ok_message, sizeof(completion->ok_message),
+ "duplicate: already have this event");
} else {
- cJSON* event_obj = cJSON_Parse(completion->event_json);
- if (!event_obj || !cJSON_IsObject(event_obj)) {
+ int validation_result = nostr_validate_unified_request(completion->event_json, strlen(completion->event_json));
+ if (validation_result != NOSTR_SUCCESS) {
completion->success = 0;
completion->should_broadcast = 0;
- strncpy(completion->error_message, "error: failed to parse event", sizeof(completion->error_message) - 1);
- completion->error_message[sizeof(completion->error_message) - 1] = '\0';
+ map_validation_error_message(validation_result, completion->error_message, sizeof(completion->error_message));
} else {
- if (job->event_kind >= 20000 && job->event_kind < 30000) {
- completion->success = 1;
- completion->should_broadcast = 1;
- completion->run_post_actions = 0;
+ cJSON* event_obj = cJSON_Parse(completion->event_json);
+ if (!event_obj || !cJSON_IsObject(event_obj)) {
+ completion->success = 0;
+ completion->should_broadcast = 0;
+ strncpy(completion->error_message, "error: failed to parse event", sizeof(completion->error_message) - 1);
+ completion->error_message[sizeof(completion->error_message) - 1] = '\0';
} else {
- int core_rc = store_event_core(event_obj);
- if (core_rc < 0) {
- completion->success = 0;
- completion->should_broadcast = 0;
- completion->run_post_actions = 0;
- strncpy(completion->error_message, "error: failed to store event", sizeof(completion->error_message) - 1);
- completion->error_message[sizeof(completion->error_message) - 1] = '\0';
- } else {
+ if (job->event_kind >= 20000 && job->event_kind < 30000) {
completion->success = 1;
completion->should_broadcast = 1;
- completion->run_post_actions = (core_rc == 0);
+ completion->run_post_actions = 0;
+ } else {
+ int core_rc = store_event_core(event_obj);
+ if (core_rc < 0) {
+ completion->success = 0;
+ completion->should_broadcast = 0;
+ completion->run_post_actions = 0;
+ strncpy(completion->error_message, "error: failed to store event", sizeof(completion->error_message) - 1);
+ completion->error_message[sizeof(completion->error_message) - 1] = '\0';
+ } else {
+ completion->success = 1;
+ completion->should_broadcast = 1;
+ completion->run_post_actions = (core_rc == 0);
+ }
}
+ cJSON_Delete(event_obj);
}
- cJSON_Delete(event_obj);
}
}
@@ -684,7 +714,9 @@ static void process_async_event_completions(void) {
current_pss,
completion->event_id,
completion->success,
- completion->success ? "" : completion->error_message);
+ completion->success
+ ? (completion->ok_message[0] ? completion->ok_message : "")
+ : completion->error_message);
}
free(completion->event_json);
@@ -692,6 +724,195 @@ static void process_async_event_completions(void) {
}
}
+static void free_count_payload_ws(void* payload_void) {
+ thread_pool_count_payload_t* payload = (thread_pool_count_payload_t*)payload_void;
+ if (!payload) return;
+ free(payload->sql);
+ if (payload->bind_params) {
+ for (int i = 0; i < payload->bind_param_count; i++) {
+ free(payload->bind_params[i]);
+ }
+ free(payload->bind_params);
+ }
+ free(payload);
+}
+
+static void count_async_completion_push(count_async_completion_t* completion) {
+ if (!completion) return;
+
+ pthread_mutex_lock(&g_count_async_completion_mutex);
+ completion->next = NULL;
+ if (!g_count_async_completion_tail) {
+ g_count_async_completion_head = completion;
+ g_count_async_completion_tail = completion;
+ } else {
+ g_count_async_completion_tail->next = completion;
+ g_count_async_completion_tail = completion;
+ }
+ pthread_mutex_unlock(&g_count_async_completion_mutex);
+}
+
+static count_async_completion_t* count_async_completion_pop(void) {
+ pthread_mutex_lock(&g_count_async_completion_mutex);
+ count_async_completion_t* completion = g_count_async_completion_head;
+ if (completion) {
+ g_count_async_completion_head = completion->next;
+ if (!g_count_async_completion_head) {
+ g_count_async_completion_tail = NULL;
+ }
+ }
+ pthread_mutex_unlock(&g_count_async_completion_mutex);
+ return completion;
+}
+
+static void count_async_result_cb(const thread_pool_result_t* result, void* user_ctx) {
+ count_async_state_t* state = (count_async_state_t*)user_ctx;
+ if (!result || !state) {
+ if (result && result->result_data) {
+ free(result->result_data);
+ }
+ return;
+ }
+
+ count_async_completion_t* completion = calloc(1, sizeof(*completion));
+ if (!completion) {
+ if (result->result_data) {
+ free(result->result_data);
+ }
+ return;
+ }
+
+ completion->state = state;
+ completion->status = result->status;
+ if (result->status == THREAD_POOL_STATUS_OK && result->result_data) {
+ thread_pool_count_result_t* count_result = (thread_pool_count_result_t*)result->result_data;
+ completion->count = count_result->count;
+ }
+
+ if (result->result_data) {
+ free(result->result_data);
+ }
+
+ count_async_completion_push(completion);
+ if (ws_context) {
+ lws_cancel_service(ws_context);
+ }
+}
+
+static int submit_count_query_async(count_async_state_t* state,
+ const char* sql,
+ const char** bind_params,
+ int bind_param_count) {
+ if (!state || !sql) {
+ return -1;
+ }
+
+ thread_pool_count_payload_t* payload = calloc(1, sizeof(*payload));
+ if (!payload) {
+ return -1;
+ }
+
+ payload->sql = strdup(sql);
+ payload->bind_param_count = bind_param_count;
+ if (!payload->sql) {
+ free_count_payload_ws(payload);
+ return -1;
+ }
+
+ if (bind_param_count > 0) {
+ payload->bind_params = calloc((size_t)bind_param_count, sizeof(char*));
+ if (!payload->bind_params) {
+ free_count_payload_ws(payload);
+ return -1;
+ }
+ for (int i = 0; i < bind_param_count; i++) {
+ const char* value = (bind_params && bind_params[i]) ? bind_params[i] : "";
+ payload->bind_params[i] = strdup(value);
+ if (!payload->bind_params[i]) {
+ free_count_payload_ws(payload);
+ return -1;
+ }
+ }
+ }
+
+ thread_pool_job_t job;
+ memset(&job, 0, sizeof(job));
+ job.type = THREAD_POOL_JOB_COUNT_QUERY;
+ job.payload = payload;
+ job.payload_free = free_count_payload_ws;
+ job.result_cb = count_async_result_cb;
+ job.result_cb_ctx = state;
+
+ thread_pool_status_t submit_rc = thread_pool_submit_read(&job, NULL);
+ if (submit_rc != THREAD_POOL_STATUS_OK) {
+ free_count_payload_ws(payload);
+ return -1;
+ }
+
+ state->pending_jobs++;
+ return 0;
+}
+
+static void send_count_response(struct lws* wsi, struct per_session_data* pss,
+ const char* sub_id, int total_count) {
+ cJSON* count_response = cJSON_CreateArray();
+ if (!count_response) {
+ return;
+ }
+
+ cJSON_AddItemToArray(count_response, cJSON_CreateString("COUNT"));
+ cJSON_AddItemToArray(count_response, cJSON_CreateString(sub_id));
+
+ cJSON* count_obj = cJSON_CreateObject();
+ cJSON_AddNumberToObject(count_obj, "count", total_count);
+ cJSON_AddItemToArray(count_response, count_obj);
+
+ char* count_str = cJSON_Print(count_response);
+ if (count_str) {
+ size_t count_len = strlen(count_str);
+ if (queue_message(wsi, pss, count_str, count_len, LWS_WRITE_TEXT) != 0) {
+ DEBUG_ERROR("Failed to queue COUNT message");
+ }
+ free(count_str);
+ }
+
+ cJSON_Delete(count_response);
+}
+
+static void process_count_async_completions(void) {
+ count_async_completion_t* completion = NULL;
+ while ((completion = count_async_completion_pop()) != NULL) {
+ count_async_state_t* state = completion->state;
+ if (state) {
+ if (completion->status == THREAD_POOL_STATUS_OK) {
+ state->total_count += completion->count;
+ } else {
+ state->had_error = 1;
+ if (state->error_message[0] == '\0') {
+ strncpy(state->error_message, "error: failed to execute count query", sizeof(state->error_message) - 1);
+ state->error_message[sizeof(state->error_message) - 1] = '\0';
+ }
+ }
+
+ state->pending_jobs--;
+ if (state->pending_jobs <= 0) {
+ struct per_session_data* current_pss = (struct per_session_data*)lws_wsi_user(state->wsi);
+ int target_alive = (current_pss && current_pss == state->pss_token);
+ if (target_alive) {
+ if (state->had_error) {
+ send_notice_message(state->wsi, current_pss, state->error_message[0] ? state->error_message : "error: count query failed");
+ } else {
+ send_count_response(state->wsi, current_pss, state->sub_id, state->total_count);
+ }
+ }
+ free(state);
+ }
+ }
+
+ free(completion);
+ }
+}
+
// Message queue functions for proper libwebsockets pattern
/**
@@ -1315,27 +1536,6 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso
return 0;
}
- // Early duplicate check: skip expensive crypto for events already in DB.
- // The event id is a 64-char hex string — look it up via primary key index (~10μs).
- // This must happen AFTER we have the id string but BEFORE signature verification.
- cJSON* id_obj_dup = cJSON_GetObjectItemCaseSensitive(event, "id");
- if (id_obj_dup && cJSON_IsString(id_obj_dup)) {
- const char* event_id_str = cJSON_GetStringValue(id_obj_dup);
- if (event_id_str && event_id_exists_in_db(event_id_str)) {
- // Already have this event — send OK true and skip crypto
- DEBUG_TRACE("Duplicate event %s — skipping signature verification", event_id_str);
- char ok_msg[128];
- snprintf(ok_msg, sizeof(ok_msg),
- "[\"OK\",\"%s\",true,\"duplicate: already have this event\"]",
- event_id_str);
- size_t ok_len = strlen(ok_msg);
- queue_message(wsi, pss, ok_msg, ok_len, LWS_WRITE_TEXT);
- free(event_json_str);
- cJSON_Delete(json);
- return 0;
- }
- }
-
// Try async EVENT offload first (Phase 1).
int async_submit_rc = try_submit_async_event(event, event_json_str, wsi, pss);
if (async_submit_rc == 0) {
@@ -1888,10 +2088,15 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso
return 0;
}
- handle_count_message(subscription_id, filters, wsi, pss);
+ int count_result = handle_count_message(subscription_id, filters, wsi, pss);
// Clean up the filters array we created
cJSON_Delete(filters);
+
+ if (count_result == HANDLE_REQ_ASYNC_PENDING) {
+ cJSON_Delete(json);
+ return 0;
+ }
}
} else if (strcmp(msg_type, "CLOSE") == 0) {
// Handle CLOSE message
@@ -2127,25 +2332,6 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso
return 0;
}
- // Early duplicate check: skip expensive crypto for events already in DB.
- cJSON* id_obj_dup2 = cJSON_GetObjectItemCaseSensitive(event, "id");
- if (id_obj_dup2 && cJSON_IsString(id_obj_dup2)) {
- const char* event_id_str2 = cJSON_GetStringValue(id_obj_dup2);
- if (event_id_str2 && event_id_exists_in_db(event_id_str2)) {
- DEBUG_TRACE("Duplicate event %s — skipping signature verification", event_id_str2);
- char ok_msg2[128];
- snprintf(ok_msg2, sizeof(ok_msg2),
- "[\"OK\",\"%s\",true,\"duplicate: already have this event\"]",
- event_id_str2);
- size_t ok_len2 = strlen(ok_msg2);
- queue_message(wsi, pss, ok_msg2, ok_len2, LWS_WRITE_TEXT);
- free(event_json_str);
- cJSON_Delete(json);
- free(message);
- return 0;
- }
- }
-
// Try async EVENT offload first (Phase 1).
int async_submit_rc = try_submit_async_event(event, event_json_str, wsi, pss);
if (async_submit_rc == 0) {
@@ -2683,10 +2869,16 @@ static int nostr_relay_callback(struct lws *wsi, enum lws_callback_reasons reaso
return 0;
}
- handle_count_message(subscription_id, filters, wsi, pss);
+ int count_result = handle_count_message(subscription_id, filters, wsi, pss);
// Clean up the filters array we created
cJSON_Delete(filters);
+
+ if (count_result == HANDLE_REQ_ASYNC_PENDING) {
+ cJSON_Delete(json);
+ free(message);
+ return 0;
+ }
}
} else if (strcmp(msg_type, "CLOSE") == 0) {
// Handle CLOSE message
@@ -3201,6 +3393,9 @@ int start_websocket_relay(int port_override, int strict_port) {
// Drain completed async EVENT jobs and emit OK/broadcast on service thread.
process_async_event_completions();
+ // Drain completed async COUNT jobs and emit COUNT/NOTICE on service thread.
+ process_count_async_completions();
+
// Check if it's time to post status update
time_t current_time = time(NULL);
int status_post_hours = hot_cfg_kind_1_status_posts_hours();
@@ -3433,7 +3628,16 @@ int handle_count_message(const char* sub_id, cJSON* filters, struct lws *wsi, st
int bind_param_count = 0;
int bind_param_capacity = 0;
- int total_count = 0;
+ count_async_state_t* async_state = calloc(1, sizeof(*async_state));
+ if (!async_state) {
+ DEBUG_ERROR("Failed to allocate COUNT async state");
+ return 0;
+ }
+
+ strncpy(async_state->sub_id, sub_id ? sub_id : "", sizeof(async_state->sub_id) - 1);
+ async_state->sub_id[sizeof(async_state->sub_id) - 1] = '\0';
+ async_state->wsi = wsi;
+ async_state->pss_token = pss;
// Process each filter in the array
for (int i = 0; i < cJSON_GetArraySize(filters); i++) {
@@ -3678,68 +3882,34 @@ int handle_count_message(const char* sub_id, cJSON* filters, struct lws *wsi, st
remaining = sizeof(sql) - strlen(sql);
}
- // Execute count query
-
- // Start query timing
- struct timespec query_start, query_end;
- clock_gettime(CLOCK_MONOTONIC, &query_start);
-
- // Execute count query via thread pool helper
- int filter_count = 0;
- if (thread_pool_execute_count_sync(sql, (const char**)bind_params, bind_param_count, &filter_count) != 0) {
- DEBUG_ERROR("Failed to execute COUNT query via db_ops/thread_pool");
- continue;
+ // Submit COUNT query asynchronously to DB reader pool.
+ if (submit_count_query_async(async_state, sql, (const char**)bind_params, bind_param_count) != 0) {
+ DEBUG_ERROR("Failed to submit COUNT query async");
+ strncpy(async_state->error_message, "error: failed to submit count query", sizeof(async_state->error_message) - 1);
+ async_state->error_message[sizeof(async_state->error_message) - 1] = '\0';
+ async_state->had_error = 1;
+ break;
}
-
- // Stop query timing and log
- clock_gettime(CLOCK_MONOTONIC, &query_end);
- long elapsed_us = (query_end.tv_sec - query_start.tv_sec) * 1000000L +
- (query_end.tv_nsec - query_start.tv_nsec) / 1000L;
-
- log_query_execution("COUNT", sub_id, pss ? pss->client_ip : NULL,
- sql, elapsed_us, 1); // COUNT always returns 1 row
-
- total_count += filter_count;
}
- // Total count calculated
-
- // Send COUNT response - NIP-45 format: ["COUNT", , {"count": }]
- cJSON* count_response = cJSON_CreateArray();
- cJSON_AddItemToArray(count_response, cJSON_CreateString("COUNT"));
- cJSON_AddItemToArray(count_response, cJSON_CreateString(sub_id));
-
- // Create count object as per NIP-45 specification
- cJSON* count_obj = cJSON_CreateObject();
- cJSON_AddNumberToObject(count_obj, "count", total_count);
- cJSON_AddItemToArray(count_response, count_obj);
-
- char *count_str = cJSON_Print(count_response);
- if (count_str) {
- size_t count_len = strlen(count_str);
-
- // DEBUG: Log WebSocket frame details before sending
- DEBUG_TRACE("WS_FRAME_SEND: type=COUNT len=%zu data=%.100s%s",
- count_len,
- count_str,
- count_len > 100 ? "..." : "");
-
- // Queue message for proper libwebsockets pattern
- if (queue_message(wsi, pss, count_str, count_len, LWS_WRITE_TEXT) != 0) {
- DEBUG_ERROR("Failed to queue COUNT message");
- }
-
- free(count_str);
- }
- cJSON_Delete(count_response);
-
- // Cleanup bind params
+ // Cleanup bind params from the final filter iteration.
for (int i = 0; i < bind_param_count; i++) {
free(bind_params[i]);
}
free(bind_params);
- return total_count;
+ if (async_state->pending_jobs <= 0) {
+ if (async_state->had_error) {
+ send_notice_message(wsi, pss,
+ async_state->error_message[0] ? async_state->error_message : "error: count query failed");
+ } else {
+ send_count_response(wsi, pss, sub_id, 0);
+ }
+ free(async_state);
+ return 0;
+ }
+
+ return HANDLE_REQ_ASYNC_PENDING;
}
diff --git a/thread_profile_runs/20260401_193216/perf.data b/thread_profile_runs/20260401_193216/perf.data
new file mode 100644
index 0000000..cae4108
Binary files /dev/null and b/thread_profile_runs/20260401_193216/perf.data differ
diff --git a/thread_profile_runs/20260401_193216/perf_report.txt b/thread_profile_runs/20260401_193216/perf_report.txt
new file mode 100644
index 0000000..87d231d
--- /dev/null
+++ b/thread_profile_runs/20260401_193216/perf_report.txt
@@ -0,0 +1,1956 @@
+# To display the perf.data header info, please use --header/--header-only options.
+#
+#
+# Total Lost Samples: 0
+#
+# Samples: 662K of event 'task-clock:ppp'
+# Event count (approx.): 165543000000
+#
+# Overhead Samples Command Symbol IPC [IPC Coverage]
+# ........ ............ ............ .............................................. ....................
+#
+ 13.06% 86501 lws-main [.] sqlite3BtreeTableMoveto - -
+ |
+ ---sqlite3BtreeTableMoveto
+ |
+ |--5.83%--0xfdd00007f040000
+ |
+ --5.53%--0xfdd00007f000001
+
+ 9.25% 61241 lws-main [.] sqlite3VdbeExec - -
+ |
+ ---sqlite3VdbeExec
+ |
+ --4.34%--0
+
+ 8.60% 56963 lws-main [.] pcache1Fetch - -
+ |
+ ---pcache1Fetch
+
+ 8.16% 54053 lws-main [k] rep_movs_alternative - -
+ |
+ ---rep_movs_alternative
+ |
+ --8.16%--copy_page_to_iter
+ filemap_read
+ generic_file_read_iter
+ ext4_file_read_iter
+ vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 7.11% 47112 lws-main [.] sqlite3GetVarint - -
+ |
+ ---sqlite3GetVarint
+ |
+ |--5.42%--0xfdd00007f040000
+ |
+ --1.37%--0xfdd00007f000001
+
+ 5.54% 36679 lws-main [.] memcpy - -
+ |
+ ---memcpy
+
+ 4.84% 32042 lws-main [.] sccp - -
+ |
+ ---sccp
+
+ 4.48% 29695 lws-main [k] do_syscall_64 - -
+ |
+ ---do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ |
+ --4.48%--sccp
+
+ 3.85% 25512 lws-main [.] pcache1FetchStage2 - -
+ |
+ ---pcache1FetchStage2
+
+ 2.61% 17299 lws-main [k] filemap_get_read_batch - -
+ |
+ ---filemap_get_read_batch
+ |
+ --2.60%--filemap_get_pages
+ filemap_read
+ generic_file_read_iter
+ ext4_file_read_iter
+ vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 2.18% 14446 lws-main [.] pcache1Unpin - -
+ |
+ ---pcache1Unpin
+
+ 2.06% 13657 lws-main [.] getCellInfo - -
+ |
+ ---getCellInfo
+ |
+ |--1.05%--0x7983c9b3d5b8
+ |
+ --0.76%--0
+
+ 1.96% 12992 lws-main [k] __fdget - -
+ |
+ ---__fdget
+ |
+ --1.94%--__x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 1.48% 9824 lws-main [.] pread - -
+ |
+ ---pread
+
+ 1.37% 9054 lws-main [.] getAndInitPage - -
+ |
+ ---getAndInitPage
+ |
+ --0.95%--0x7983c9b3d848
+ 0xa02000100010500
+ 0x200
+
+ 1.34% 8848 lws-main [.] sqlite3VdbeIdxRowid - -
+ |
+ ---sqlite3VdbeIdxRowid
+
+ 1.32% 8740 lws-main [.] sqlite3BtreeNext.isra.0 - -
+ |
+ ---sqlite3BtreeNext.isra.0
+ |
+ --1.18%--0
+
+ 1.24% 8211 lws-main [.] btreeParseCellPtr - -
+ |
+ ---btreeParseCellPtr
+ |
+ --0.93%--0
+
+ 1.03% 6801 lws-main [.] getPageNormal - -
+ |
+ ---getPageNormal
+
+ 0.99% 6582 lws-main [.] sqlite3PcacheRelease - -
+ |
+ ---sqlite3PcacheRelease
+
+ 0.93% 6189 lws-main [.] moveToChild - -
+ |
+ ---moveToChild
+ |
+ --0.75%--0xfdd00007f040000
+
+ 0.91% 6021 lws-main [.] memcmp - -
+ |
+ ---memcmp
+
+ 0.90% 5942 lws-main [.] sqlite3VdbeRecordCompareWithSkip - -
+ |
+ ---sqlite3VdbeRecordCompareWithSkip
+
+ 0.89% 5871 lws-main [.] readDbPage - -
+ |
+ ---readDbPage
+ |
+ --0.87%--0xa02000100010500
+ 0x200
+
+ 0.83% 5511 lws-main [.] getPageMMap - -
+ |
+ ---getPageMMap
+
+ 0.82% 5460 lws-main [.] sqlite3VdbeSerialGet - -
+ |
+ ---sqlite3VdbeSerialGet
+
+ 0.82% 5451 lws-main [k] xas_load - -
+ |
+ ---xas_load
+ |
+ --0.81%--filemap_get_read_batch
+ filemap_get_pages
+ filemap_read
+ generic_file_read_iter
+ ext4_file_read_iter
+ vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 0.82% 5432 lws-main [.] moveToRoot - -
+ |
+ ---moveToRoot
+
+ 0.79% 5230 lws-main [k] filemap_read - -
+ |
+ ---filemap_read
+ |
+ --0.78%--generic_file_read_iter
+ ext4_file_read_iter
+ vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 0.74% 4869 lws-main [.] btreeParseCellPtrIndex - -
+ |
+ ---btreeParseCellPtrIndex
+ |
+ --0.73%--0x7983c9b3d5b8
+
+ 0.58% 3857 lws-main [.] sqlite3VdbeFinishMoveto - -
+ |
+ ---sqlite3VdbeFinishMoveto
+ 0
+
+ 0.53% 3529 lws-main [k] rw_verify_area - -
+ |
+ ---rw_verify_area
+ |
+ --0.52%--vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 0.52% 3445 lws-main [k] aa_file_perm - -
+ |
+ ---aa_file_perm
+ |
+ --0.51%--apparmor_file_permission
+ security_file_permission
+ rw_verify_area
+ |
+ --0.51%--vfs_read
+ __x64_sys_pread64
+ x64_sys_call
+ do_syscall_64
+ entry_SYSCALL_64_after_hwframe
+ sccp
+
+ 0.51% 3397 lws-main [.] vdbeCompareMemString - -
+ |
+ ---vdbeCompareMemString
+
+ 0.49% 3274 lws-main [.] decodeFlags - -
+ 0.46% 3067 lws-main [k] xas_descend - -
+ 0.43% 2841 lws-main [.] sqlite3MemCompare - -
+ 0.42% 2810 lws-main [.] unixRead - -
+ 0.42% 2770 lws-main [k] __fsnotify_parent - -
+ 0.37% 2478 lws-main [.] sqlite3PagerUnrefNotNull - -
+ 0.35% 2302 lws-main [.] walFindFrame.constprop.0 - -
+ 0.28% 1847 lws-main [k] xas_start - -
+ 0.25% 1658 lws-main [.] btreeInitPage - -
+ 0.25% 1637 lws-main [.] binCollFunc - -
+ 0.22% 1461 lws-main [k] vfs_read - -
+ 0.12% 825 lws-main [k] fput - -
+ 0.11% 736 lws-main [.] pcacheFetchFinishWithInit - -
+ 0.09% 624 lws-main [.] btreeNext.constprop.0 - -
+ 0.09% 607 lws-main [.] walHashGet - -
+ 0.08% 548 lws-main [k] apparmor_file_permission - -
+ 0.08% 509 lws-main [.] moveToLeftmost - -
+ 0.07% 475 lws-main [k] atime_needs_update - -
+ 0.06% 430 lws-main [k] filemap_get_pages - -
+ 0.06% 408 lws-main [k] do_user_addr_fault - -
+ 0.06% 399 lws-main [.] __libc_malloc_impl - -
+ 0.06% 381 lws-main [k] _copy_to_iter - -
+ 0.06% 371 lws-main [k] copy_page_to_iter - -
+ 0.05% 350 lws-main [k] ext4_file_read_iter - -
+ 0.05% 342 lws-main [k] __x64_sys_pread64 - -
+ 0.05% 323 lws-main [k] _raw_spin_unlock_irqrestore - -
+ 0.05% 310 lws-main [k] __xas_next - -
+ 0.04% 293 lws-main [k] __rcu_read_lock - -
+ 0.04% 292 lws-main [k] current_time - -
+ 0.04% 273 lws-main [k] __rcu_read_unlock - -
+ 0.04% 259 lws-main [k] clear_page_orig - -
+ 0.04% 251 lws-main [k] generic_file_read_iter - -
+ 0.03% 231 lws-main [k] ktime_get_coarse_real_ts64 - -
+ 0.03% 216 lws-main [k] security_file_permission - -
+ 0.03% 215 lws-main [k] folio_mark_accessed - -
+ 0.03% 208 lws-main [k] handle_softirqs - -
+ 0.03% 207 lws-main [k] __x86_indirect_thunk_rax - -
+ 0.03% 179 lws-main [k] touch_atime - -
+ 0.03% 177 lws-main [k] syscall_exit_to_user_mode_prepare - -
+ 0.03% 173 lws-main [k] x64_sys_call - -
+ 0.02% 152 lws-main [.] print_string_ptr - -
+ 0.02% 148 lws-main [.] __libc_free - -
+ 0.02% 148 lws-main [.] sha256_transform - -
+ 0.02% 139 lws-main [.] btreeParseCellAdjustSizeForOverflow.isra.0 - -
+ 0.02% 133 lws-main [k] __cond_resched - -
+ 0.02% 108 db-read-2 [.] sccp - -
+ 0.02% 102 db-read-2 [k] rep_movs_alternative - -
+ 0.01% 98 db-read-1 [k] rep_movs_alternative - -
+ 0.01% 91 db-read-4 [k] rep_movs_alternative - -
+ 0.01% 89 lws-main [.] remove_subscription_from_kind_index.part.0 - -
+ 0.01% 87 lws-main [.] alloc_slot - -
+ 0.01% 83 lws-main [.] __syscall_ret - -
+ 0.01% 83 lws-main [k] make_vfsgid - -
+ 0.01% 81 lws-main [k] iowrite16 - -
+ 0.01% 75 db-read-2 [.] sqlite3VdbeExec - -
+ 0.01% 71 db-read-1 [k] do_syscall_64 - -
+ 0.01% 71 db-read-3 [k] rep_movs_alternative - -
+ 0.01% 66 lws-main [k] make_vfsuid - -
+ 0.01% 64 lws-main [k] sock_poll - -
+ 0.01% 61 lws-main [.] __pthread_mutex_unlock - -
+ 0.01% 60 db-read-1 [.] sqlite3VdbeExec - -
+ 0.01% 59 db-read-2 [k] do_syscall_64 - -
+ 0.01% 59 lws-main [.] strlen - -
+ 0.01% 56 lws-main [.] lengthFunc - -
+ 0.01% 55 db-read-4 [k] do_syscall_64 - -
+ 0.01% 54 db-read-3 [.] sccp - -
+ 0.01% 52 lws-main [.] get_meta - -
+ 0.01% 51 db-read-1 [.] sccp - -
+ 0.01% 50 lws-main [.] __syscall_cp - -
+ 0.01% 49 db-read-4 [.] sccp - -
+ 0.01% 49 db-read-4 [.] sqlite3VdbeExec - -
+ 0.01% 48 lws-main [k] mas_walk - -
+ 0.01% 48 lws-main [k] mem_cgroup_commit_charge - -
+ 0.01% 47 db-read-3 [.] sqlite3VdbeExec - -
+ 0.01% 44 lws-main [k] flush_tlb_mm_range - -
+ 0.01% 44 lws-main [k] syscall_exit_to_user_mode - -
+ 0.01% 44 lws-main [k] zap_pte_range - -
+ 0.01% 43 db-read-2 [.] sqlite3BtreeTableMoveto - -
+ 0.01% 43 lws-main [k] finish_task_switch.isra.0 - -
+ 0.01% 42 lws-main [k] __lruvec_stat_mod_folio - -
+ 0.01% 42 lws-main [.] sqlite3MemSize - -
+ 0.01% 41 db-read-3 [k] do_syscall_64 - -
+ 0.01% 41 lws-main [k] smp_call_function_many_cond - -
+ 0.01% 40 db-read-2 [k] filemap_get_read_batch - -
+ 0.01% 40 db-read-4 [k] filemap_get_read_batch - -
+ 0.01% 38 lws-main [.] decfloat - -
+ 0.01% 37 lws-main [.] __lock - -
+ 0.01% 37 lws-main [k] _raw_spin_unlock_irq - -
+ 0.01% 37 lws-main [.] printf_core - -
+ 0.01% 36 lws-main [.] __unlock - -
+ 0.01% 34 db-read-2 [k] __fdget - -
+ 0.01% 34 db-read-2 [.] pcache1Fetch - -
+ 0.01% 34 db-read-3 [k] _raw_spin_unlock_irqrestore - -
+ 0.01% 34 lws-main [k] __next_zones_zonelist - -
+ 0.01% 34 lws-main [k] blk_cgroup_congested - -
+ 0.01% 34 lws-main [k] get_mem_cgroup_from_mm - -
+ 0.00% 32 db-read-1 [k] filemap_get_read_batch - -
+ 0.00% 31 db-read-2 [k] do_user_addr_fault - -
+ 0.00% 31 lws-main [k] __rmqueue_pcplist - -
+ 0.00% 30 db-read-4 [k] _raw_spin_unlock_irqrestore - -
+ 0.00% 30 db-read-4 [k] finish_task_switch.isra.0 - -
+ 0.00% 30 lws-main [k] __raw_callee_save___pv_queued_spin_unlock - -
+ 0.00% 29 db-read-1 [k] __fdget - -
+ 0.00% 29 db-read-2 [k] xas_load - -
+ 0.00% 28 db-read-2 [k] _raw_spin_unlock_irqrestore - -
+ 0.00% 28 db-read-3 [.] __libc_malloc_impl - -
+ 0.00% 28 lws-main [.] __pthread_mutex_lock - -
+ 0.00% 28 lws-main [k] lock_vma_under_rcu - -
+ 0.00% 27 db-read-1 [.] __libc_malloc_impl - -
+ 0.00% 27 db-read-1 [.] pcache1FetchStage2 - -
+ 0.00% 27 lws-main [k] __alloc_pages - -
+ 0.00% 27 lws-main [.] strcmp - -
+ 0.00% 26 db-read-1 [k] do_user_addr_fault - -
+ 0.00% 26 db-read-1 [.] sqlite3BtreeTableMoveto - -
+ 0.00% 25 db-read-1 [.] pcache1Fetch - -
+ 0.00% 25 db-read-2 [.] __pthread_mutex_unlock - -
+ 0.00% 25 db-read-3 [k] filemap_get_read_batch - -
+ 0.00% 25 lws-main [k] nft_do_chain - -
+ 0.00% 25 lws-main [.] pcache1Alloc - -
+ 0.00% 24 db-read-4 [.] sqlite3BtreeTableMoveto - -
+ 0.00% 24 lws-main [k] down_read_trylock - -
+ 0.00% 24 lws-main [.] pcache1TruncateUnsafe - -
+ 0.00% 23 db-read-2 [.] memcpy - -
+ 0.00% 22 db-read-1 [.] __pthread_mutex_unlock - -
+ 0.00% 22 db-read-1 [k] _raw_spin_unlock_irqrestore - -
+ 0.00% 22 db-read-2 [.] sqlite3GetVarint - -
+ 0.00% 22 db-read-3 [.] __pthread_mutex_unlock - -
+ 0.00% 22 db-read-3 [k] xas_load - -
+ 0.00% 21 db-read-2 [.] __libc_malloc_impl - -
+ 0.00% 21 db-read-2 [k] finish_task_switch.isra.0 - -
+ 0.00% 21 db-read-3 [k] finish_task_switch.isra.0 - -
+ 0.00% 21 lws-main [.] countStep - -
+ 0.00% 20 db-read-1 [k] xas_load - -
+ 0.00% 20 db-read-3 [k] do_user_addr_fault - -
+ 0.00% 20 db-read-3 [.] sqlite3BtreeTableMoveto - -
+ 0.00% 20 lws-main [.] fcntl - -
+ 0.00% 20 lws-main [k] kmem_cache_free - -
+ 0.00% 20 lws-main [k] next_uptodate_folio - -
+ 0.00% 20 lws-main [.] print_value - -
+ 0.00% 20 lws-main [.] sqlite3DbMallocRawNN - -
+ 0.00% 19 db-read-1 [.] memcpy - -
+ 0.00% 19 db-read-2 [.] pread - -
+ 0.00% 19 db-read-3 [k] __fdget - -
+ 0.00% 19 db-read-4 [k] __fdget - -
+ 0.00% 19 db-read-4 [.] __libc_malloc_impl - -
+ 0.00% 19 db-read-4 [.] pcache1FetchStage2 - -
+ 0.00% 19 lws-main [.] yy_reduce.isra.0 - -
+ 0.00% 18 db-read-1 [k] xas_descend - -
+ 0.00% 18 db-read-2 [k] clear_page_orig - -
+ 0.00% 18 db-read-4 [.] pcache1Fetch - -
+ 0.00% 18 db-read-4 [.] pread - -
+ 0.00% 18 lws-main [k] __mod_memcg_lruvec_state - -
+ 0.00% 18 lws-main [.] __munmap - -
+ 0.00% 18 lws-main [k] kmem_cache_alloc - -
+ 0.00% 18 lws-main [k] percpu_counter_add_batch - -
+ 0.00% 17 db-read-1 [k] finish_task_switch.isra.0 - -
+ 0.00% 17 db-read-2 [.] getCellInfo - -
+ 0.00% 17 db-read-3 [.] pcache1Fetch - -
+ 0.00% 17 lws-main [k] __handle_mm_fault - -
+ 0.00% 17 lws-main [k] __pte_offset_map - -
+ 0.00% 16 db-read-1 [.] sqlite3GetVarint - -
+ 0.00% 16 db-read-3 [.] memcpy - -
+ 0.00% 16 db-read-4 [.] sqlite3GetVarint - -
+ 0.00% 15 db-read-4 [.] __pthread_mutex_timedlock - -
+ 0.00% 15 lws-main [.] sqlite3VdbeMemFinalize - -
+ 0.00% 14 db-read-1 [k] clear_page_orig - -
+ 0.00% 14 db-read-2 [.] pcache1FetchStage2 - -
+ 0.00% 14 db-read-2 [.] sqlite3VdbeRecordCompareWithSkip - -
+ 0.00% 14 db-read-3 [.] pcache1FetchStage2 - -
+ 0.00% 14 db-read-4 [.] __pthread_mutex_unlock - -
+ 0.00% 14 db-read-4 [k] clear_page_orig - -
+ 0.00% 14 lws-main [k] count_memcg_events.constprop.0 - -
+ 0.00% 14 lws-main [.] parse_value - -
+ 0.00% 14 lws-main [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 14 lws-main [.] vfprintf - -
+ 0.00% 14 lws-main [.] walChecksumBytes - -
+ 0.00% 13 db-read-3 [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 13 db-read-3 [.] walFindFrame.constprop.0 - -
+ 0.00% 13 db-read-4 [k] filemap_read - -
+ 0.00% 13 db-read-4 [.] memcpy - -
+ 0.00% 13 db-read-4 [.] walFindFrame.constprop.0 - -
+ 0.00% 13 db-read-4 [k] xas_descend - -
+ 0.00% 13 lws-main [k] __memcg_slab_free_hook - -
+ 0.00% 13 lws-main [k] _raw_spin_lock - -
+ 0.00% 13 lws-main [k] mod_memcg_state - -
+ 0.00% 13 lws-main [.] sqlite3VdbeMemShallowCopy - -
+ 0.00% 13 lws-main [.] sqlite3WhereBegin - -
+ 0.00% 13 lws-main [k] tcp_poll - -
+ 0.00% 12 db-read-1 [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 12 db-read-1 [.] walFindFrame.constprop.0 - -
+ 0.00% 12 db-read-2 [.] __pthread_mutex_timedlock - -
+ 0.00% 12 db-read-2 [.] btreeParseCellPtr - -
+ 0.00% 12 db-read-2 [.] readDbPage - -
+ 0.00% 12 db-read-2 [k] rw_verify_area - -
+ 0.00% 12 db-read-4 [k] xas_load - -
+ 0.00% 12 lws-main [k] __mod_node_page_state - -
+ 0.00% 12 lws-main [k] get_vma_policy - -
+ 0.00% 12 lws-main [k] handle_pte_fault - -
+ 0.00% 12 lws-main [k] irqentry_exit_to_user_mode - -
+ 0.00% 11 db-read-1 [.] decodeFlags - -
+ 0.00% 11 db-read-2 [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 11 db-read-3 [.] __libc_free - -
+ 0.00% 11 db-read-3 [.] __pthread_mutex_timedlock - -
+ 0.00% 11 db-read-3 [k] clear_page_orig - -
+ 0.00% 11 db-read-3 [.] pread - -
+ 0.00% 11 db-read-3 [k] xas_descend - -
+ 0.00% 11 lws-main [k] __nf_conntrack_find_get - -
+ 0.00% 11 lws-main [k] alloc_anon_folio - -
+ 0.00% 11 lws-main [k] do_anonymous_page - -
+ 0.00% 11 lws-main [k] folio_remove_rmap_ptes - -
+ 0.00% 11 lws-main [k] get_page_from_freelist - -
+ 0.00% 11 lws-main [k] update_blocked_averages - -
+ 0.00% 11 lws-main [.] vsnprintf - -
+ 0.00% 10 db-read-1 [.] pread - -
+ 0.00% 10 db-read-4 [.] __libc_free - -
+ 0.00% 10 lws-main [k] __anon_vma_interval_tree_remove - -
+ 0.00% 10 lws-main [.] fmt_fp - -
+ 0.00% 10 lws-main [k] folio_add_lru - -
+ 0.00% 10 lws-main [.] parse_string - -
+ 0.00% 10 lws-main [.] sqlite3GetVarint32 - -
+ 0.00% 10 lws-main [k] tcp_in_window - -
+ 0.00% 10 lws-main [k] virtqueue_get_buf_ctx_split - -
+ 0.00% 9 db-read-1 [.] __libc_free - -
+ 0.00% 9 db-read-1 [k] aa_file_perm - -
+ 0.00% 9 db-read-1 [k] handle_softirqs - -
+ 0.00% 9 db-read-1 [k] rw_verify_area - -
+ 0.00% 9 db-read-2 [.] memcmp - -
+ 0.00% 9 db-read-2 [k] smp_call_function_many_cond - -
+ 0.00% 9 db-read-3 [k] blk_cgroup_congested - -
+ 0.00% 9 db-read-3 [.] pcache1Unpin - -
+ 0.00% 9 db-read-3 [.] readDbPage - -
+ 0.00% 9 db-read-3 [.] sqlite3GetVarint - -
+ 0.00% 9 db-read-3 [.] sqlite3VdbeRecordCompareWithSkip - -
+ 0.00% 9 db-read-4 [.] getCellInfo - -
+ 0.00% 9 lws-main [k] ___slab_alloc - -
+ 0.00% 9 lws-main [k] anon_vma_interval_tree_insert - -
+ 0.00% 9 lws-main [.] default_malloc - -
+ 0.00% 9 lws-main [.] ensure - -
+ 0.00% 9 lws-main [k] nf_conntrack_tcp_packet - -
+ 0.00% 9 lws-main [k] nf_hook_slow - -
+ 0.00% 9 lws-main [k] pvclock_clocksource_read_nowd - -
+ 0.00% 9 lws-main [.] resolveExprStep - -
+ 0.00% 9 lws-main [.] secp256k1_ecmult_gen - -
+ 0.00% 9 lws-main [.] sqlite3Malloc - -
+ 0.00% 9 lws-main [.] sqlite3VdbeMemGrow - -
+ 0.00% 9 lws-main [k] try_charge_memcg - -
+ 0.00% 8 db-read-1 [.] getAndInitPage - -
+ 0.00% 8 db-read-1 [.] readDbPage - -
+ 0.00% 8 db-read-2 [.] btreeInitPage - -
+ 0.00% 8 db-read-2 [k] filemap_read - -
+ 0.00% 8 db-read-2 [.] getAndInitPage - -
+ 0.00% 8 db-read-2 [.] getPageNormal - -
+ 0.00% 8 db-read-2 [.] pcache1Unpin - -
+ 0.00% 8 db-read-4 [k] aa_file_perm - -
+ 0.00% 8 db-read-4 [k] do_user_addr_fault - -
+ 0.00% 8 db-read-4 [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 8 db-read-4 [.] sqlite3VdbeRecordCompareWithSkip - -
+ 0.00% 8 lws-main [.] __pthread_mutex_timedlock - -
+ 0.00% 8 lws-main [.] __pthread_mutex_trylock_owner - -
+ 0.00% 8 lws-main [k] fib_table_lookup - -
+ 0.00% 8 lws-main [k] filemap_get_entry - -
+ 0.00% 8 lws-main [k] folio_add_new_anon_rmap - -
+ 0.00% 8 lws-main [k] get_pfnblock_flags_mask - -
+ 0.00% 8 lws-main [k] ip_protocol_deliver_rcu - -
+ 0.00% 8 lws-main [k] ipv4_conntrack_defrag - -
+ 0.00% 8 lws-main [k] net_rx_action - -
+ 0.00% 8 lws-main [k] nft_do_chain_ipv4 - -
+ 0.00% 8 lws-main [.] sqlite3RunParser - -
+ 0.00% 8 lws-main [k] tcp_rcv_established - -
+ 0.00% 8 lws-main [k] tcp_v4_early_demux - -
+ 0.00% 8 lws-main [.] vdbeRecordCompareString - -
+ 0.00% 7 db-read-1 [.] __pthread_mutex_timedlock - -
+ 0.00% 7 db-read-1 [.] getCellInfo - -
+ 0.00% 7 db-read-2 [.] __libc_free - -
+ 0.00% 7 db-read-2 [.] __pthread_mutex_lock - -
+ 0.00% 7 db-read-2 [k] aa_file_perm - -
+ 0.00% 7 db-read-2 [.] alloc_slot - -
+ 0.00% 7 db-read-2 [.] sqlite3BtreeNext.isra.0 - -
+ 0.00% 7 db-read-2 [.] sqlite3PcacheRelease - -
+ 0.00% 7 db-read-2 [.] walFindFrame.constprop.0 - -
+ 0.00% 7 db-read-2 [k] xas_descend - -
+ 0.00% 7 db-read-3 [.] __pthread_mutex_lock - -
+ 0.00% 7 db-read-3 [.] getPageNormal - -
+ 0.00% 7 db-read-3 [.] unixRead - -
+ 0.00% 7 db-read-4 [.] btreeParseCellPtr - -
+ 0.00% 7 db-read-4 [.] decodeFlags - -
+ 0.00% 7 db-read-4 [.] pcache1Unpin - -
+ 0.00% 7 db-read-4 [.] readDbPage - -
+ 0.00% 7 db-read-4 [k] smp_call_function_many_cond - -
+ 0.00% 7 db-read-4 [.] sqlite3BtreeNext.isra.0 - -
+ 0.00% 7 db-read-4 [.] sqlite3MemSize - -
+ 0.00% 7 db-read-4 [.] sqlite3PcacheRelease - -
+ 0.00% 7 lws-main [.] __mmap - -
+ 0.00% 7 lws-main [k] _raw_spin_trylock - -
+ 0.00% 7 lws-main [k] filemap_map_pages - -
+ 0.00% 7 lws-main [k] kmem_cache_alloc_node - -
+ 0.00% 7 lws-main [k] mark_buffer_dirty - -
+ 0.00% 7 lws-main [k] mas_data_end - -
+ 0.00% 7 lws-main [.] memchr - -
+ 0.00% 7 lws-main [k] nf_confirm - -
+ 0.00% 7 lws-main [.] pop_arg - -
+ 0.00% 7 lws-main [.] secp256k1_fe_mul_inner - -
+ 0.00% 6 db-read-1 [k] __fsnotify_parent - -
+ 0.00% 6 db-read-1 [.] btreeInitPage - -
+ 0.00% 6 db-read-1 [.] getPageNormal - -
+ 0.00% 6 db-read-1 [.] memcmp - -
+ 0.00% 6 db-read-1 [.] pcache1TruncateUnsafe - -
+ 0.00% 6 db-read-1 [.] pcache1Unpin - -
+ 0.00% 6 db-read-1 [.] resolveExprStep - -
+ 0.00% 6 db-read-1 [k] smp_call_function_many_cond - -
+ 0.00% 6 db-read-1 [.] sqlite3MemSize - -
+ 0.00% 6 db-read-2 [.] sqlite3MemSize - -
+ 0.00% 6 db-read-2 [.] vdbeCompareMemString - -
+ 0.00% 6 db-read-2 [k] xas_start - -
+ 0.00% 6 db-read-3 [.] btreeInitPage - -
+ 0.00% 6 db-read-3 [.] decodeFlags - -
+ 0.00% 6 db-read-3 [.] memcmp - -
+ 0.00% 6 db-read-3 [.] sqlite3BtreeNext.isra.0 - -
+ 0.00% 6 db-read-3 [.] sqlite3MemSize - -
+ 0.00% 6 db-read-4 [.] __pthread_mutex_lock - -
+ 0.00% 6 db-read-4 [.] sqlite3VdbeFinishMoveto - -
+ 0.00% 6 db-write [k] do_syscall_64 - -
+ 0.00% 6 lws-main [k] __fdget_raw - -
+ 0.00% 6 lws-main [k] __memcg_slab_post_alloc_hook - -
+ 0.00% 6 lws-main [k] __mod_lruvec_state - -
+ 0.00% 6 lws-main [k] __tcp_transmit_skb - -
+ 0.00% 6 lws-main [k] alloc_pages_mpol - -
+ 0.00% 6 lws-main [k] crc32_body - -
+ 0.00% 6 lws-main [k] free_unref_page_commit - -
+ 0.00% 6 lws-main [k] handle_mm_fault - -
+ 0.00% 6 lws-main [k] mas_wr_node_store - -
+ 0.00% 6 lws-main [.] pwrite - -
+ 0.00% 6 lws-main [k] refill_stock - -
+ 0.00% 6 lws-main [.] sqlite3BtreeInsert - -
+ 0.00% 6 lws-main [.] sqlite3ExprCodeTarget - -
+ 0.00% 6 lws-main [.] sqlite3GetToken - -
+ 0.00% 6 lws-main [.] strncmp - -
+ 0.00% 6 lws-main [.] unixShmLock - -
+ 0.00% 6 lws-main [k] virtnet_rq_alloc.isra.0 - -
+ 0.00% 5 db-read-1 [.] btreeParseCellPtrIndex - -
+ 0.00% 5 db-read-1 [k] filemap_read - -
+ 0.00% 5 db-read-1 [.] sqlite3BtreeNext.isra.0 - -
+ 0.00% 5 db-read-2 [k] __lruvec_stat_mod_folio - -
+ 0.00% 5 db-read-2 [.] decodeFlags - -
+ 0.00% 5 db-read-2 [k] mem_cgroup_commit_charge - -
+ 0.00% 5 db-read-2 [k] native_write_msr - -
+ 0.00% 5 db-read-2 [.] sqlite3DbMallocRawNN - -
+ 0.00% 5 db-read-3 [k] filemap_read - -
+ 0.00% 5 db-read-3 [k] handle_softirqs - -
+ 0.00% 5 db-read-3 [k] mas_walk - -
+ 0.00% 5 db-read-3 [.] pcache1TruncateUnsafe - -
+ 0.00% 5 db-read-4 [.] alloc_slot - -
+ 0.00% 5 db-read-4 [.] btreeParseCellPtrIndex - -
+ 0.00% 5 db-read-4 [.] getAndInitPage - -
+ 0.00% 5 db-read-4 [.] getPageNormal - -
+ 0.00% 5 db-read-4 [.] memcmp - -
+ 0.00% 5 db-read-4 [k] zap_pte_range - -
+ 0.00% 5 lws-main [k] __dev_queue_xmit - -
+ 0.00% 5 lws-main [.] __fwritex - -
+ 0.00% 5 lws-main [k] __kmalloc - -
+ 0.00% 5 lws-main [k] __kmem_cache_alloc_bulk - -
+ 0.00% 5 lws-main [k] __mmap_region - -
+ 0.00% 5 lws-main [k] __pv_queued_spin_lock_slowpath - -
+ 0.00% 5 lws-main [k] __raw_spin_lock_irqsave - -
+ 0.00% 5 lws-main [.] cJSON_Duplicate_rec - -
+ 0.00% 5 lws-main [k] do_vmi_align_munmap - -
+ 0.00% 5 lws-main [.] findElementWithHash - -
+ 0.00% 5 lws-main [k] ip_finish_output2 - -
+ 0.00% 5 lws-main [k] ip_rcv_core - -
+ 0.00% 5 lws-main [k] load_balance - -
+ 0.00% 5 lws-main [.] lws_ws_rx_sm - -
+ 0.00% 5 lws-main [k] mas_wr_walk - -
+ 0.00% 5 lws-main [.] memset - -
+ 0.00% 5 lws-main [k] nf_nat_inet_fn - -
+ 0.00% 5 lws-main [k] nft_update_chain_stats - -
+ 0.00% 5 lws-main [.] nontrivial_free - -
+ 0.00% 5 lws-main [k] ovl_init - -
+ 0.00% 5 lws-main [.] poll - -
+ 0.00% 5 lws-main [k] post_alloc_hook - -
+ 0.00% 5 lws-main [k] rcu_core - -
+ 0.00% 5 lws-main [k] rmqueue - -
+ 0.00% 5 lws-main [.] secp256k1_fe_sqr_inner - -
+ 0.00% 5 lws-main [.] sn_write - -
+ 0.00% 5 lws-main [.] sqlite3AtoF - -
+ 0.00% 5 lws-main [.] sqlite3DbNNFreeNN - -
+ 0.00% 5 lws-main [.] sqlite3MemMalloc - -
+ 0.00% 5 lws-main [.] sqlite3Select - -
+ 0.00% 5 lws-main [.] sqlite3_str_vappendf - -
+ 0.00% 5 lws-main [k] tcp_rbtree_insert - -
+ 0.00% 5 lws-main [k] up_read - -
+ 0.00% 5 lws-main [k] virtnet_poll - -
+ 0.00% 5 lws-main [k] vm_normal_page - -
+ 0.00% 4 db-read-1 [k] __mod_node_page_state - -
+ 0.00% 4 db-read-1 [.] btreeParseCellPtr - -
+ 0.00% 4 db-read-1 [.] moveToRoot - -
+ 0.00% 4 db-read-1 [.] sqlite3GetVarint32 - -
+ 0.00% 4 db-read-1 [.] sqlite3VdbeRecordCompareWithSkip - -
+ 0.00% 4 db-read-1 [.] sqlite3WalkExprNN - -
+ 0.00% 4 db-read-1 [.] walHashGet - -
+ 0.00% 4 db-read-2 [k] __fsnotify_parent - -
+ 0.00% 4 db-read-2 [k] __raw_callee_save___pv_queued_spin_unlock - -
+ 0.00% 4 db-read-2 [k] apparmor_file_permission - -
+ 0.00% 4 db-read-2 [k] blk_cgroup_congested - -
+ 0.00% 4 db-read-2 [k] mas_walk - -
+ 0.00% 4 db-read-2 [.] moveToRoot - -
+ 0.00% 4 db-read-2 [.] sqlite3GetVarint32 - -
+ 0.00% 4 db-read-2 [.] sqlite3VdbeFinishMoveto - -
+ 0.00% 4 db-read-2 [.] sqlite3VdbeIdxRowid - -
+ 0.00% 4 db-read-2 [.] unixRead - -
+ 0.00% 4 db-read-3 [.] btreeParseCellPtr - -
+ 0.00% 4 db-read-3 [.] getCellInfo - -
+ 0.00% 4 db-read-3 [.] sqlite3PcacheRelease - -
+ 0.00% 4 db-read-4 [.] __lock - -
+ 0.00% 4 db-read-4 [k] apparmor_file_permission - -
+ 0.00% 4 db-read-4 [.] moveToChild - -
+ 0.00% 4 db-read-4 [k] rw_verify_area - -
+ 0.00% 4 db-read-4 [.] sqlite3DbMallocRawNN - -
+ 0.00% 4 db-read-4 [k] xas_start - -
+ 0.00% 4 lws-main [k] __block_commit_write - -
+ 0.00% 4 lws-main [k] __call_rcu_common - -
+ 0.00% 4 lws-main [k] __inet_lookup_established - -
+ 0.00% 4 lws-main [k] __ip_dev_find - -
+ 0.00% 4 lws-main [k] __ip_local_out - -
+ 0.00% 4 lws-main [k] __netif_receive_skb_list_core - -
+ 0.00% 4 lws-main [k] __x2apic_send_IPI_mask - -
+ 0.00% 4 lws-main [.] add_item_to_object.constprop.0 - -
+ 0.00% 4 lws-main [.] balance_nonroot - -
+ 0.00% 4 lws-main [.] cJSON_Delete - -
+ 0.00% 4 lws-main [k] consume_stock - -
+ 0.00% 4 lws-main [.] countFinalize - -
+ 0.00% 4 lws-main [k] down_write - -
+ 0.00% 4 lws-main [.] exprDup - -
+ 0.00% 4 lws-main [k] ext4_es_lookup_extent - -
+ 0.00% 4 lws-main [k] folio_lruvec_lock_irqsave - -
+ 0.00% 4 lws-main [k] futex_wake - -
+ 0.00% 4 lws-main [k] ip_list_rcv - -
+ 0.00% 4 lws-main [k] mas_next_slot - -
+ 0.00% 4 lws-main [k] mas_preallocate - -
+ 0.00% 4 lws-main [k] mas_rev_awalk - -
+ 0.00% 4 lws-main [k] memset_orig - -
+ 0.00% 4 lws-main [k] native_write_msr - -
+ 0.00% 4 lws-main [k] nf_hook_slow_list - -
+ 0.00% 4 lws-main [k] nf_nat_ipv4_pre_routing - -
+ 0.00% 4 lws-main [.] nostr_relay_callback - -
+ 0.00% 4 lws-main [k] reqsk_timer_handler - -
+ 0.00% 4 lws-main [.] rops_handle_POLLIN_ws - -
+ 0.00% 4 lws-main [.] secp256k1_gej_add_ge - -
+ 0.00% 4 lws-main [.] secp256k1_modinv64 - -
+ 0.00% 4 lws-main [k] skb_clone - -
+ 0.00% 4 lws-main [.] sqlite3PcacheDirtyList.isra.0 - -
+ 0.00% 4 lws-main [.] sqlite3WalkExprNN - -
+ 0.00% 4 lws-main [k] tcp_ack - -
+ 0.00% 4 lws-main [k] tcp_clean_rtx_queue.constprop.0 - -
+ 0.00% 4 lws-main [k] uncharge_folio - -
+ 0.00% 4 lws-main [k] up_write - -
+ 0.00% 4 lws-main [k] vm_unmapped_area - -
+ 0.00% 4 lws-main [k] vma_alloc_folio - -
+ 0.00% 4 lws-main [.] walIndexAppend - -
+ 0.00% 4 lws-main [.] whereScanNext - -
+ 0.00% 3 db-read-1 [.] __pthread_mutex_lock - -
+ 0.00% 3 db-read-1 [.] alloc_slot - -
+ 0.00% 3 db-read-1 [k] blk_cgroup_congested - -
+ 0.00% 3 db-read-1 [k] futex_wake - -
+ 0.00% 3 db-read-1 [.] get_meta - -
+ 0.00% 3 db-read-1 [k] kmem_cache_alloc - -
+ 0.00% 3 db-read-1 [.] moveToChild - -
+ 0.00% 3 db-read-1 [.] sqlite3BtreeInsert - -
+ 0.00% 3 db-read-1 [.] sqlite3PcacheRelease - -
+ 0.00% 3 db-read-1 [.] vdbeCompareMemString - -
+ 0.00% 3 db-read-1 [k] zap_pte_range - -
+ 0.00% 3 db-read-2 [k] __memcg_slab_post_alloc_hook - -
+ 0.00% 3 db-read-2 [k] __mod_node_page_state - -
+ 0.00% 3 db-read-2 [.] __unlock - -
+ 0.00% 3 db-read-2 [k] _raw_spin_unlock_irq - -
+ 0.00% 3 db-read-2 [.] btreeParseCellPtrIndex - -
+ 0.00% 3 db-read-2 [k] get_mem_cgroup_from_mm - -
+ 0.00% 3 db-read-2 [.] pcache1TruncateUnsafe - -
+ 0.00% 3 db-read-2 [.] resolveExprStep - -
+ 0.00% 3 db-read-2 [.] sqlite3Malloc - -
+ 0.00% 3 db-read-2 [.] sqlite3VdbeSerialGet - -
+ 0.00% 3 db-read-2 [k] vfs_read - -
+ 0.00% 3 db-read-2 [.] whereLoopAddBtreeIndex - -
+ 0.00% 3 db-read-3 [k] __lruvec_stat_mod_folio - -
+ 0.00% 3 db-read-3 [.] alloc_slot - -
+ 0.00% 3 db-read-3 [k] apparmor_file_permission - -
+ 0.00% 3 db-read-3 [.] getAndInitPage - -
+ 0.00% 3 db-read-3 [k] iowrite16 - -
+ 0.00% 3 db-read-3 [.] pcacheManageDirtyList - -
+ 0.00% 3 db-read-3 [.] sqlite3VdbeFinishMoveto - -
+ 0.00% 3 db-read-3 [.] vdbeCompareMemString - -
+ 0.00% 3 db-read-3 [.] walHashGet - -
+ 0.00% 3 db-read-4 [k] __fsnotify_parent - -
+ 0.00% 3 db-read-4 [.] __munmap - -
+ 0.00% 3 db-read-4 [k] __raw_callee_save___pv_queued_spin_unlock - -
+ 0.00% 3 db-read-4 [k] __rcu_read_lock - -
+ 0.00% 3 db-read-4 [k] handle_softirqs - -
+ 0.00% 3 db-read-4 [.] pcache1TruncateUnsafe - -
+ 0.00% 3 db-read-4 [k] percpu_counter_add_batch - -
+ 0.00% 3 db-read-4 [.] sqlite3GetVarint32 - -
+ 0.00% 3 db-read-4 [.] vdbeCompareMemString - -
+ 0.00% 3 db-read-4 [k] vfs_read - -
+ 0.00% 3 db-read-4 [.] whereLoopAddBtree - -
+ 0.00% 3 db-write [k] _raw_spin_unlock_irq - -
+ 0.00% 3 db-write [k] _raw_spin_unlock_irqrestore - -
+ 0.00% 3 event-worker [.] secp256k1_fe_sqr_inner - -
+ 0.00% 3 event-worker [.] secp256k1_ge_from_storage - -
+ 0.00% 3 lws-main [k] __bitmap_weight - -
+ 0.00% 3 lws-main [.] __floatscan - -
+ 0.00% 3 lws-main [.] __intscan - -
+ 0.00% 3 lws-main [k] __ip_queue_xmit - -
+ 0.00% 3 lws-main [k] __mem_cgroup_charge - -
+ 0.00% 3 lws-main [k] __netif_receive_skb_core.constprop.0 - -
+ 0.00% 3 lws-main [k] __netif_receive_skb_one_core - -
+ 0.00% 3 lws-main [k] __nf_conntrack_alloc - -
+ 0.00% 3 lws-main [k] __pte_offset_map_lock - -
+ 0.00% 3 lws-main [k] __radix_tree_lookup - -
+ 0.00% 3 lws-main [k] __rq_qos_throttle - -
+ 0.00% 3 lws-main [k] __slab_free - -
+ 0.00% 3 lws-main [.] __stdio_write - -
+ 0.00% 3 lws-main [.] _lws_plat_service_tsi.part.0 - -
+ 0.00% 3 lws-main [k] _raw_spin_unlock - -
+ 0.00% 3 lws-main [k] balance_dirty_pages_ratelimited_flags - -
+ 0.00% 3 lws-main [.] btreeBeginTrans - -
+ 0.00% 3 lws-main [.] buffer_skip_whitespace - -
+ 0.00% 3 lws-main [.] cJSON_ParseWithLengthOpts - -
+ 0.00% 3 lws-main [k] can_vma_merge_before - -
+ 0.00% 3 lws-main [k] cap_vm_enough_memory - -
+ 0.00% 3 lws-main [k] cgroup_rstat_updated - -
+ 0.00% 3 lws-main [k] cond_accept_memory - -
+ 0.00% 3 lws-main [.] createAggContext - -
+ 0.00% 3 lws-main [k] current_obj_cgroup - -
+ 0.00% 3 lws-main [k] do_mmap - -
+ 0.00% 3 lws-main [k] eth_type_trans - -
+ 0.00% 3 lws-main [.] free - -
+ 0.00% 3 lws-main [k] free_unref_page_prepare - -
+ 0.00% 3 lws-main [k] get_l4proto - -
+ 0.00% 3 lws-main [.] get_object_item - -
+ 0.00% 3 lws-main [k] hash_conntrack_raw - -
+ 0.00% 3 lws-main [k] inet_ehashfn - -
+ 0.00% 3 lws-main [k] inet_gro_receive - -
+ 0.00% 3 lws-main [k] ip_finish_output - -
+ 0.00% 3 lws-main [k] ip_skb_dst_mtu - -
+ 0.00% 3 lws-main [k] ip_sublist_rcv - -
+ 0.00% 3 lws-main [k] ipv4_conntrack_local - -
+ 0.00% 3 lws-main [k] kfree_skbmem - -
+ 0.00% 3 lws-main [k] kthread_blkcg - -
+ 0.00% 3 lws-main [k] lruvec_stat_mod_folio - -
+ 0.00% 3 lws-main [.] lws_issue_raw - -
+ 0.00% 3 lws-main [.] lws_service_fd_tsi - -
+ 0.00% 3 lws-main [k] mas_alloc_nodes - -
+ 0.00% 3 lws-main [k] mas_find - -
+ 0.00% 3 lws-main [k] mas_update_gap.part.0 - -
+ 0.00% 3 lws-main [k] memcpy_orig - -
+ 0.00% 3 lws-main [.] minmaxStep - -
+ 0.00% 3 lws-main [k] mod_objcg_state - -
+ 0.00% 3 lws-main [k] napi_complete_done - -
+ 0.00% 3 lws-main [k] napi_gro_receive - -
+ 0.00% 3 lws-main [k] netif_receive_skb_list_internal - -
+ 0.00% 3 lws-main [k] netif_skb_features - -
+ 0.00% 3 lws-main [k] nf_ct_acct_add - -
+ 0.00% 3 lws-main [k] nf_ct_get_tuple - -
+ 0.00% 3 lws-main [k] nft_payload_eval - -
+ 0.00% 3 lws-main [k] page_frag_free - -
+ 0.00% 3 lws-main [k] page_to_skb - -
+ 0.00% 3 lws-main [.] pagerWalFrames - -
+ 0.00% 3 lws-main [k] part_in_flight - -
+ 0.00% 3 lws-main [k] policy_nodemask - -
+ 0.00% 3 lws-main [k] posix_lock_inode - -
+ 0.00% 3 lws-main [.] pthreadMutexEnter - -
+ 0.00% 3 lws-main [.] pthreadMutexLeave - -
+ 0.00% 3 lws-main [.] query_subscription_details - -
+ 0.00% 3 lws-main [k] rb_erase - -
+ 0.00% 3 lws-main [k] rb_first - -
+ 0.00% 3 lws-main [k] release_pages - -
+ 0.00% 3 lws-main [.] resolveP2Values - -
+ 0.00% 3 lws-main [.] selectInnerLoop - -
+ 0.00% 3 lws-main [k] should_fail_alloc_page - -
+ 0.00% 3 lws-main [.] sqlite3BtreeCommitPhaseTwo - -
+ 0.00% 3 lws-main [.] sqlite3Insert - -
+ 0.00% 3 lws-main [.] sqlite3VdbeBooleanValue - -
+ 0.00% 3 lws-main [.] sqlite3VdbeCreate - -
+ 0.00% 3 lws-main [.] sqlite3VdbeHalt - -
+ 0.00% 3 lws-main [.] sscanf - -
+ 0.00% 3 lws-main [k] start_xmit - -
+ 0.00% 3 lws-main [k] strlen - -
+ 0.00% 3 lws-main [k] task_mm_cid_work - -
+ 0.00% 3 lws-main [k] tcp_check_space - -
+ 0.00% 3 lws-main [k] tcp_mstamp_refresh - -
+ 0.00% 3 lws-main [k] tcp_parse_options - -
+ 0.00% 3 lws-main [k] tcp_rtt_estimator - -
+ 0.00% 3 lws-main [k] tcp_stream_memory_free - -
+ 0.00% 3 lws-main [k] tcp_tso_segs - -
+ 0.00% 3 lws-main [k] tcp_v4_fill_cb - -
+ 0.00% 3 lws-main [k] tcp_wfree - -
+ 0.00% 3 lws-main [k] uncharge_batch - -
+ 0.00% 3 lws-main [k] unmap_page_range - -
+ 0.00% 3 lws-main [k] virtqueue_kick_prepare - -
+ 0.00% 3 lws-main [.] walIndexTryHdr - -
+ 0.00% 3 lws-main [.] walWriteOneFrame.isra.0 - -
+ 0.00% 3 lws-main [k] xmit_skb - -
+ 0.00% 3 lws-main [.] yy_destructor.isra.0 - -
+ 0.00% 2 db-read-1 [k] __futex_unqueue - -
+ 0.00% 2 db-read-1 [k] __get_user_nocheck_4 - -
+ 0.00% 2 db-read-1 [.] __pthread_mutex_trylock - -
+ 0.00% 2 db-read-1 [.] __unlock - -
+ 0.00% 2 db-read-1 [k] apparmor_file_permission - -
+ 0.00% 2 db-read-1 [.] binCollFunc - -
+ 0.00% 2 db-read-1 [k] cgroup_rstat_updated - -
+ 0.00% 2 db-read-1 [k] copy_page_to_iter - -
+ 0.00% 2 db-read-1 [k] folio_add_new_anon_rmap - -
+ 0.00% 2 db-read-1 [k] make_vfsgid - -
+ 0.00% 2 db-read-1 [.] sqlite3DbMallocRawNN - -
+ 0.00% 2 db-read-1 [.] sqlite3GetInt32 - -
+ 0.00% 2 db-read-1 [.] sqlite3KeyInfoAlloc - -
+ 0.00% 2 db-read-1 [.] sqlite3RunParser - -
+ 0.00% 2 db-read-1 [.] sqlite3VdbeSerialGet - -
+ 0.00% 2 db-read-1 [k] tlb_finish_mmu - -
+ 0.00% 2 db-read-1 [.] unixRead - -
+ 0.00% 2 db-read-1 [k] vfs_read - -
+ 0.00% 2 db-read-1 [k] xas_start - -
+ 0.00% 2 db-read-1 [.] yy_reduce.isra.0 - -
+ 0.00% 2 db-read-2 [k] __alloc_pages - -
+ 0.00% 2 db-read-2 [k] __get_user_nocheck_4 - -
+ 0.00% 2 db-read-2 [.] __pthread_mutex_trylock - -
+ 0.00% 2 db-read-2 [k] __rcu_read_lock - -
+ 0.00% 2 db-read-2 [k] __rmqueue_pcplist - -
+ 0.00% 2 db-read-2 [.] __timedwait_cp - -
+ 0.00% 2 db-read-2 [k] __x64_sys_futex - -
+ 0.00% 2 db-read-2 [k] _raw_spin_lock - -
+ 0.00% 2 db-read-2 [k] count_memcg_events.constprop.0 - -
+ 0.00% 2 db-read-2 [k] down_read_trylock - -
+ 0.00% 2 db-read-2 [k] fput - -
+ 0.00% 2 db-read-2 [k] free_unref_page_prepare - -
+ 0.00% 2 db-read-2 [k] futex_wake - -
+ 0.00% 2 db-read-2 [k] generic_file_read_iter - -
+ 0.00% 2 db-read-2 [.] get_meta - -
+ 0.00% 2 db-read-2 [k] get_pfnblock_flags_mask - -
+ 0.00% 2 db-read-2 [.] selectInnerLoop - -
+ 0.00% 2 db-read-2 [.] strlen - -
+ 0.00% 2 db-read-2 [.] whereLoopAddBtree - -
+ 0.00% 2 db-read-2 [.] whereScanNext - -
+ 0.00% 2 db-read-3 [k] __alloc_pages - -
+ 0.00% 2 db-read-3 [k] __fsnotify_parent - -
+ 0.00% 2 db-read-3 [.] __lock - -
+ 0.00% 2 db-read-3 [.] __mmap - -
+ 0.00% 2 db-read-3 [k] __rcu_read_lock - -
+ 0.00% 2 db-read-3 [k] __rmqueue_pcplist - -
+ 0.00% 2 db-read-3 [.] __timedwait_cp - -
+ 0.00% 2 db-read-3 [.] __unlock - -
+ 0.00% 2 db-read-3 [k] __x2apic_send_IPI_mask - -
+ 0.00% 2 db-read-3 [k] __xas_next - -
+ 0.00% 2 db-read-3 [k] _raw_spin_lock - -
+ 0.00% 2 db-read-3 [k] _raw_spin_trylock - -
+ 0.00% 2 db-read-3 [.] btreeNext.constprop.0 - -
+ 0.00% 2 db-read-3 [k] count_memcg_events.constprop.0 - -
+ 0.00% 2 db-read-3 [k] crc32_body - -
+ 0.00% 2 db-read-3 [k] down_read_trylock - -
+ 0.00% 2 db-read-3 [.] exprAnalyze - -
+ 0.00% 2 db-read-3 [k] futex_unqueue - -
+ 0.00% 2 db-read-3 [k] futex_wake_mark - -
+ 0.00% 2 db-read-3 [k] kmem_cache_alloc - -
+ 0.00% 2 db-read-3 [k] lock_vma_under_rcu - -
+ 0.00% 2 db-read-3 [.] pcacheFetchFinishWithInit - -
+ 0.00% 2 db-read-3 [k] rw_verify_area - -
+ 0.00% 2 db-read-3 [.] sqlite3GetToken - -
+ 0.00% 2 db-read-3 [.] sqlite3Malloc - -
+ 0.00% 2 db-read-3 [.] sqlite3VdbeIdxRowid - -
+ 0.00% 2 db-read-3 [.] sqlite3VdbeSerialGet - -
+ 0.00% 2 db-read-3 [.] sqlite3WhereBegin - -
+ 0.00% 2 db-read-3 [.] sqlite3_free - -
+ 0.00% 2 db-read-3 [.] whereLoopAddBtreeIndex - -
+ 0.00% 2 db-read-3 [k] xas_start - -
+ 0.00% 2 db-read-4 [k] ___slab_alloc - -
+ 0.00% 2 db-read-4 [.] __mmap - -
+ 0.00% 2 db-read-4 [k] __next_zones_zonelist - -
+ 0.00% 2 db-read-4 [.] __pthread_mutex_trylock - -
+ 0.00% 2 db-read-4 [.] __syscall_ret - -
+ 0.00% 2 db-read-4 [.] __timedwait_cp - -
+ 0.00% 2 db-read-4 [.] applyAffinity - -
+ 0.00% 2 db-read-4 [.] exprMightBeIndexed - -
+ 0.00% 2 db-read-4 [k] futex_hash - -
+ 0.00% 2 db-read-4 [k] futex_wake_mark - -
+ 0.00% 2 db-read-4 [k] get_mem_cgroup_from_mm - -
+ 0.00% 2 db-read-4 [k] kmem_cache_alloc - -
+ 0.00% 2 db-read-4 [k] mas_walk - -
+ 0.00% 2 db-read-4 [k] mem_cgroup_commit_charge - -
+ 0.00% 2 db-read-4 [.] memset - -
+ 0.00% 2 db-read-4 [.] pcache1Alloc - -
+ 0.00% 2 db-read-4 [.] pcacheFetchFinishWithInit - -
+ 0.00% 2 db-read-4 [.] sqlite3GetInt32 - -
+ 0.00% 2 db-read-4 [.] sqlite3RunParser - -
+ 0.00% 2 db-read-4 [.] sqlite3VdbeIdxRowid - -
+ 0.00% 2 db-read-4 [.] sqlite3VdbeSerialGet - -
+ 0.00% 2 db-read-4 [.] sqlite3WalkExprNN - -
+ 0.00% 2 db-read-4 [.] yy_reduce.isra.0 - -
+ 0.00% 2 db-write [k] __fdget - -
+ 0.00% 2 db-write [k] __fdget_raw - -
+ 0.00% 2 db-write [.] __pthread_mutex_unlock - -
+ 0.00% 2 db-write [k] fault_in_readable - -
+ 0.00% 2 db-write [.] fcntl - -
+ 0.00% 2 db-write [k] finish_task_switch.isra.0 - -
+ 0.00% 2 db-write [.] memmove - -
+ 0.00% 2 db-write [k] rep_movs_alternative - -
+ 0.00% 2 db-write [k] smp_call_function_many_cond - -
+ 0.00% 2 db-write [.] sqlite3BtreeIndexMoveto - -
+ 0.00% 2 event-worker [.] __intscan - -
+ 0.00% 2 event-worker [.] __pthread_mutex_timedlock - -
+ 0.00% 2 event-worker [.] memcpy - -
+ 0.00% 2 event-worker [.] secp256k1_fe_mul_inner - -
+ 0.00% 2 lws-main [k] __anon_vma_interval_tree_augment_rotate - -
+ 0.00% 2 lws-main [k] __blk_bios_map_sg - -
+ 0.00% 2 lws-main [k] __blk_mq_alloc_requests - -
+ 0.00% 2 lws-main [k] __copy_skb_header - -
+ 0.00% 2 lws-main [k] __filemap_fdatawait_range - -
+ 0.00% 2 lws-main [k] __folio_throttle_swaprate - -
+ 0.00% 2 lws-main [k] __free_pages - -
+ 0.00% 2 lws-main [k] __inet_dev_addr_type - -
+ 0.00% 2 lws-main [.] __libc_realloc - -
+ 0.00% 2 lws-main [.] __malloc_alloc_meta - -
+ 0.00% 2 lws-main [k] __mem_cgroup_uncharge_list - -
+ 0.00% 2 lws-main [k] __mod_timer - -
+ 0.00% 2 lws-main [k] __napi_alloc_skb - -
+ 0.00% 2 lws-main [k] __napi_build_skb - -
+ 0.00% 2 lws-main [k] __nf_ct_refresh_acct - -
+ 0.00% 2 lws-main [k] __pollwait - -
+ 0.00% 2 lws-main [k] __rb_insert_augmented - -
+ 0.00% 2 lws-main [k] __siphash_unaligned - -
+ 0.00% 2 lws-main [k] __split_vma - -
+ 0.00% 2 lws-main [.] __strftime_fmt_1 - -
+ 0.00% 2 lws-main [k] __sw_hweight64 - -
+ 0.00% 2 lws-main [k] __tcp_v4_send_check - -
+ 0.00% 2 lws-main [.] __vdso_clock_gettime - -
+ 0.00% 2 lws-main [k] __vm_area_free - -
+ 0.00% 2 lws-main [k] _find_first_bit - -
+ 0.00% 2 lws-main [k] _find_next_bit - -
+ 0.00% 2 lws-main [k] _raw_read_unlock - -
+ 0.00% 2 lws-main [.] add_subscription_to_manager - -
+ 0.00% 2 lws-main [k] add_transaction_credits - -
+ 0.00% 2 lws-main [k] alloc_pages - -
+ 0.00% 2 lws-main [.] allocateCursor - -
+ 0.00% 2 lws-main [k] anon_vma_clone - -
+ 0.00% 2 lws-main [k] apparmor_file_lock - -
+ 0.00% 2 lws-main [k] arch_get_unmapped_area_topdown - -
+ 0.00% 2 lws-main [k] bio_to_wbt_flags - -
+ 0.00% 2 lws-main [k] blk_mq_submit_bio - -
+ 0.00% 2 lws-main [k] blkcg_set_ioprio - -
+ 0.00% 2 lws-main [k] block_write_end - -
+ 0.00% 2 lws-main [.] broadcast_event_to_subscriptions - -
+ 0.00% 2 lws-main [.] btreeEndTransaction - -
+ 0.00% 2 lws-main [.] btreeOverwriteContent - -
+ 0.00% 2 lws-main [.] cJSON_AddItemToArray - -
+ 0.00% 2 lws-main [.] cJSON_GetArraySize - -
+ 0.00% 2 lws-main [.] cJSON_GetNumberValue - -
+ 0.00% 2 lws-main [.] cJSON_IsNumber - -
+ 0.00% 2 lws-main [.] clearSelect - -
+ 0.00% 2 lws-main [k] copy_page_from_iter_atomic - -
+ 0.00% 2 lws-main [.] countOfViewOptimization - -
+ 0.00% 2 lws-main [k] cubictcp_acked - -
+ 0.00% 2 lws-main [k] dev_gro_receive - -
+ 0.00% 2 lws-main [k] do_sys_poll - -
+ 0.00% 2 lws-main [k] dst_release - -
+ 0.00% 2 lws-main [.] exprMightBeIndexed - -
+ 0.00% 2 lws-main [.] exprNodeIsConstant - -
+ 0.00% 2 lws-main [k] ext4_block_write_begin - -
+ 0.00% 2 lws-main [k] ext4_dirty_inode - -
+ 0.00% 2 lws-main [k] ext4_fill_raw_inode - -
+ 0.00% 2 lws-main [k] ext4_meta_trans_blocks - -
+ 0.00% 2 lws-main [k] ext4_sb_block_valid - -
+ 0.00% 2 lws-main [k] ext4_writepages - -
+ 0.00% 2 lws-main [k] fault_in_readable - -
+ 0.00% 2 lws-main [k] fib_lookup_good_nhc - -
+ 0.00% 2 lws-main [k] filemap_get_folios_tag - -
+ 0.00% 2 lws-main [k] folio_add_file_rmap_ptes - -
+ 0.00% 2 lws-main [k] folio_clear_dirty_for_io - -
+ 0.00% 2 lws-main [k] folio_memcg_lock - -
+ 0.00% 2 lws-main [k] fq_codel_dequeue - -
+ 0.00% 2 lws-main [k] free_unref_page_list - -
+ 0.00% 2 lws-main [k] get_random_u32 - -
+ 0.00% 2 lws-main [.] getenv - -
+ 0.00% 2 lws-main [.] handle_req_message - -
+ 0.00% 2 lws-main [k] ip_rcv_finish_core.isra.0 - -
+ 0.00% 2 lws-main [k] ip_route_output_key_hash_rcu - -
+ 0.00% 2 lws-main [k] ip_sublist_rcv_finish - -
+ 0.00% 2 lws-main [.] isDate - -
+ 0.00% 2 lws-main [k] jbd2__journal_start - -
+ 0.00% 2 lws-main [.] keywordCode.constprop.0 - -
+ 0.00% 2 lws-main [k] kfree - -
+ 0.00% 2 lws-main [k] ktime_get - -
+ 0.00% 2 lws-main [k] ktime_get_ts64 - -
+ 0.00% 2 lws-main [k] kvm_clock_get_cycles - -
+ 0.00% 2 lws-main [k] lock_timer_base - -
+ 0.00% 2 lws-main [k] lookup_bh_lru - -
+ 0.00% 2 lws-main [.] lws_handle_POLLOUT_event - -
+ 0.00% 2 lws-main [.] lws_parse_ws - -
+ 0.00% 2 lws-main [.] lws_ssl_capable_write_no_ssl - -
+ 0.00% 2 lws-main [.] lws_wsi_user - -
+ 0.00% 2 lws-main [k] mas_ascend - -
+ 0.00% 2 lws-main [k] mas_empty_area_rev - -
+ 0.00% 2 lws-main [k] mas_leaf_max_gap - -
+ 0.00% 2 lws-main [k] mas_mab_cp - -
+ 0.00% 2 lws-main [k] mas_store_prealloc - -
+ 0.00% 2 lws-main [k] mas_wr_walk_index - -
+ 0.00% 2 lws-main [k] mpage_process_page_bufs - -
+ 0.00% 2 lws-main [k] mt_find - -
+ 0.00% 2 lws-main [k] mt_free_rcu - -
+ 0.00% 2 lws-main [k] neigh_hh_output - -
+ 0.00% 2 lws-main [k] netif_tx_wake_queue - -
+ 0.00% 2 lws-main [k] nf_nat_ipv4_local_in - -
+ 0.00% 2 lws-main [k] nf_nat_ipv4_out - -
+ 0.00% 2 lws-main [k] nf_nat_setup_info - -
+ 0.00% 2 lws-main [k] nft_immediate_eval - -
+ 0.00% 2 lws-main [k] note_gp_changes - -
+ 0.00% 2 lws-main [k] p4d_offset - -
+ 0.00% 2 lws-main [.] pad.part.0 - -
+ 0.00% 2 lws-main [.] pageFindSlot - -
+ 0.00% 2 lws-main [k] page_counter_cancel - -
+ 0.00% 2 lws-main [.] pcacheManageDirtyList - -
+ 0.00% 2 lws-main [k] perf_iterate_ctx - -
+ 0.00% 2 lws-main [k] proc_misc_d_revalidate - -
+ 0.00% 2 lws-main [.] process_req_async_completions - -
+ 0.00% 2 lws-main [k] raw_v4_input - -
+ 0.00% 2 lws-main [k] receive_mergeable - -
+ 0.00% 2 lws-main [.] resolveSelectStep - -
+ 0.00% 2 lws-main [k] resolve_normal_ct - -
+ 0.00% 2 lws-main [k] sbitmap_get - -
+ 0.00% 2 lws-main [.] secp256k1_sha256_transform - -
+ 0.00% 2 lws-main [.] seekAndWriteFd - -
+ 0.00% 2 lws-main [k] set_ptes.isra.0 - -
+ 0.00% 2 lws-main [k] sg_init_table - -
+ 0.00% 2 lws-main [k] siphash_1u32 - -
+ 0.00% 2 lws-main [k] skb_csum_hwoffload_help - -
+ 0.00% 2 lws-main [k] skb_free_head - -
+ 0.00% 2 lws-main [k] skb_release_data - -
+ 0.00% 2 lws-main [k] skb_release_head_state - -
+ 0.00% 2 lws-main [k] skb_try_coalesce - -
+ 0.00% 2 lws-main [k] sock_gen_put - -
+ 0.00% 2 lws-main [k] sock_put - -
+ 0.00% 2 lws-main [.] sqlite3BtreeOpen - -
+ 0.00% 2 lws-main [.] sqlite3ExprAssignVarNumber - -
+ 0.00% 2 lws-main [.] sqlite3ExprCodeFactorable - -
+ 0.00% 2 lws-main [.] sqlite3ExprIfTrue - -
+ 0.00% 2 lws-main [.] sqlite3FindTable - -
+ 0.00% 2 lws-main [.] sqlite3GenerateIndexKey - -
+ 0.00% 2 lws-main [.] sqlite3LocateTable - -
+ 0.00% 2 lws-main [.] sqlite3MemFree - -
+ 0.00% 2 lws-main [.] sqlite3OpenTableAndIndices - -
+ 0.00% 2 lws-main [.] sqlite3ResolveExprNames - -
+ 0.00% 2 lws-main [.] sqlite3SafetyCheckOk - -
+ 0.00% 2 lws-main [.] sqlite3Update.constprop.0 - -
+ 0.00% 2 lws-main [.] sqlite3VdbeMemMakeWriteable - -
+ 0.00% 2 lws-main [.] sqlite3VdbeMemMove - -
+ 0.00% 2 lws-main [.] sqlite3VdbeTransferError - -
+ 0.00% 2 lws-main [.] sqlite3WalEndReadTransaction - -
+ 0.00% 2 lws-main [.] sqlite3_step - -
+ 0.00% 2 lws-main [.] string_read - -
+ 0.00% 2 lws-main [k] strnlen - -
+ 0.00% 2 lws-main [k] strscpy - -
+ 0.00% 2 lws-main [k] submit_bio_noacct_nocheck - -
+ 0.00% 2 lws-main [k] tcp_ack_update_window.isra.0 - -
+ 0.00% 2 lws-main [k] tcp_conn_request - -
+ 0.00% 2 lws-main [k] tcp_do_parse_auth_options - -
+ 0.00% 2 lws-main [k] tcp_openreq_init_rwin - -
+ 0.00% 2 lws-main [k] tcp_rcv_state_process - -
+ 0.00% 2 lws-main [k] tcp_sacktag_write_queue - -
+ 0.00% 2 lws-main [k] tcp_synack_options - -
+ 0.00% 2 lws-main [k] tcp_sync_mss - -
+ 0.00% 2 lws-main [k] tcp_update_skb_after_send - -
+ 0.00% 2 lws-main [k] tcp_v4_do_rcv - -
+ 0.00% 2 lws-main [k] tcp_v4_rcv - -
+ 0.00% 2 lws-main [k] tcp_validate_incoming - -
+ 0.00% 2 lws-main [k] tcp_write_xmit - -
+ 0.00% 2 lws-main [k] trace_rss_stat - -
+ 0.00% 2 lws-main [k] unmap_region - -
+ 0.00% 2 lws-main [k] update_sg_lb_stats - -
+ 0.00% 2 lws-main [.] validate_filter_values - -
+ 0.00% 2 lws-main [k] validate_xmit_skb - -
+ 0.00% 2 lws-main [.] valueFromExpr.constprop.0 - -
+ 0.00% 2 lws-main [.] vdbeColumnFromOverflow - -
+ 0.00% 2 lws-main [.] vdbeUnbind - -
+ 0.00% 2 lws-main [k] vfs_write - -
+ 0.00% 2 lws-main [.] vfscanf - -
+ 0.00% 2 lws-main [k] virtio_net_hdr_to_skb.constprop.0 - -
+ 0.00% 2 lws-main [k] virtqueue_add_split - -
+ 0.00% 2 lws-main [k] vring_unmap_one_split - -
+ 0.00% 2 lws-main [.] walMerge - -
+ 0.00% 2 lws-main [.] walWriteToLog - -
+ 0.00% 2 lws-main [k] wbt_track - -
+ 0.00% 2 lws-main [.] wherePathSolver.isra.0 - -
+ 0.00% 2 lws-main [.] 0x0000000000000ae9 - -
+ 0.00% 1 db-read-1 [k] __alloc_pages - -
+ 0.00% 1 db-read-1 [k] __handle_mm_fault - -
+ 0.00% 1 db-read-1 [k] __kmem_cache_alloc_bulk - -
+ 0.00% 1 db-read-1 [k] __lruvec_stat_mod_folio - -
+ 0.00% 1 db-read-1 [.] __malloc_allzerop - -
+ 0.00% 1 db-read-1 [.] __mmap - -
+ 0.00% 1 db-read-1 [k] __mod_memcg_lruvec_state - -
+ 0.00% 1 db-read-1 [k] __next_zones_zonelist - -
+ 0.00% 1 db-read-1 [.] __pthread_cond_timedwait - -
+ 0.00% 1 db-read-1 [k] __pv_queued_spin_lock_slowpath - -
+ 0.00% 1 db-read-1 [k] __raw_callee_save___pv_queued_spin_unlock - -
+ 0.00% 1 db-read-1 [k] __rb_insert_augmented - -
+ 0.00% 1 db-read-1 [k] __rcu_read_lock - -
+ 0.00% 1 db-read-1 [k] __rcu_read_unlock - -
+ 0.00% 1 db-read-1 [.] __syscall_cp - -
+ 0.00% 1 db-read-1 [.] __timedwait_cp - -
+ 0.00% 1 db-read-1 [k] __x64_sys_futex - -
+ 0.00% 1 db-read-1 [k] __x86_indirect_thunk_rax - -
+ 0.00% 1 db-read-1 [k] _copy_to_iter - -
+ 0.00% 1 db-read-1 [k] _find_first_bit - -
+ 0.00% 1 db-read-1 [k] _raw_spin_unlock_irq - -
+ 0.00% 1 db-read-1 [k] add_transaction_credits - -
+ 0.00% 1 db-read-1 [k] alloc_anon_folio - -
+ 0.00% 1 db-read-1 [.] balance - -
+ 0.00% 1 db-read-1 [.] btreeBeginTrans - -
+ 0.00% 1 db-read-1 [.] btreeNext.constprop.0 - -
+ 0.00% 1 db-read-1 [k] call_rcu - -
+ 0.00% 1 db-read-1 [k] can_vma_merge_before - -
+ 0.00% 1 db-read-1 [.] computeLimitRegisters - -
+ 0.00% 1 db-read-1 [k] current_time - -
+ 0.00% 1 db-read-1 [k] do_anonymous_page - -
+ 0.00% 1 db-read-1 [k] do_futex - -
+ 0.00% 1 db-read-1 [k] do_mmap - -
+ 0.00% 1 db-read-1 [k] do_vmi_align_munmap - -
+ 0.00% 1 db-read-1 [k] down_read_trylock - -
+ 0.00% 1 db-read-1 [.] exprIdxCover - -
+ 0.00% 1 db-read-1 [k] ext4_file_read_iter - -
+ 0.00% 1 db-read-1 [k] filemap_get_pages - -
+ 0.00% 1 db-read-1 [.] findElementWithHash - -
+ 0.00% 1 db-read-1 [k] folio_add_lru - -
+ 0.00% 1 db-read-1 [k] folio_lruvec_lock_irqsave - -
+ 0.00% 1 db-read-1 [k] folio_mark_accessed - -
+ 0.00% 1 db-read-1 [k] folio_remove_rmap_ptes - -
+ 0.00% 1 db-read-1 [k] fput - -
+ 0.00% 1 db-read-1 [.] free - -
+ 0.00% 1 db-read-1 [k] free_swap_cache - -
+ 0.00% 1 db-read-1 [k] free_unref_page_prepare - -
+ 0.00% 1 db-read-1 [k] futex_hash - -
+ 0.00% 1 db-read-1 [k] futex_q_lock - -
+ 0.00% 1 db-read-1 [k] get_mem_cgroup_from_mm - -
+ 0.00% 1 db-read-1 [k] handle_pte_fault - -
+ 0.00% 1 db-read-1 [k] iowrite16 - -
+ 0.00% 1 db-read-1 [k] irqentry_exit_to_user_mode - -
+ 0.00% 1 db-read-1 [k] lock_vma_under_rcu - -
+ 0.00% 1 db-read-1 [k] mas_leaf_max_gap - -
+ 0.00% 1 db-read-1 [k] mas_prev_node - -
+ 0.00% 1 db-read-1 [k] mas_rev_awalk - -
+ 0.00% 1 db-read-1 [k] mas_split.isra.0 - -
+ 0.00% 1 db-read-1 [k] mas_update_gap.part.0 - -
+ 0.00% 1 db-read-1 [k] mas_wr_bnode - -
+ 0.00% 1 db-read-1 [k] mas_wr_walk - -
+ 0.00% 1 db-read-1 [k] native_write_msr - -
+ 0.00% 1 db-read-1 [.] nontrivial_free - -
+ 0.00% 1 db-read-1 [.] pcache1Alloc - -
+ 0.00% 1 db-read-1 [.] pcacheFetchFinishWithInit - -
+ 0.00% 1 db-read-1 [.] pcacheManageDirtyList - -
+ 0.00% 1 db-read-1 [k] percpu_counter_add_batch - -
+ 0.00% 1 db-read-1 [k] plist_add - -
+ 0.00% 1 db-read-1 [k] refill_obj_stock - -
+ 0.00% 1 db-read-1 [k] refill_stock - -
+ 0.00% 1 db-read-1 [k] security_file_fcntl - -
+ 0.00% 1 db-read-1 [k] security_file_permission - -
+ 0.00% 1 db-read-1 [k] should_flush_tlb - -
+ 0.00% 1 db-read-1 [.] sqlite3CodeSubselect - -
+ 0.00% 1 db-read-1 [.] sqlite3ExprColUsed.isra.0 - -
+ 0.00% 1 db-read-1 [.] sqlite3ExprIfFalse - -
+ 0.00% 1 db-read-1 [.] sqlite3GetToken - -
+ 0.00% 1 db-read-1 [.] sqlite3LogEst - -
+ 0.00% 1 db-read-1 [.] sqlite3Malloc - -
+ 0.00% 1 db-read-1 [.] sqlite3MemCompare - -
+ 0.00% 1 db-read-1 [.] sqlite3MemMalloc - -
+ 0.00% 1 db-read-1 [.] sqlite3SrcListDelete - -
+ 0.00% 1 db-read-1 [.] sqlite3VdbeIdxRowid - -
+ 0.00% 1 db-read-1 [.] sqlite3WalEndReadTransaction - -
+ 0.00% 1 db-read-1 [.] sqlite3WhereBegin - -
+ 0.00% 1 db-read-1 [.] sqlite3_free - -
+ 0.00% 1 db-read-1 [.] sqlite3_step - -
+ 0.00% 1 db-read-1 [k] syscall_exit_to_user_mode - -
+ 0.00% 1 db-read-1 [k] up_read - -
+ 0.00% 1 db-read-1 [.] vdbeFreeOpArray - -
+ 0.00% 1 db-read-1 [k] vma_alloc_folio - -
+ 0.00% 1 db-read-1 [k] wake_q_add_safe - -
+ 0.00% 1 db-read-1 [.] whereLoopAddBtree - -
+ 0.00% 1 db-read-1 [.] whereLoopAddBtreeIndex - -
+ 0.00% 1 db-read-1 [.] whereLoopAddOr - -
+ 0.00% 1 db-read-1 [.] whereLoopInsert - -
+ 0.00% 1 db-read-1 [.] whereLoopOutputAdjust - -
+ 0.00% 1 db-read-1 [.] wherePathSolver.isra.0 - -
+ 0.00% 1 db-read-1 [.] whereScanInit - -
+ 0.00% 1 db-read-1 [.] whereScanNext - -
+ 0.00% 1 db-read-1 [k] x64_sys_call - -
+ 0.00% 1 db-read-2 [k] __filemap_add_folio - -
+ 0.00% 1 db-read-2 [k] __handle_mm_fault - -
+ 0.00% 1 db-read-2 [k] __inet_lookup_established - -
+ 0.00% 1 db-read-2 [.] __lock - -
+ 0.00% 1 db-read-2 [k] __memcg_kmem_charge_page - -
+ 0.00% 1 db-read-2 [k] __mod_memcg_lruvec_state - -
+ 0.00% 1 db-read-2 [k] __pv_queued_spin_lock_slowpath - -
+ 0.00% 1 db-read-2 [k] __rcu_read_unlock - -
+ 0.00% 1 db-read-2 [.] __syscall_ret - -
+ 0.00% 1 db-read-2 [k] __x2apic_send_IPI_mask - -
+ 0.00% 1 db-read-2 [k] __x64_sys_fcntl - -
+ 0.00% 1 db-read-2 [k] __x64_sys_pread64 - -
+ 0.00% 1 db-read-2 [k] __x86_indirect_thunk_rax - -
+ 0.00% 1 db-read-2 [k] _raw_spin_trylock - -
+ 0.00% 1 db-read-2 [.] accessPayload - -
+ 0.00% 1 db-read-2 [k] alloc_anon_folio - -
+ 0.00% 1 db-read-2 [k] anon_vma_interval_tree_insert - -
+ 0.00% 1 db-read-2 [k] atime_needs_update - -
+ 0.00% 1 db-read-2 [.] binCollFunc - -
+ 0.00% 1 db-read-2 [k] cap_mmap_addr - -
+ 0.00% 1 db-read-2 [k] cond_accept_memory - -
+ 0.00% 1 db-read-2 [k] crc32_body - -
+ 0.00% 1 db-read-2 [.] default_malloc - -
+ 0.00% 1 db-read-2 [k] do_futex - -
+ 0.00% 1 db-read-2 [k] do_vmi_align_munmap - -
+ 0.00% 1 db-read-2 [.] exprAnalyze - -
+ 0.00% 1 db-read-2 [.] exprDup - -
+ 0.00% 1 db-read-2 [.] fcntl - -
+ 0.00% 1 db-read-2 [.] findConstInWhere - -
+ 0.00% 1 db-read-2 [k] folio_add_lru - -
+ 0.00% 1 db-read-2 [k] folio_mark_accessed - -
+ 0.00% 1 db-read-2 [k] futex_hash - -
+ 0.00% 1 db-read-2 [k] futex_q_lock - -
+ 0.00% 1 db-read-2 [k] futex_unqueue - -
+ 0.00% 1 db-read-2 [k] handle_mm_fault - -
+ 0.00% 1 db-read-2 [k] handle_softirqs - -
+ 0.00% 1 db-read-2 [.] insertCell - -
+ 0.00% 1 db-read-2 [k] jbd2__journal_start - -
+ 0.00% 1 db-read-2 [k] kmem_cache_free - -
+ 0.00% 1 db-read-2 [k] lock_vma_under_rcu - -
+ 0.00% 1 db-read-2 [k] lookup_bh_lru - -
+ 0.00% 1 db-read-2 [k] mas_data_end - -
+ 0.00% 1 db-read-2 [k] mas_empty_area_rev - -
+ 0.00% 1 db-read-2 [k] mas_mab_cp - -
+ 0.00% 1 db-read-2 [k] mas_topiary_replace - -
+ 0.00% 1 db-read-2 [.] memmove - -
+ 0.00% 1 db-read-2 [.] moveToChild - -
+ 0.00% 1 db-read-2 [.] nontrivial_free - -
+ 0.00% 1 db-read-2 [k] page_cache_ra_unbounded - -
+ 0.00% 1 db-read-2 [k] page_counter_cancel - -
+ 0.00% 1 db-read-2 [.] pcache1Alloc - -
+ 0.00% 1 db-read-2 [.] pcacheFetchFinishWithInit - -
+ 0.00% 1 db-read-2 [k] perf_event_mmap - -
+ 0.00% 1 db-read-2 [k] perf_event_mmap_event - -
+ 0.00% 1 db-read-2 [k] post_alloc_hook - -
+ 0.00% 1 db-read-2 [.] propagateConstantExprRewriteOne - -
+ 0.00% 1 db-read-2 [k] pte_mkwrite - -
+ 0.00% 1 db-read-2 [.] pthreadMutexAlloc - -
+ 0.00% 1 db-read-2 [.] pthreadMutexEnter - -
+ 0.00% 1 db-read-2 [k] security_mmap_addr - -
+ 0.00% 1 db-read-2 [.] sqlite3BtreeClose.isra.0 - -
+ 0.00% 1 db-read-2 [.] sqlite3ExprAffinity - -
+ 0.00% 1 db-read-2 [.] sqlite3MemMalloc - -
+ 0.00% 1 db-read-2 [.] sqlite3MemRoundup - -
+ 0.00% 1 db-read-2 [.] sqlite3RunParser - -
+ 0.00% 1 db-read-2 [.] sqlite3SrcListAppendFromTerm - -
+ 0.00% 1 db-read-2 [.] sqlite3SrcListAssignCursors - -
+ 0.00% 1 db-read-2 [.] sqlite3VdbeAddOp3 - -
+ 0.00% 1 db-read-2 [.] sqlite3VdbeDelete - -
+ 0.00% 1 db-read-2 [.] sqlite3WalkExprNN - -
+ 0.00% 1 db-read-2 [.] sqlite3WhereExprUsageNN - -
+ 0.00% 1 db-read-2 [.] sqlite3_step - -
+ 0.00% 1 db-read-2 [k] syscall_exit_to_user_mode_prepare - -
+ 0.00% 1 db-read-2 [k] tlb_batch_pages_flush - -
+ 0.00% 1 db-read-2 [k] tlb_gather_mmu - -
+ 0.00% 1 db-read-2 [.] unixShmLock - -
+ 0.00% 1 db-read-2 [k] unlink_anon_vmas - -
+ 0.00% 1 db-read-2 [.] walHashGet - -
+ 0.00% 1 db-read-2 [.] whereLoopInsert - -
+ 0.00% 1 db-read-2 [k] x64_sys_call - -
+ 0.00% 1 db-read-2 [.] yy_reduce.isra.0 - -
+ 0.00% 1 db-read-2 [k] zap_pte_range - -
+ 0.00% 1 db-read-3 [k] __next_zones_zonelist - -
+ 0.00% 1 db-read-3 [k] __pte_offset_map - -
+ 0.00% 1 db-read-3 [.] __pthread_mutex_trylock - -
+ 0.00% 1 db-read-3 [k] __raw_callee_save___pv_queued_spin_unlock - -
+ 0.00% 1 db-read-3 [k] __rcu_read_unlock - -
+ 0.00% 1 db-read-3 [k] __x64_sys_futex - -
+ 0.00% 1 db-read-3 [k] aa_file_perm - -
+ 0.00% 1 db-read-3 [k] alloc_pages_mpol - -
+ 0.00% 1 db-read-3 [k] apparmor_file_lock - -
+ 0.00% 1 db-read-3 [.] balance_nonroot - -
+ 0.00% 1 db-read-3 [.] btreeParseCellAdjustSizeForOverflow.isra.0 - -
+ 0.00% 1 db-read-3 [k] can_vma_merge_before - -
+ 0.00% 1 db-read-3 [k] cap_vm_enough_memory - -
+ 0.00% 1 db-read-3 [k] cgroup_rstat_updated - -
+ 0.00% 1 db-read-3 [.] codeApplyAffinity.isra.0 - -
+ 0.00% 1 db-read-3 [k] cond_accept_memory - -
+ 0.00% 1 db-read-3 [k] dequeue_skb - -
+ 0.00% 1 db-read-3 [k] dev_gro_receive - -
+ 0.00% 1 db-read-3 [k] do_anonymous_page - -
+ 0.00% 1 db-read-3 [.] exprDup - -
+ 0.00% 1 db-read-3 [k] ext4_file_read_iter - -
+ 0.00% 1 db-read-3 [.] findConstInWhere - -
+ 0.00% 1 db-read-3 [k] folio_add_lru_vma - -
+ 0.00% 1 db-read-3 [k] folio_add_new_anon_rmap - -
+ 0.00% 1 db-read-3 [k] folio_mark_accessed - -
+ 0.00% 1 db-read-3 [k] fput - -
+ 0.00% 1 db-read-3 [.] freeP4 - -
+ 0.00% 1 db-read-3 [.] free_req_payload_main.part.0 - -
+ 0.00% 1 db-read-3 [k] free_unref_page_commit - -
+ 0.00% 1 db-read-3 [k] futex_q_lock - -
+ 0.00% 1 db-read-3 [k] futex_wake - -
+ 0.00% 1 db-read-3 [.] getOverflowPage - -
+ 0.00% 1 db-read-3 [.] get_meta - -
+ 0.00% 1 db-read-3 [k] handle_pte_fault - -
+ 0.00% 1 db-read-3 [.] keywordCode.constprop.0 - -
+ 0.00% 1 db-read-3 [k] kfree - -
+ 0.00% 1 db-read-3 [k] lru_gen_refault - -
+ 0.00% 1 db-read-3 [k] mas_ascend - -
+ 0.00% 1 db-read-3 [k] mas_data_end - -
+ 0.00% 1 db-read-3 [k] mas_find - -
+ 0.00% 1 db-read-3 [k] mas_mab_cp - -
+ 0.00% 1 db-read-3 [k] mas_pop_node - -
+ 0.00% 1 db-read-3 [k] mas_prev_node - -
+ 0.00% 1 db-read-3 [k] mas_prev_slot - -
+ 0.00% 1 db-read-3 [k] mas_push_data - -
+ 0.00% 1 db-read-3 [k] mas_rev_awalk - -
+ 0.00% 1 db-read-3 [k] mas_topiary_replace - -
+ 0.00% 1 db-read-3 [k] mast_fill_bnode - -
+ 0.00% 1 db-read-3 [k] may_expand_vm - -
+ 0.00% 1 db-read-3 [k] mem_cgroup_commit_charge - -
+ 0.00% 1 db-read-3 [.] moveToRoot - -
+ 0.00% 1 db-read-3 [k] native_flush_tlb_multi - -
+ 0.00% 1 db-read-3 [k] native_write_msr - -
+ 0.00% 1 db-read-3 [k] nft_do_chain - -
+ 0.00% 1 db-read-3 [k] page_counter_try_charge - -
+ 0.00% 1 db-read-3 [.] pager_write - -
+ 0.00% 1 db-read-3 [.] pcache1Alloc - -
+ 0.00% 1 db-read-3 [k] percpu_counter_add_batch - -
+ 0.00% 1 db-read-3 [k] posix_lock_inode - -
+ 0.00% 1 db-read-3 [.] pthreadMutexEnter - -
+ 0.00% 1 db-read-3 [.] pthreadMutexLeave - -
+ 0.00% 1 db-read-3 [.] queue_pop - -
+ 0.00% 1 db-read-3 [k] rcu_cblist_dequeue - -
+ 0.00% 1 db-read-3 [.] reader_worker_main - -
+ 0.00% 1 db-read-3 [k] rebalance_domains - -
+ 0.00% 1 db-read-3 [.] resolveExprStep - -
+ 0.00% 1 db-read-3 [k] security_file_permission - -
+ 0.00% 1 db-read-3 [k] should_flush_tlb - -
+ 0.00% 1 db-read-3 [k] smp_call_function_many_cond - -
+ 0.00% 1 db-read-3 [.] sqlite3BtreeInsert - -
+ 0.00% 1 db-read-3 [.] sqlite3DbMallocRawNN - -
+ 0.00% 1 db-read-3 [.] sqlite3ExprAffinity - -
+ 0.00% 1 db-read-3 [.] sqlite3ExprCodeRunJustOnce - -
+ 0.00% 1 db-read-3 [.] sqlite3ExprCodeTarget - -
+ 0.00% 1 db-read-3 [.] sqlite3ExprCodeTemp - -
+ 0.00% 1 db-read-3 [.] sqlite3ExprNeedsNoAffinityChange - -
+ 0.00% 1 db-read-3 [.] sqlite3LocateTable - -
+ 0.00% 1 db-read-3 [.] sqlite3PagerWrite - -
+ 0.00% 1 db-read-3 [.] sqlite3SafetyCheckOk - -
+ 0.00% 1 db-read-3 [.] sqlite3VdbeAddOp3 - -
+ 0.00% 1 db-read-3 [.] sqlite3VdbeHalt - -
+ 0.00% 1 db-read-3 [.] sqlite3WhereExprUsageFull - -
+ 0.00% 1 db-read-3 [.] strlen - -
+ 0.00% 1 db-read-3 [k] up_read - -
+ 0.00% 1 db-read-3 [.] vdbeChangeP4Full - -
+ 0.00% 1 db-read-3 [.] vdbeRecordCompareInt - -
+ 0.00% 1 db-read-3 [.] vdbeRecordCompareString - -
+ 0.00% 1 db-read-3 [k] virtnet_poll - -
+ 0.00% 1 db-read-3 [.] whereClauseInsert - -
+ 0.00% 1 db-read-3 [.] whereLoopAddBtree - -
+ 0.00% 1 db-read-3 [.] whereLoopAddOr - -
+ 0.00% 1 db-read-3 [.] whereLoopOutputAdjust - -
+ 0.00% 1 db-read-3 [.] wherePathSolver.isra.0 - -
+ 0.00% 1 db-read-3 [.] whereScanNext - -
+ 0.00% 1 db-read-3 [k] zap_pte_range - -
+ 0.00% 1 db-read-4 [k] __futex_wait - -
+ 0.00% 1 db-read-4 [k] __lruvec_stat_mod_folio - -
+ 0.00% 1 db-read-4 [.] __malloc_allzerop - -
+ 0.00% 1 db-read-4 [k] __mod_lruvec_state - -
+ 0.00% 1 db-read-4 [k] __rmqueue_pcplist - -
+ 0.00% 1 db-read-4 [k] __split_vma - -
+ 0.00% 1 db-read-4 [k] _copy_from_user - -
+ 0.00% 1 db-read-4 [k] _copy_to_iter - -
+ 0.00% 1 db-read-4 [k] _find_next_bit - -
+ 0.00% 1 db-read-4 [k] _raw_spin_unlock_irq - -
+ 0.00% 1 db-read-4 [k] anon_vma_interval_tree_insert - -
+ 0.00% 1 db-read-4 [k] anon_vma_name - -
+ 0.00% 1 db-read-4 [.] binCollFunc - -
+ 0.00% 1 db-read-4 [k] bio_to_wbt_flags - -
+ 0.00% 1 db-read-4 [k] blk_cgroup_congested - -
+ 0.00% 1 db-read-4 [.] btreeInitPage - -
+ 0.00% 1 db-read-4 [k] copy_page_to_iter - -
+ 0.00% 1 db-read-4 [k] count_memcg_events.constprop.0 - -
+ 0.00% 1 db-read-4 [k] crc32_body - -
+ 0.00% 1 db-read-4 [.] db_finalize_stmt - -
+ 0.00% 1 db-read-4 [k] do_anonymous_page - -
+ 0.00% 1 db-read-4 [k] down_write_killable - -
+ 0.00% 1 db-read-4 [.] exprDup - -
+ 0.00% 1 db-read-4 [k] ext4_es_lookup_extent - -
+ 0.00% 1 db-read-4 [k] ext4_file_read_iter - -
+ 0.00% 1 db-read-4 [k] ext4_mpage_readpages - -
+ 0.00% 1 db-read-4 [k] filemap_get_pages - -
+ 0.00% 1 db-read-4 [k] folio_add_new_anon_rmap - -
+ 0.00% 1 db-read-4 [k] folio_mark_accessed - -
+ 0.00% 1 db-read-4 [k] folio_remove_rmap_ptes - -
+ 0.00% 1 db-read-4 [k] fput - -
+ 0.00% 1 db-read-4 [k] futex_wake - -
+ 0.00% 1 db-read-4 [k] get_futex_key - -
+ 0.00% 1 db-read-4 [.] get_meta - -
+ 0.00% 1 db-read-4 [k] get_vma_policy - -
+ 0.00% 1 db-read-4 [.] insertCell - -
+ 0.00% 1 db-read-4 [k] iowrite16 - -
+ 0.00% 1 db-read-4 [.] keywordCode.constprop.0 - -
+ 0.00% 1 db-read-4 [k] kmem_cache_alloc_node - -
+ 0.00% 1 db-read-4 [k] llist_add_batch - -
+ 0.00% 1 db-read-4 [k] lock_vma_under_rcu - -
+ 0.00% 1 db-read-4 [k] lru_add_drain_cpu - -
+ 0.00% 1 db-read-4 [k] make_vfsgid - -
+ 0.00% 1 db-read-4 [k] mas_empty_area_rev - -
+ 0.00% 1 db-read-4 [k] mas_prev_slot - -
+ 0.00% 1 db-read-4 [k] mas_store_gfp - -
+ 0.00% 1 db-read-4 [k] mas_store_prealloc - -
+ 0.00% 1 db-read-4 [.] memmove - -
+ 0.00% 1 db-read-4 [.] moveToRoot - -
+ 0.00% 1 db-read-4 [k] native_write_msr - -
+ 0.00% 1 db-read-4 [.] pageFreeArray - -
+ 0.00% 1 db-read-4 [.] pager_end_transaction - -
+ 0.00% 1 db-read-4 [.] pcache1Free - -
+ 0.00% 1 db-read-4 [k] plist_add - -
+ 0.00% 1 db-read-4 [.] propagateConstantExprRewriteOne - -
+ 0.00% 1 db-read-4 [.] pthreadMutexLeave - -
+ 0.00% 1 db-read-4 [k] release_pages - -
+ 0.00% 1 db-read-4 [.] resolveExprStep - -
+ 0.00% 1 db-read-4 [k] schedule_debug.isra.0 - -
+ 0.00% 1 db-read-4 [k] security_file_permission - -
+ 0.00% 1 db-read-4 [.] selectInnerLoop - -
+ 0.00% 1 db-read-4 [.] sqlite3BtreeInsert - -
+ 0.00% 1 db-read-4 [.] sqlite3ExprCodeTarget - -
+ 0.00% 1 db-read-4 [.] sqlite3ExprCompare.part.0 - -
+ 0.00% 1 db-read-4 [.] sqlite3ExprListAppendNew - -
+ 0.00% 1 db-read-4 [.] sqlite3FinishCoding - -
+ 0.00% 1 db-read-4 [.] sqlite3GetToken - -
+ 0.00% 1 db-read-4 [.] sqlite3KeyInfoAlloc - -
+ 0.00% 1 db-read-4 [.] sqlite3Malloc - -
+ 0.00% 1 db-read-4 [.] sqlite3MemRoundup - -
+ 0.00% 1 db-read-4 [.] sqlite3PExpr - -
+ 0.00% 1 db-read-4 [.] sqlite3PagerUnrefNotNull - -
+ 0.00% 1 db-read-4 [.] sqlite3VdbeMemGrow - -
+ 0.00% 1 db-read-4 [.] sqlite3WhereClauseClear - -
+ 0.00% 1 db-read-4 [.] sqlite3WhereExprUsageFull - -
+ 0.00% 1 db-read-4 [.] sqlite3WindowRewrite - -
+ 0.00% 1 db-read-4 [.] sqlite3_step - -
+ 0.00% 1 db-read-4 [.] strlen - -
+ 0.00% 1 db-read-4 [k] syscall_exit_to_user_mode_prepare - -
+ 0.00% 1 db-read-4 [k] tcp_clean_rtx_queue.constprop.0 - -
+ 0.00% 1 db-read-4 [.] unixRead - -
+ 0.00% 1 db-read-4 [k] up_read - -
+ 0.00% 1 db-read-4 [k] vm_area_dup - -
+ 0.00% 1 db-read-4 [.] whereLoopFindLesser - -
+ 0.00% 1 db-read-4 [.] whereLoopInsert - -
+ 0.00% 1 db-read-4 [.] wherePathSatisfiesOrderBy - -
+ 0.00% 1 db-read-4 [.] wherePathSolver.isra.0 - -
+ 0.00% 1 db-read-4 [.] whereScanNext - -
+ 0.00% 1 db-read-4 [k] x64_sys_call - -
+ 0.00% 1 db-write [.] __libc_malloc_impl - -
+ 0.00% 1 db-write [k] __raw_spin_lock_irqsave - -
+ 0.00% 1 db-write [.] alloc_slot - -
+ 0.00% 1 db-write [k] anon_vma_interval_tree_insert - -
+ 0.00% 1 db-write [.] cJSON_IsArray - -
+ 0.00% 1 db-write [k] clear_page_orig - -
+ 0.00% 1 db-write [.] computeCellSize - -
+ 0.00% 1 db-write [.] computeYMD.part.0 - -
+ 0.00% 1 db-write [k] do_user_addr_fault - -
+ 0.00% 1 db-write [.] exprDup - -
+ 0.00% 1 db-write [k] ext4_do_writepages - -
+ 0.00% 1 db-write [k] ext4_generic_write_checks - -
+ 0.00% 1 db-write [k] filemap_alloc_folio - -
+ 0.00% 1 db-write [k] filemap_get_entry - -
+ 0.00% 1 db-write [k] filemap_read - -
+ 0.00% 1 db-write [k] iowrite16 - -
+ 0.00% 1 db-write [k] lru_add_drain_cpu - -
+ 0.00% 1 db-write [k] mark_buffer_dirty - -
+ 0.00% 1 db-write [k] mas_prev_slot - -
+ 0.00% 1 db-write [.] memcmp - -
+ 0.00% 1 db-write [.] memcpy - -
+ 0.00% 1 db-write [k] memset_orig - -
+ 0.00% 1 db-write [k] mpage_prepare_extent_to_map - -
+ 0.00% 1 db-write [.] pagerWalFrames - -
+ 0.00% 1 db-write [.] pcache1FetchStage2 - -
+ 0.00% 1 db-write [.] pcache1Unpin - -
+ 0.00% 1 db-write [k] perf_event_mmap_event - -
+ 0.00% 1 db-write [.] readDbPage - -
+ 0.00% 1 db-write [k] release_pages - -
+ 0.00% 1 db-write [k] rw_verify_area - -
+ 0.00% 1 db-write [k] sbitmap_find_bit - -
+ 0.00% 1 db-write [.] sccp - -
+ 0.00% 1 db-write [k] scsi_prepare_cmd - -
+ 0.00% 1 db-write [.] sqlite3Insert - -
+ 0.00% 1 db-write [.] sqlite3PagerWrite - -
+ 0.00% 1 db-write [.] sqlite3RunParser - -
+ 0.00% 1 db-write [.] sqlite3WalDefaultHook - -
+ 0.00% 1 db-write [.] sqlite3WhereBegin - -
+ 0.00% 1 db-write [.] vdbeFreeOpArray - -
+ 0.00% 1 db-write [.] walChecksumBytes - -
+ 0.00% 1 db-write [.] walFindFrame.constprop.0 - -
+ 0.00% 1 db-write [.] walHashGet - -
+ 0.00% 1 db-write [.] walIndexAppend - -
+ 0.00% 1 db-write [.] walMerge - -
+ 0.00% 1 db-write [.] walWriteOneFrame.isra.0 - -
+ 0.00% 1 db-write [.] walWriteToLog - -
+ 0.00% 1 db-write [k] xas_descend - -
+ 0.00% 1 db-write [.] yy_reduce.isra.0 - -
+ 0.00% 1 event-worker [k] __fdget_raw - -
+ 0.00% 1 event-worker [.] __lock - -
+ 0.00% 1 event-worker [k] __mod_memcg_lruvec_state - -
+ 0.00% 1 event-worker [k] __x64_sys_futex - -
+ 0.00% 1 event-worker [k] _raw_spin_unlock_irqrestore - -
+ 0.00% 1 event-worker [k] do_syscall_64 - -
+ 0.00% 1 event-worker [.] fcntl - -
+ 0.00% 1 event-worker [k] finish_task_switch.isra.0 - -
+ 0.00% 1 event-worker [.] pcache1Unpin - -
+ 0.00% 1 event-worker [k] percpu_counter_add_batch - -
+ 0.00% 1 event-worker [.] sqlite3RunParser - -
+ 0.00% 1 event-worker [.] sqlite3VdbeExec - -
+ 0.00% 1 event-worker [.] sqlite3WhereBegin - -
+ 0.00% 1 event-worker [.] strlen - -
+ 0.00% 1 event-worker [.] tolower - -
+ 0.00% 1 event-worker [.] unixShmBarrier - -
+ 0.00% 1 lws-main [k] __alloc_skb - -
+ 0.00% 1 lws-main [k] __blk_flush_plug - -
+ 0.00% 1 lws-main [k] __blk_rq_map_sg - -
+ 0.00% 1 lws-main [k] __build_skb_around - -
+ 0.00% 1 lws-main [k] __d_lookup_rcu - -
+ 0.00% 1 lws-main [k] __dev_xmit_skb - -
+ 0.00% 1 lws-main [.] __errno_location - -
+ 0.00% 1 lws-main [k] __ext4_journal_start_sb - -
+ 0.00% 1 lws-main [k] __file_remove_privs - -
+ 0.00% 1 lws-main [k] __filemap_fdatawrite_range - -
+ 0.00% 1 lws-main [k] __get_free_pages - -
+ 0.00% 1 lws-main [k] __hrtimer_init - -
+ 0.00% 1 lws-main [k] __ip_finish_output - -
+ 0.00% 1 lws-main [.] __lws_header_table_detach - -
+ 0.00% 1 lws-main [.] __malloc_allzerop - -
+ 0.00% 1 lws-main [k] __mark_inode_dirty - -
+ 0.00% 1 lws-main [k] __memcpy - -
+ 0.00% 1 lws-main [k] __memset - -
+ 0.00% 1 lws-main [.] __private_cond_signal - -
+ 0.00% 1 lws-main [k] __sg_alloc_table - -
+ 0.00% 1 lws-main [.] __shgetc - -
+ 0.00% 1 lws-main [k] __sk_destruct - -
+ 0.00% 1 lws-main [k] __sk_mem_raise_allocated - -
+ 0.00% 1 lws-main [k] __sk_mem_reduce_allocated - -
+ 0.00% 1 lws-main [k] __skb_clone - -
+ 0.00% 1 lws-main [k] __skb_to_sgvec - -
+ 0.00% 1 lws-main [.] __strftime_l - -
+ 0.00% 1 lws-main [k] __sys_recvfrom - -
+ 0.00% 1 lws-main [k] __sys_sendto - -
+ 0.00% 1 lws-main [k] __tcp_ack_snd_check - -
+ 0.00% 1 lws-main [.] __timedwait_cp - -
+ 0.00% 1 lws-main [k] __tlb_remove_page_size - -
+ 0.00% 1 lws-main [k] __virt_addr_valid - -
+ 0.00% 1 lws-main [k] __vm_enough_memory - -
+ 0.00% 1 lws-main [.] __vm_wait - -
+ 0.00% 1 lws-main [k] __wake_up_sync_key - -
+ 0.00% 1 lws-main [k] __x64_sys_fdatasync - -
+ 0.00% 1 lws-main [k] __x86_indirect_thunk_r14 - -
+ 0.00% 1 lws-main [k] __x86_indirect_thunk_rcx - -
+ 0.00% 1 lws-main [k] __x86_indirect_thunk_rdx - -
+ 0.00% 1 lws-main [k] _find_first_and_bit - -
+ 0.00% 1 lws-main [k] _raw_read_lock - -
+ 0.00% 1 lws-main [k] _raw_spin_rq_lock_irqsave - -
+ 0.00% 1 lws-main [.] accessPayload - -
+ 0.00% 1 lws-main [.] add_subscription_to_kind_index - -
+ 0.00% 1 lws-main [k] add_wait_queue - -
+ 0.00% 1 lws-main [k] alloc_skb_with_frags - -
+ 0.00% 1 lws-main [k] apparmor_current_getlsmblob_subj - -
+ 0.00% 1 lws-main [k] apparmor_socket_recvmsg - -
+ 0.00% 1 lws-main [k] apparmor_socket_sock_rcv_skb - -
+ 0.00% 1 lws-main [.] bindText - -
+ 0.00% 1 lws-main [k] bio_associate_blkg - -
+ 0.00% 1 lws-main [k] bio_associate_blkg_from_css - -
+ 0.00% 1 lws-main [k] bio_integrity_prep - -
+ 0.00% 1 lws-main [k] bio_split_rw - -
+ 0.00% 1 lws-main [k] bit_waitqueue - -
+ 0.00% 1 lws-main [k] blk_add_timer - -
+ 0.00% 1 lws-main [k] blk_insert_flush - -
+ 0.00% 1 lws-main [k] blk_mq_flush_plug_list - -
+ 0.00% 1 lws-main [k] blk_mq_get_budget_and_tag - -
+ 0.00% 1 lws-main [k] blk_mq_sched_bio_merge - -
+ 0.00% 1 lws-main [k] blk_mq_start_request - -
+ 0.00% 1 lws-main [k] blk_rq_merge_ok - -
+ 0.00% 1 lws-main [k] blkcg_maybe_throttle_current - -
+ 0.00% 1 lws-main [.] btreeCursor - -
+ 0.00% 1 lws-main [.] btreeGetPage - -
+ 0.00% 1 lws-main [.] btreeOverwriteOverflowCell - -
+ 0.00% 1 lws-main [.] cJSON_CreateNumber - -
+ 0.00% 1 lws-main [.] cJSON_CreateObject - -
+ 0.00% 1 lws-main [.] cJSON_CreateString - -
+ 0.00% 1 lws-main [.] cJSON_IsArray - -
+ 0.00% 1 lws-main [.] cJSON_Parse - -
+ 0.00% 1 lws-main [k] call_rcu - -
+ 0.00% 1 lws-main [.] calloc - -
+ 0.00% 1 lws-main [k] can_vma_merge_after - -
+ 0.00% 1 lws-main [k] check_sq_full_and_disable.isra.0 - -
+ 0.00% 1 lws-main [.] columnTypeImpl - -
+ 0.00% 1 lws-main [k] consume_obj_stock - -
+ 0.00% 1 lws-main [.] create_subscription - -
+ 0.00% 1 lws-main [.] create_subscription_filter - -
+ 0.00% 1 lws-main [k] cubictcp_cwnd_event - -
+ 0.00% 1 lws-main [k] datagram_poll - -
+ 0.00% 1 lws-main [.] dbReallocFinish - -
+ 0.00% 1 lws-main [.] db_get_config_value_dup - -
+ 0.00% 1 lws-main [k] dequeue_skb - -
+ 0.00% 1 lws-main [k] destroy_large_folio - -
+ 0.00% 1 lws-main [k] do_poll.constprop.0 - -
+ 0.00% 1 lws-main [k] do_softirq.part.0 - -
+ 0.00% 1 lws-main [k] down_write_killable - -
+ 0.00% 1 lws-main [k] errseq_check - -
+ 0.00% 1 lws-main [.] event_matches_filter - -
+ 0.00% 1 lws-main [k] eventfd_poll - -
+ 0.00% 1 lws-main [.] exprAnalyze - -
+ 0.00% 1 lws-main [.] exprINAffinity.isra.0 - -
+ 0.00% 1 lws-main [.] exprIdxCover - -
+ 0.00% 1 lws-main [k] ext4_da_map_blocks.constprop.0 - -
+ 0.00% 1 lws-main [k] ext4_file_write_iter - -
+ 0.00% 1 lws-main [k] ext4_inode_csum - -
+ 0.00% 1 lws-main [k] file_close_fd - -
+ 0.00% 1 lws-main [k] find_exception - -
+ 0.00% 1 lws-main [.] fmodl - -
+ 0.00% 1 lws-main [k] folio_add_lru_vma - -
+ 0.00% 1 lws-main [k] folio_alloc - -
+ 0.00% 1 lws-main [k] folio_memcg_unlock - -
+ 0.00% 1 lws-main [k] folio_prep_large_rmappable - -
+ 0.00% 1 lws-main [k] folio_wait_bit_common - -
+ 0.00% 1 lws-main [.] freeSpace - -
+ 0.00% 1 lws-main [k] free_old_xmit_skbs - -
+ 0.00% 1 lws-main [k] free_pages_and_swap_cache - -
+ 0.00% 1 lws-main [k] free_pgtables - -
+ 0.00% 1 lws-main [k] free_swap_cache - -
+ 0.00% 1 lws-main [.] generate_monitoring_event_for_type - -
+ 0.00% 1 lws-main [k] generic_write_check_limits - -
+ 0.00% 1 lws-main [k] generic_write_checks - -
+ 0.00% 1 lws-main [k] get_futex_key - -
+ 0.00% 1 lws-main [k] get_mmap_base - -
+ 0.00% 1 lws-main [k] get_unique_tuple - -
+ 0.00% 1 lws-main [.] gettimeofday - -
+ 0.00% 1 lws-main [k] gro_list_prepare - -
+ 0.00% 1 lws-main [.] growOp3 - -
+ 0.00% 1 lws-main [.] growOpArray.isra.0 - -
+ 0.00% 1 lws-main [k] hugetlb_total_pages - -
+ 0.00% 1 lws-main [k] hystart_update - -
+ 0.00% 1 lws-main [k] import_iovec - -
+ 0.00% 1 lws-main [k] init_timer_key - -
+ 0.00% 1 lws-main [.] ip_ban_cleanup - -
+ 0.00% 1 lws-main [k] ip_build_and_send_pkt - -
+ 0.00% 1 lws-main [k] ip_local_deliver - -
+ 0.00% 1 lws-main [k] ip_local_deliver_finish - -
+ 0.00% 1 lws-main [k] ip_mc_drop_socket - -
+ 0.00% 1 lws-main [k] ip_queue_xmit - -
+ 0.00% 1 lws-main [k] ip_route_input_slow - -
+ 0.00% 1 lws-main [k] ip_send_check - -
+ 0.00% 1 lws-main [k] ip_setup_cork.constprop.0 - -
+ 0.00% 1 lws-main [k] ipv4_conntrack_in - -
+ 0.00% 1 lws-main [k] ipv4_mtu - -
+ 0.00% 1 lws-main [k] ipv6_raw_deliver - -
+ 0.00% 1 lws-main [k] irq_get_next_irq - -
+ 0.00% 1 lws-main [k] jbd2_journal_dirty_metadata - -
+ 0.00% 1 lws-main [k] jbd2_journal_stop - -
+ 0.00% 1 lws-main [k] jbd2_write_access_granted - -
+ 0.00% 1 lws-main [k] khugepaged_enter_vma - -
+ 0.00% 1 lws-main [k] kmalloc_reserve - -
+ 0.00% 1 lws-main [k] kmalloc_trace - -
+ 0.00% 1 lws-main [k] l3mdev_fib_table_rcu - -
+ 0.00% 1 lws-main [.] log_subscription_created.part.0 - -
+ 0.00% 1 lws-main [k] lru_gen_refault - -
+ 0.00% 1 lws-main [.] lws_add_http_header_by_token - -
+ 0.00% 1 lws-main [.] lws_buflist_next_segment_len - -
+ 0.00% 1 lws-main [.] lws_dll2_is_detached - -
+ 0.00% 1 lws-main [.] lws_dll2_remove - -
+ 0.00% 1 lws-main [.] lws_handshake_server - -
+ 0.00% 1 lws-main [.] lws_service_flag_pending - -
+ 0.00% 1 lws-main [k] make_kuid - -
+ 0.00% 1 lws-main [k] mas_next - -
+ 0.00% 1 lws-main [k] mas_node_count_gfp - -
+ 0.00% 1 lws-main [k] mas_prev_setup.constprop.0 - -
+ 0.00% 1 lws-main [k] mas_prev_slot - -
+ 0.00% 1 lws-main [k] mas_split.isra.0 - -
+ 0.00% 1 lws-main [k] mas_topiary_replace - -
+ 0.00% 1 lws-main [k] mas_wr_append - -
+ 0.00% 1 lws-main [k] mas_wr_end_piv - -
+ 0.00% 1 lws-main [k] mas_wr_store_setup.isra.0 - -
+ 0.00% 1 lws-main [k] mast_fill_bnode - -
+ 0.00% 1 lws-main [.] memmove - -
+ 0.00% 1 lws-main [k] mm_counter - -
+ 0.00% 1 lws-main [k] mmap_region - -
+ 0.00% 1 lws-main [.] monitoring_on_subscription_change - -
+ 0.00% 1 lws-main [k] mpage_prepare_extent_to_map - -
+ 0.00% 1 lws-main [k] mremap_userfaultfd_complete - -
+ 0.00% 1 lws-main [k] mtree_load - -
+ 0.00% 1 lws-main [k] napi_consume_skb - -
+ 0.00% 1 lws-main [k] napi_skb_cache_get - -
+ 0.00% 1 lws-main [k] nf_checksum - -
+ 0.00% 1 lws-main [k] nf_conntrack_handle_packet - -
+ 0.00% 1 lws-main [k] nf_conntrack_icmp_packet - -
+ 0.00% 1 lws-main [k] nf_conntrack_in - -
+ 0.00% 1 lws-main [k] nf_conntrack_tuple_taken - -
+ 0.00% 1 lws-main [k] nf_ct_invert_tuple - -
+ 0.00% 1 lws-main [k] nf_nat_ipv4_local_fn - -
+ 0.00% 1 lws-main [k] nft_match_eval - -
+ 0.00% 1 lws-main [k] nft_nat_do_chain - -
+ 0.00% 1 lws-main [.] nostr_create_and_sign_event - -
+ 0.00% 1 lws-main [.] nostr_secp256k1_ec_seckey_verify - -
+ 0.00% 1 lws-main [k] obj_cgroup_charge - -
+ 0.00% 1 lws-main [.] pageInsertArray - -
+ 0.00% 1 lws-main [k] page_counter_try_charge - -
+ 0.00% 1 lws-main [k] page_counter_uncharge - -
+ 0.00% 1 lws-main [.] pagerPagecount - -
+ 0.00% 1 lws-main [.] pager_unlock - -
+ 0.00% 1 lws-main [k] passthru_features_check - -
+ 0.00% 1 lws-main [.] pcache1EnforceMaxPage - -
+ 0.00% 1 lws-main [.] pcache1Free - -
+ 0.00% 1 lws-main [.] pcache1ResizeHash - -
+ 0.00% 1 lws-main [k] perf_event_mmap - -
+ 0.00% 1 lws-main [k] perf_event_mmap_event - -
+ 0.00% 1 lws-main [k] pmd_val - -
+ 0.00% 1 lws-main [k] poll_freewait - -
+ 0.00% 1 lws-main [.] print.constprop.0 - -
+ 0.00% 1 lws-main [.] process_message_queue - -
+ 0.00% 1 lws-main [k] propagate_protected_usage - -
+ 0.00% 1 lws-main [k] pte_offset_map_nolock - -
+ 0.00% 1 lws-main [k] pud_val - -
+ 0.00% 1 lws-main [k] put_dec - -
+ 0.00% 1 lws-main [k] put_dec_trunc8 - -
+ 0.00% 1 lws-main [k] qdisc_pkt_len_init - -
+ 0.00% 1 lws-main [.] querySharedCacheTableLock - -
+ 0.00% 1 lws-main [k] rcu_cblist_dequeue - -
+ 0.00% 1 lws-main [k] rcu_core_si - -
+ 0.00% 1 lws-main [k] rebalance_domains - -
+ 0.00% 1 lws-main [k] refill_obj_stock - -
+ 0.00% 1 lws-main [k] remove_vma - -
+ 0.00% 1 lws-main [.] req_filter_requests_config_events - -
+ 0.00% 1 lws-main [.] rops_callback_on_writable_ws - -
+ 0.00% 1 lws-main [.] rops_handle_POLLIN_listen - -
+ 0.00% 1 lws-main [.] rops_service_flag_pending_ws - -
+ 0.00% 1 lws-main [.] rops_write_role_protocol_ws - -
+ 0.00% 1 lws-main [k] rq_qos_wait - -
+ 0.00% 1 lws-main [k] rq_wait_inc_below - -
+ 0.00% 1 lws-main [k] run_timer_softirq - -
+ 0.00% 1 lws-main [k] rwsem_optimistic_spin - -
+ 0.00% 1 lws-main [k] rwsem_spin_on_owner - -
+ 0.00% 1 lws-main [k] sch_direct_xmit - -
+ 0.00% 1 lws-main [k] schedule_debug.isra.0 - -
+ 0.00% 1 lws-main [k] schedule_hrtimeout_range_clock - -
+ 0.00% 1 lws-main [k] scsi_initialize_rq - -
+ 0.00% 1 lws-main [k] scsi_queue_rq - -
+ 0.00% 1 lws-main [k] scsi_target_queue_ready - -
+ 0.00% 1 lws-main [k] sd_init_command - -
+ 0.00% 1 lws-main [.] secp256k1_fe_impl_normalizes_to_zero - -
+ 0.00% 1 lws-main [.] secp256k1_ge_from_storage - -
+ 0.00% 1 lws-main [.] secp256k1_schnorrsig_sign32 - -
+ 0.00% 1 lws-main [k] secure_tcp_seq - -
+ 0.00% 1 lws-main [k] security_file_truncate - -
+ 0.00% 1 lws-main [k] security_mmap_file - -
+ 0.00% 1 lws-main [k] security_sock_rcv_skb - -
+ 0.00% 1 lws-main [k] security_socket_recvmsg - -
+ 0.00% 1 lws-main [k] security_vm_enough_memory_mm - -
+ 0.00% 1 lws-main [.] selectAddSubqueryTypeInfo - -
+ 0.00% 1 lws-main [.] selectExpander - -
+ 0.00% 1 lws-main [k] seq_putc - -
+ 0.00% 1 lws-main [k] set_pte_range - -
+ 0.00% 1 lws-main [k] set_root - -
+ 0.00% 1 lws-main [.] setsockopt - -
+ 0.00% 1 lws-main [k] sg_alloc_table_chained - -
+ 0.00% 1 lws-main [k] sg_pool_alloc - -
+ 0.00% 1 lws-main [k] sk_clone_lock - -
+ 0.00% 1 lws-main [k] sk_filter_trim_cap - -
+ 0.00% 1 lws-main [k] sk_leave_memory_pressure - -
+ 0.00% 1 lws-main [k] sk_reset_timer - -
+ 0.00% 1 lws-main [k] sk_stream_write_space - -
+ 0.00% 1 lws-main [k] skb_copy_bits - -
+ 0.00% 1 lws-main [k] skb_defer_rx_timestamp - -
+ 0.00% 1 lws-main [k] skb_page_frag_refill - -
+ 0.00% 1 lws-main [k] skb_push - -
+ 0.00% 1 lws-main [k] skb_put - -
+ 0.00% 1 lws-main [k] slab_update_freelist.isra.0 - -
+ 0.00% 1 lws-main [k] sock_def_readable - -
+ 0.00% 1 lws-main [k] sock_write_iter - -
+ 0.00% 1 lws-main [.] sqlite3BitvecDestroy - -
+ 0.00% 1 lws-main [.] sqlite3BlobCompare - -
+ 0.00% 1 lws-main [.] sqlite3BtreeCount - -
+ 0.00% 1 lws-main [.] sqlite3CodeRhsOfIN - -
+ 0.00% 1 lws-main [.] sqlite3CompleteInsertion - -
+ 0.00% 1 lws-main [.] sqlite3ConnectionUnlocked - -
+ 0.00% 1 lws-main [.] sqlite3DbFreeNN - -
+ 0.00% 1 lws-main [.] sqlite3Dequote - -
+ 0.00% 1 lws-main [.] sqlite3ExprCanBeNull - -
+ 0.00% 1 lws-main [.] sqlite3ExprCode.part.0 - -
+ 0.00% 1 lws-main [.] sqlite3ExprCodeIN - -
+ 0.00% 1 lws-main [.] sqlite3ExprCodeRunJustOnce - -
+ 0.00% 1 lws-main [.] sqlite3ExprColUsed.isra.0 - -
+ 0.00% 1 lws-main [.] sqlite3ExprIfFalse - -
+ 0.00% 1 lws-main [.] sqlite3ExprListAppend - -
+ 0.00% 1 lws-main [.] sqlite3ExprNeedsNoAffinityChange - -
+ 0.00% 1 lws-main [.] sqlite3FindFunction - -
+ 0.00% 1 lws-main [.] sqlite3FinishCoding - -
+ 0.00% 1 lws-main [.] sqlite3GenerateConstraintChecks - -
+ 0.00% 1 lws-main [.] sqlite3IsReadOnly - -
+ 0.00% 1 lws-main [.] sqlite3OpenTable - -
+ 0.00% 1 lws-main [.] sqlite3PagerClose.isra.0 - -
+ 0.00% 1 lws-main [.] sqlite3PagerCommitPhaseOne.part.0 - -
+ 0.00% 1 lws-main [.] sqlite3PagerSharedLock - -
+ 0.00% 1 lws-main [.] sqlite3PagerWrite - -
+ 0.00% 1 lws-main [.] sqlite3PcacheMakeClean - -
+ 0.00% 1 lws-main [.] sqlite3PcacheSetPageSize - -
+ 0.00% 1 lws-main [.] sqlite3Prepare - -
+ 0.00% 1 lws-main [.] sqlite3SelectNew - -
+ 0.00% 1 lws-main [.] sqlite3SrcListAppend - -
+ 0.00% 1 lws-main [.] sqlite3SrcListDelete - -
+ 0.00% 1 lws-main [.] sqlite3TriggerColmask - -
+ 0.00% 1 lws-main [.] sqlite3VdbeAddOp3 - -
+ 0.00% 1 lws-main [.] sqlite3VdbeAddOp4Int - -
+ 0.00% 1 lws-main [.] sqlite3VdbeDelete - -
+ 0.00% 1 lws-main [.] sqlite3VdbeMakeReady - -
+ 0.00% 1 lws-main [.] sqlite3VdbeReset - -
+ 0.00% 1 lws-main [.] sqlite3WalCheckpoint - -
+ 0.00% 1 lws-main [.] sqlite3WalkSelect - -
+ 0.00% 1 lws-main [.] sqlite3WhereEnd - -
+ 0.00% 1 lws-main [.] sqlite3WhereSplit - -
+ 0.00% 1 lws-main [.] sqlite3_free - -
+ 0.00% 1 lws-main [.] sqlite3_prepare_v2 - -
+ 0.00% 1 lws-main [.] sqlite3_str_appendf - -
+ 0.00% 1 lws-main [.] start_websocket_relay - -
+ 0.00% 1 lws-main [.] strftimeFunc - -
+ 0.00% 1 lws-main [.] strtok - -
+ 0.00% 1 lws-main [k] submit_bio - -
+ 0.00% 1 lws-main [k] submit_bio_noacct - -
+ 0.00% 1 lws-main [.] sumStep - -
+ 0.00% 1 lws-main [k] task_state - -
+ 0.00% 1 lws-main [k] tasklet_action - -
+ 0.00% 1 lws-main [k] tcp4_gro_receive - -
+ 0.00% 1 lws-main [k] tcp_check_sack_reordering - -
+ 0.00% 1 lws-main [k] tcp_cleanup_congestion_control - -
+ 0.00% 1 lws-main [k] tcp_cong_avoid_ai - -
+ 0.00% 1 lws-main [k] tcp_current_mss - -
+ 0.00% 1 lws-main [k] tcp_cwnd_validate - -
+ 0.00% 1 lws-main [k] tcp_data_queue - -
+ 0.00% 1 lws-main [k] tcp_delack_max - -
+ 0.00% 1 lws-main [k] tcp_established_options - -
+ 0.00% 1 lws-main [k] tcp_fastretrans_alert - -
+ 0.00% 1 lws-main [k] tcp_filter - -
+ 0.00% 1 lws-main [k] tcp_newly_delivered - -
+ 0.00% 1 lws-main [k] tcp_orphan_update - -
+ 0.00% 1 lws-main [k] tcp_queue_rcv - -
+ 0.00% 1 lws-main [k] tcp_rack_advance - -
+ 0.00% 1 lws-main [k] tcp_rate_skb_delivered - -
+ 0.00% 1 lws-main [k] tcp_schedule_loss_probe - -
+ 0.00% 1 lws-main [k] tcp_schedule_loss_probe.part.0 - -
+ 0.00% 1 lws-main [k] tcp_select_initial_window - -
+ 0.00% 1 lws-main [k] tcp_sendmsg_locked - -
+ 0.00% 1 lws-main [k] tcp_shift_skb_data - -
+ 0.00% 1 lws-main [k] tcp_sndbuf_expand - -
+ 0.00% 1 lws-main [k] tcp_trim_head - -
+ 0.00% 1 lws-main [k] tcp_try_coalesce - -
+ 0.00% 1 lws-main [k] tcp_tsq_handler - -
+ 0.00% 1 lws-main [k] tcp_urg - -
+ 0.00% 1 lws-main [k] tcp_v4_send_check - -
+ 0.00% 1 lws-main [k] tcp_v4_send_synack - -
+ 0.00% 1 lws-main [.] termCanDriveIndex - -
+ 0.00% 1 lws-main [k] tlb_finish_mmu - -
+ 0.00% 1 lws-main [.] tokenExpr - -
+ 0.00% 1 lws-main [.] tops_fake_POLLIN_for_buffered_openssl - -
+ 0.00% 1 lws-main [k] try_fill_recv - -
+ 0.00% 1 lws-main [.] unixCurrentTimeInt64 - -
+ 0.00% 1 lws-main [.] unixFetch - -
+ 0.00% 1 lws-main [.] unixFileControl - -
+ 0.00% 1 lws-main [.] unixShmBarrier - -
+ 0.00% 1 lws-main [.] unixWrite - -
+ 0.00% 1 lws-main [k] unlink_anon_vmas - -
+ 0.00% 1 lws-main [k] unmap_vmas - -
+ 0.00% 1 lws-main [k] update_sd_lb_stats.constprop.0 - -
+ 0.00% 1 lws-main [k] userfaultfd_unmap_complete - -
+ 0.00% 1 lws-main [.] validate_subscription_id - -
+ 0.00% 1 lws-main [k] validate_xmit_xfrm - -
+ 0.00% 1 lws-main [.] vdbeMemClear - -
+ 0.00% 1 lws-main [k] vfs_writev - -
+ 0.00% 1 lws-main [k] virtnet_receive.constprop.0 - -
+ 0.00% 1 lws-main [k] virtnet_rq_get_buf - -
+ 0.00% 1 lws-main [k] virtqueue_disable_cb - -
+ 0.00% 1 lws-main [k] virtqueue_notify - -
+ 0.00% 1 lws-main [k] virtqueue_poll - -
+ 0.00% 1 lws-main [k] virtscsi_add_cmd - -
+ 0.00% 1 lws-main [k] virtscsi_queuecommand - -
+ 0.00% 1 lws-main [k] vm_area_free_rcu_cb - -
+ 0.00% 1 lws-main [k] vm_get_page_prot - -
+ 0.00% 1 lws-main [k] vma_complete - -
+ 0.00% 1 lws-main [k] vma_dup_policy - -
+ 0.00% 1 lws-main [k] vma_expand - -
+ 0.00% 1 lws-main [k] vp_notify - -
+ 0.00% 1 lws-main [k] vring_map_one_sg - -
+ 0.00% 1 lws-main [.] vsprintf - -
+ 0.00% 1 lws-main [.] walIndexWriteHdr - -
+ 0.00% 1 lws-main [k] wbc_account_cgroup_owner - -
+ 0.00% 1 lws-main [.] whereClauseInsert - -
+ 0.00% 1 lws-main [.] whereLoopFindLesser - -
+ 0.00% 1 lws-main [.] whereLoopInsert - -
+ 0.00% 1 lws-main [.] whereLoopOutputAdjust - -
+ 0.00% 1 lws-main [k] xa_load - -
+ 0.00% 1 lws-main [k] xfrm_lookup_with_ifid - -
+ 0.00% 1 lws-main [.] 0x0000000000000ab1 - -
+ 0.00% 1 lws-main [.] 0x0000000000000c4e - -
+ 0.00% 1 lws-main [.] 0x0000000000000c6c - -
+ 0.00% 1 lws-main [k] 0x000000000000bb2a - -
+
+
+#
+# (Cannot load tips.txt file, please install perf!)
+#
diff --git a/thread_profile_runs/20260401_193216/run.log b/thread_profile_runs/20260401_193216/run.log
new file mode 100644
index 0000000..52a69e4
--- /dev/null
+++ b/thread_profile_runs/20260401_193216/run.log
@@ -0,0 +1,5 @@
+Profiling PID: 2115498
+CLK_TCK=100
+Starting perf record in background...
+perf_pid=2116380
+Done. Artifacts in /tmp/c_relay_thread_profile_20260401_193216
diff --git a/thread_profile_runs/20260401_193216/thread_samples.csv b/thread_profile_runs/20260401_193216/thread_samples.csv
new file mode 100644
index 0000000..dbb43a6
--- /dev/null
+++ b/thread_profile_runs/20260401_193216/thread_samples.csv
@@ -0,0 +1,211 @@
+timestamp,tid,thread_name,cpu_pct,delta_ticks,total_ticks
+1775071937,2115498,lws-main,0.00,0,2521
+1775071937,2115501,db-read-1,0.00,0,9
+1775071937,2115502,db-read-2,0.00,0,10
+1775071937,2115503,db-read-3,0.00,0,9
+1775071937,2115504,db-read-4,0.00,0,9
+1775071937,2115505,db-write,0.00,0,0
+1775071937,2115506,event-worker,0.00,0,0
+1775071947,2115498,lws-main,0.10,1,2522
+1775071947,2115501,db-read-1,0.10,1,10
+1775071947,2115502,db-read-2,0.00,0,10
+1775071947,2115503,db-read-3,0.00,0,9
+1775071947,2115504,db-read-4,0.30,3,12
+1775071947,2115505,db-write,0.00,0,0
+1775071947,2115506,event-worker,0.00,0,0
+1775071957,2115498,lws-main,26.80,268,2790
+1775071957,2115501,db-read-1,0.00,0,10
+1775071957,2115502,db-read-2,0.10,1,11
+1775071957,2115503,db-read-3,0.00,0,9
+1775071957,2115504,db-read-4,0.00,0,12
+1775071957,2115505,db-write,0.00,0,0
+1775071957,2115506,event-worker,0.00,0,0
+1775071967,2115498,lws-main,72.10,721,3511
+1775071967,2115501,db-read-1,0.00,0,10
+1775071967,2115502,db-read-2,0.00,0,11
+1775071967,2115503,db-read-3,0.00,0,9
+1775071967,2115504,db-read-4,0.00,0,12
+1775071967,2115505,db-write,0.00,0,0
+1775071967,2115506,event-worker,0.00,0,0
+1775071977,2115498,lws-main,64.40,644,4155
+1775071977,2115501,db-read-1,0.20,2,12
+1775071977,2115502,db-read-2,0.10,1,12
+1775071977,2115503,db-read-3,0.10,1,10
+1775071977,2115504,db-read-4,0.20,2,14
+1775071977,2115505,db-write,0.00,0,0
+1775071977,2115506,event-worker,0.00,0,0
+1775071987,2115498,lws-main,42.60,426,4581
+1775071987,2115501,db-read-1,0.10,1,13
+1775071987,2115502,db-read-2,0.10,1,13
+1775071987,2115503,db-read-3,0.10,1,11
+1775071987,2115504,db-read-4,0.00,0,14
+1775071987,2115505,db-write,0.00,0,0
+1775071987,2115506,event-worker,0.00,0,0
+1775071997,2115498,lws-main,7.20,72,4653
+1775071997,2115501,db-read-1,0.00,0,13
+1775071997,2115502,db-read-2,0.00,0,13
+1775071997,2115503,db-read-3,0.00,0,11
+1775071997,2115504,db-read-4,0.00,0,14
+1775071997,2115505,db-write,0.00,0,0
+1775071997,2115506,event-worker,0.00,0,0
+1775072007,2115498,lws-main,42.90,429,5082
+1775072007,2115501,db-read-1,0.00,0,13
+1775072007,2115502,db-read-2,0.00,0,13
+1775072007,2115503,db-read-3,0.00,0,11
+1775072007,2115504,db-read-4,0.00,0,14
+1775072007,2115505,db-write,0.00,0,0
+1775072007,2115506,event-worker,0.00,0,0
+1775072017,2115498,lws-main,38.10,381,5463
+1775072017,2115501,db-read-1,0.10,1,14
+1775072017,2115502,db-read-2,0.20,2,15
+1775072017,2115503,db-read-3,0.40,4,15
+1775072017,2115504,db-read-4,0.10,1,15
+1775072017,2115505,db-write,0.00,0,0
+1775072017,2115506,event-worker,0.00,0,0
+1775072027,2115498,lws-main,93.20,932,6395
+1775072027,2115501,db-read-1,0.40,4,18
+1775072027,2115502,db-read-2,0.40,4,19
+1775072027,2115503,db-read-3,0.00,0,15
+1775072027,2115504,db-read-4,0.10,1,16
+1775072027,2115505,db-write,0.00,0,0
+1775072027,2115506,event-worker,0.00,0,0
+1775072037,2115498,lws-main,95.10,951,7346
+1775072037,2115501,db-read-1,0.10,1,19
+1775072037,2115502,db-read-2,0.20,2,21
+1775072037,2115503,db-read-3,0.30,3,18
+1775072037,2115504,db-read-4,0.00,0,16
+1775072037,2115505,db-write,0.10,1,1
+1775072037,2115506,event-worker,0.00,0,0
+1775072047,2115498,lws-main,65.00,650,7996
+1775072047,2115501,db-read-1,0.00,0,19
+1775072047,2115502,db-read-2,0.00,0,21
+1775072047,2115503,db-read-3,0.10,1,19
+1775072047,2115504,db-read-4,0.10,1,17
+1775072047,2115505,db-write,0.00,0,1
+1775072047,2115506,event-worker,0.00,0,0
+1775072057,2115498,lws-main,62.80,628,8624
+1775072057,2115501,db-read-1,0.00,0,19
+1775072057,2115502,db-read-2,0.00,0,21
+1775072057,2115503,db-read-3,0.00,0,19
+1775072057,2115504,db-read-4,0.10,1,18
+1775072057,2115505,db-write,0.00,0,1
+1775072057,2115506,event-worker,0.00,0,0
+1775072068,2115498,lws-main,20.80,208,8832
+1775072068,2115501,db-read-1,0.10,1,20
+1775072068,2115502,db-read-2,0.00,0,21
+1775072068,2115503,db-read-3,0.00,0,19
+1775072068,2115504,db-read-4,0.00,0,18
+1775072068,2115505,db-write,0.00,0,1
+1775072068,2115506,event-worker,0.00,0,0
+1775072078,2115498,lws-main,52.30,523,9355
+1775072078,2115501,db-read-1,0.10,1,21
+1775072078,2115502,db-read-2,0.50,5,26
+1775072078,2115503,db-read-3,0.10,1,20
+1775072078,2115504,db-read-4,0.10,1,19
+1775072078,2115505,db-write,0.00,0,1
+1775072078,2115506,event-worker,0.00,0,0
+1775072088,2115498,lws-main,33.40,334,9689
+1775072088,2115501,db-read-1,0.10,1,22
+1775072088,2115502,db-read-2,0.30,3,29
+1775072088,2115503,db-read-3,0.10,1,21
+1775072088,2115504,db-read-4,0.10,1,20
+1775072088,2115505,db-write,0.00,0,1
+1775072088,2115506,event-worker,0.00,0,0
+1775072098,2115498,lws-main,75.30,753,10442
+1775072098,2115501,db-read-1,0.00,0,22
+1775072098,2115502,db-read-2,0.00,0,29
+1775072098,2115503,db-read-3,0.00,0,21
+1775072098,2115504,db-read-4,0.00,0,20
+1775072098,2115505,db-write,0.00,0,1
+1775072098,2115506,event-worker,0.00,0,0
+1775072108,2115498,lws-main,100.20,1002,11444
+1775072108,2115501,db-read-1,0.00,0,22
+1775072108,2115502,db-read-2,0.00,0,29
+1775072108,2115503,db-read-3,0.10,1,22
+1775072108,2115504,db-read-4,0.00,0,20
+1775072108,2115505,db-write,0.00,0,1
+1775072108,2115506,event-worker,0.00,0,0
+1775072118,2115498,lws-main,78.40,784,12228
+1775072118,2115501,db-read-1,0.00,0,22
+1775072118,2115502,db-read-2,0.10,1,30
+1775072118,2115503,db-read-3,0.00,0,22
+1775072118,2115504,db-read-4,0.00,0,20
+1775072118,2115505,db-write,0.00,0,1
+1775072118,2115506,event-worker,0.00,0,0
+1775072128,2115498,lws-main,27.80,278,12506
+1775072128,2115501,db-read-1,0.00,0,22
+1775072128,2115502,db-read-2,0.00,0,30
+1775072128,2115503,db-read-3,0.00,0,22
+1775072128,2115504,db-read-4,0.10,1,21
+1775072128,2115505,db-write,0.00,0,1
+1775072128,2115506,event-worker,0.00,0,0
+1775072138,2115498,lws-main,65.80,658,13164
+1775072138,2115501,db-read-1,0.40,4,26
+1775072138,2115502,db-read-2,0.30,3,33
+1775072138,2115503,db-read-3,0.20,2,24
+1775072138,2115504,db-read-4,0.30,3,24
+1775072138,2115505,db-write,0.00,0,1
+1775072138,2115506,event-worker,0.00,0,0
+1775072148,2115498,lws-main,30.70,307,13471
+1775072148,2115501,db-read-1,0.00,0,26
+1775072148,2115502,db-read-2,0.00,0,33
+1775072148,2115503,db-read-3,0.00,0,24
+1775072148,2115504,db-read-4,0.10,1,25
+1775072148,2115505,db-write,0.00,0,1
+1775072148,2115506,event-worker,0.00,0,0
+1775072158,2115498,lws-main,68.80,688,14159
+1775072158,2115501,db-read-1,0.40,4,30
+1775072158,2115502,db-read-2,0.30,3,36
+1775072158,2115503,db-read-3,0.10,1,25
+1775072158,2115504,db-read-4,0.20,2,27
+1775072158,2115505,db-write,0.00,0,1
+1775072158,2115506,event-worker,0.00,0,0
+1775072168,2115498,lws-main,38.20,382,14541
+1775072168,2115501,db-read-1,0.00,0,30
+1775072168,2115502,db-read-2,0.00,0,36
+1775072168,2115503,db-read-3,0.00,0,25
+1775072168,2115504,db-read-4,0.00,0,27
+1775072168,2115505,db-write,0.00,0,1
+1775072168,2115506,event-worker,0.00,0,0
+1775072178,2115498,lws-main,52.20,522,15063
+1775072178,2115501,db-read-1,0.10,1,31
+1775072178,2115502,db-read-2,0.10,1,37
+1775072178,2115503,db-read-3,0.20,2,27
+1775072178,2115504,db-read-4,0.30,3,30
+1775072178,2115505,db-write,0.00,0,1
+1775072178,2115506,event-worker,0.00,0,0
+1775072188,2115498,lws-main,78.30,783,15846
+1775072188,2115501,db-read-1,0.10,1,32
+1775072188,2115502,db-read-2,0.10,1,38
+1775072188,2115503,db-read-3,0.00,0,27
+1775072188,2115504,db-read-4,0.10,1,31
+1775072188,2115505,db-write,0.00,0,1
+1775072188,2115506,event-worker,0.00,0,0
+1775072198,2115498,lws-main,96.90,969,16815
+1775072198,2115501,db-read-1,0.10,1,33
+1775072198,2115502,db-read-2,0.00,0,38
+1775072198,2115503,db-read-3,0.10,1,28
+1775072198,2115504,db-read-4,0.10,1,32
+1775072198,2115505,db-write,0.00,0,1
+1775072198,2115506,event-worker,0.00,0,0
+1775072208,2115498,lws-main,87.80,878,17693
+1775072208,2115501,db-read-1,0.10,1,34
+1775072208,2115502,db-read-2,0.10,1,39
+1775072208,2115503,db-read-3,0.10,1,29
+1775072208,2115504,db-read-4,0.00,0,32
+1775072208,2115505,db-write,0.00,0,1
+1775072208,2115506,event-worker,0.00,0,0
+1775072218,2115498,lws-main,77.20,772,18465
+1775072218,2115501,db-read-1,0.00,0,34
+1775072218,2115502,db-read-2,0.10,1,40
+1775072218,2115503,db-read-3,0.10,1,30
+1775072218,2115504,db-read-4,0.00,0,32
+1775072218,2115505,db-write,0.00,0,1
+1775072218,2115506,event-worker,0.00,0,0
+1775072228,2115498,lws-main,21.70,217,18682
+1775072228,2115501,db-read-1,0.00,0,34
+1775072228,2115502,db-read-2,0.00,0,40
+1775072228,2115503,db-read-3,0.00,0,30
+1775072228,2115504,db-read-4,0.00,0,32
+1775072228,2115505,db-write,0.00,0,1
+1775072228,2115506,event-worker,0.00,0,0
diff --git a/thread_profile_runs/20260401_193216/thread_summary.txt b/thread_profile_runs/20260401_193216/thread_summary.txt
new file mode 100644
index 0000000..d2b4f54
--- /dev/null
+++ b/thread_profile_runs/20260401_193216/thread_summary.txt
@@ -0,0 +1,14 @@
+==========================================
+Thread CPU Summary (avg + max over run)
+==========================================
+Run timestamp (UTC): 20260401_193216
+Duration: 300s, Interval: 10s
+
+2115498 lws-main 53.87 100.20
+2115502 db-read-2 0.10 0.50
+2115501 db-read-1 0.08 0.40
+2115504 db-read-4 0.08 0.30
+2115503 db-read-3 0.07 0.40
+2115505 db-write 0.00 0.10
+2115506 event-worker 0.00 0.00
+TID THREAD AVG_CPU% MAX_CPU%