This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: pg17-aio-direct-io-memory-invariants-standard

PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants

Governs the allocation and execution limits for PostgreSQL 17 asynchronous I/O worker pools, direct-IO buffers, and parallel streaming query patterns. Enforces deterministic session-level resource boundaries and streaming backpressure during high-throughput vector index scans and parallel sequential scans to prevent kernel buffer bloat and system-terminating Out-Of-Memory (OOM) panics.

Prohibited Anti-Pattern: Unbounded concurrent parallel vector or sequential scans overwhelming io_uring queues and direct-IO ring buffers, triggering kernel OOM panics.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants - Governs the allocation and execution limits for PostgreSQL 17 asynchronous I/O worker pools, direct-IO buffers, and parallel streaming query patterns. Enforces deterministic session-level resource boundaries and streaming backpressure during high-throughput vector index scans and parallel sequential scans to prevent kernel buffer bloat and system-terminating Out-Of-Memory (OOM) panics.
globs: src/db/**/*.ts, src/repositories/**/*.ts, src/services/**/*.ts, infra/postgres/**/*.conf, migrations/**/*.sql
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/pg17-aio-direct-io-memory-invariants-standard"
---

# PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Unbounded concurrent parallel vector or sequential scans overwhelming io_uring queues and direct-IO ring buffers, triggering kernel OOM panics.

## System Constraints
You are a Principal Database Architect and Systems Engineer specializing in PostgreSQL 17 internal storage architectures, AIO subsystems (io_uring), and direct-IO memory safety. Your objective is to enforce strict invariants around parallel worker allocation, session memory caps, and prefetch streaming patterns to guarantee that high-throughput parallel sequential scans and vector searches do not exceed host memory allocations or cause kernel panic conditions.

## Strict Guidelines
- Engineers MUST ALWAYS compute session-level 'work_mem' and 'max_parallel_workers_per_gather' dynamically or clamp them explicitly before running high-throughput vector searches (HNSW/IVFFlat) and large sequential scans.
- Engineers MUST NOT allow unbounded pool connections to trigger simultaneous parallel vector scans that exceed the available io_uring queue depths and direct-IO memory budgets.
- Code SHOULD enforce transactional SET LOCAL overrides for parallel scan parameters instead of altering global server configuration when executing resource-intensive analytic or vector workloads.
- Services MUST implement cursor-based pagination or explicit async iterators with strict high-water-mark backpressure when streaming large result sets from tables operating under direct-IO/AIO.
- Components NEVER execute raw unbounded vector similarity queries across partitioned tables without limiting partition pruning or bounding parallel gather workers per query.

## Bad vs Good Implementations
### Unbounded Parallel Vector Search vs. Safe Budgeted AIO Worker Execution

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Executing concurrent queries with default parallel worker settings across a 50-connection pool allows the PostgreSQL 17 AIO engine to spawn up to pool.max * max_parallel_workers asynchronous direct-IO channels. In high-dimensional vector searches, this saturates io_uring registered ring buffers and kernel memory, triggering the Linux OOM killer.
```typescript
import { Pool } from 'pg';

const pool = new Pool({ max: 50 });

// ANTI-PATTERN: Concurrent unbounded parallel gather workers under PG17 AIO
// Under io_uring and Direct-IO, each worker pulls unbuffered direct pages simultaneously,
// rapidly exhausting kernel ring buffers and inducing host OOM panics during peak traffic.
export async function searchVectorEmbeddings(queryEmbedding: number[]): Promise<any[]> {
  const client = await pool.connect();
  try {
    const query = `
      SELECT id, document_chunk, embedding <=> $1::vector AS distance
      FROM document_vectors
      ORDER BY distance ASC
      LIMIT 100;
    `;
    const result = await client.query(query, [JSON.stringify(queryEmbedding)]);
    return result.rows;
  } finally {
    client.release();
  }
}
```

#### Production Standard (Correct)
> **Standard**: The fix isolates the query inside a read-only transaction and sets deterministic local bounds on 'max_parallel_workers_per_gather' and 'work_mem'. This guarantees that PostgreSQL 17 AIO workers cannot asynchronously monopolize Direct-IO queues, ensuring host stability under concurrent loads.
```typescript
import { Pool, PoolClient } from 'pg';

const pool = new Pool({ max: 20 });

interface VectorSearchOptions {
  maxParallelWorkers?: number;
  workMemMb?: number;
  limit?: number;
}

// PRODUCTION FIX: Explicitly bound per-transaction AIO parallel workers and session memory
export async function searchVectorEmbeddingsSafe(
  queryEmbedding: number[],
  options: VectorSearchOptions = {}
): Promise<any[]> {
  const { maxParallelWorkers = 2, workMemMb = 32, limit = 100 } = options;
  const client: PoolClient = await pool.connect();

  try {
    await client.query('BEGIN READ ONLY');
    
    // Invariant: Restrict parallel workers and memory per gather node to protect AIO queues
    await client.query('SET LOCAL max_parallel_workers_per_gather = $1', [maxParallelWorkers]);
    await client.query(`SET LOCAL work_mem = '${workMemMb}MB'`);

    const query = `
      SELECT id, document_chunk, embedding <=> $1::vector AS distance
      FROM document_vectors
      ORDER BY distance ASC
      LIMIT $2;
    `;
    const result = await client.query(query, [JSON.stringify(queryEmbedding), limit]);
    
    await client.query('COMMIT');
    return result.rows;
  } catch (err) {
    await client.query('ROLLBACK');
    throw err;
  } finally {
    client.release();
  }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants

PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants defines an industrial-grade behavioral standard for backend engineering. Governs the allocation and execution limits for PostgreSQL 17 asynchronous I/O worker pools, direct-IO buffers, and parallel streaming query patterns. Enforces deterministic session-level resource boundaries and streaming backpressure during high-throughput vector index scans and parallel sequential scans to prevent kernel buffer bloat and system-terminating Out-Of-Memory (OOM) panics. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Unbounded concurrent parallel vector or sequential scans overwhelming io_uring queues and direct-IO ring buffers, triggering kernel OOM panics. Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftUnbounded concurrent parallel vector or sequential scans overwhelming io_uring queues and direct-IO ring buffers, triggering kernel OOM panics.Critical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS compute session-level 'work_mem' and 'max_parallel_workers_per_gather' dynamically or clamp them explicitly before running high-throughput vector searches (HNSW/IVFFlat) and large sequential scans.

Engineers MUST ALWAYS compute session-level 'work_mem' and 'max_parallel_workers_per_gather' dynamically or clamp them explicitly before running high-throughput vector searches (HNSW/IVFFlat) and large sequential scans.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT allow unbounded pool connections to trigger simultaneous parallel vector scans that exceed the available io_uring queue depths and direct-IO memory budgets.

Engineers MUST NOT allow unbounded pool connections to trigger simultaneous parallel vector scans that exceed the available io_uring queue depths and direct-IO memory budgets.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Code SHOULD enforce transactional SET LOCAL overrides for parallel scan parameters instead of altering global server configuration when executing resource-intensive analytic or vector workloads.

Code SHOULD enforce transactional SET LOCAL overrides for parallel scan parameters instead of altering global server configuration when executing resource-intensive analytic or vector workloads.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Services MUST implement cursor-based pagination or explicit async iterators with strict high-water-mark backpressure when streaming large result sets from tables operating under direct-IO/AIO.

Services MUST implement cursor-based pagination or explicit async iterators with strict high-water-mark backpressure when streaming large result sets from tables operating under direct-IO/AIO.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Components NEVER execute raw unbounded vector similarity queries across partitioned tables without limiting partition pruning or bounding parallel gather workers per query.

Components NEVER execute raw unbounded vector similarity queries across partitioned tables without limiting partition pruning or bounding parallel gather workers per query.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is PostgreSQL 17 AIO and Direct-IO Subsystem Memory Invariants critical for AI coding assistants?

Governs the allocation and execution limits for PostgreSQL 17 asynchronous I/O worker pools, direct-IO buffers, and parallel streaming query patterns. Enforces deterministic session-level resource boundaries and streaming backpressure during high-throughput vector index scans and parallel sequential scans to prevent kernel buffer bloat and system-terminating Out-Of-Memory (OOM) panics. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Unbounded concurrent parallel vector or sequential scans overwhelming io_uring queues and direct-IO ring buffers, triggering kernel OOM panics.) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

PostgreSQL