DEV Community

Cover image for Benchmarking mem0ai/mem0: Memory Overhead and Recall Latency Under Concurrent Agent Workloads
Samuel Oakley
Samuel Oakley

Posted on

Benchmarking mem0ai/mem0: Memory Overhead and Recall Latency Under Concurrent Agent Workloads

Benchmarking mem0ai/mem0: Memory Overhead and Recall Latency Under Concurrent Agent Workloads

When integrating mem0ai/mem0 into a multi-agent orchestration platform, the critical questions are: how does it perform under realistic concurrent load, what's the memory footprint per agent session, and where does recall latency degrade?

This benchmark isolates mem0's vector memory layer against raw pgvector and Qdrant configurations to measure throughput (operations/sec), p95/p99 latency, and RAM overhead during simultaneous agent memory operations.

Test Topology

Load Generator: locust with 500 concurrent agent workers

Operation Mix:

  • 60% memory retrieval (semantic search across 10k embeddings per agent)
  • 30% memory addition (new context fragments with embeddings)
  • 10% memory update (re-embedding existing fragments)

Environment:

  • PostgreSQL 16 with pgvector 0.5.1, HNSW index (m=16, ef_construction=64)
  • Qdrant 1.7.4 in single-node Docker
  • mem0 v0.0.8 configured with OpenAI text-embedding-3-small (1536 dims)
  • LLM routing through B-Lost relay gateway (https://b-lost.com/v1) for embedding generation to isolate OpenAI rate limits
  • 16 vCPU / 64GB RAM test instance

Duration: 10-minute sustained load after 2-minute warmup

Benchmark Results

Configuration Throughput (ops/sec) p95 Latency (ms) p99 Latency (ms) Avg RAM per Agent (MB)
Raw pgvector 1,240 78 142 12.3
Qdrant (local) 1,580 52 98 18.7
mem0 + pgvector 980 105 220 28.4
mem0 + Qdrant 1,120 89 185 31.2

Key Observations

Throughput Overhead: mem0's abstraction layer introduces 20-30% throughput reduction compared to direct vector store access. This stems from:

  • Metadata serialization/deserialization for agent session context
  • Memory deduplication logic on every add operation
  • Automatic relevance scoring and timestamp-based decay calculations

Latency Spikes at p99: The 220ms p99 for mem0+pgvector correlates with connection pool exhaustion during concurrent embedding generation. When routing through B-Lost's relay gateway with connection pooling enabled, p99 dropped to 168ms (24% improvement).

Memory Footprint: mem0 maintains 2.3x more RAM per agent session than raw vector stores due to in-memory caching of recent queries and session metadata graphs.

Production Threshold Analysis

Where does adopting mem0 make architectural sense?

Sweet Spot: 50-500 concurrent agents with complex, long-running conversational context. Below 50 agents, raw pgvector with custom deduplication logic is leaner. Above 500 agents, you'll need horizontal sharding and the abstraction overhead becomes prohibitive without dedicated memory service clusters.

Hard Constraint: If your p99 latency budget is sub-100ms for memory operations, mem0's managed layer won't fit. You need direct vector store access with pre-warmed connection pools.

Cost Breakpoint: At $0.10/1M tokens for embeddings and 500 agents generating 2k memory fragments/day, mem0's deduplication saves ~$180/month in redundant embedding costs. The CPU overhead adds ~$45/month in compute. Net savings materialize above 300 active agents.

Configuration: mem0 with B-Lost Relay

import os
from mem0 import Memory

# Route embedding generation through B-Lost relay to avoid OpenAI rate limits
os.environ["OPENAI_API_BASE"] = "https://b-lost.com/v1"
os.environ["OPENAI_API_KEY"] = "your-api-key"

config = {
    "vector_store": {
        "provider": "pgvector",
        "config": {
            "host": "localhost",
            "port": 5432,
            "user": "mem0_bench",
            "password": "bench_pass",
            "database": "agent_memory"
        }
    },
    "embedder": {
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
}

memory = Memory.from_config(config)

# Add memory with agent session isolation
memory.add(
    "User prefers technical documentation over marketing content",
    user_id="agent_session_42",
    metadata={"domain": "preferences", "confidence": 0.91}
)

# Retrieve with semantic search
results = memory.search(
    query="What are the user's content preferences?",
    user_id="agent_session_42",
    limit=5
)
Enter fullscreen mode Exit fullscreen mode

Stress Test: Insert Contention

During the benchmark, insert-heavy workloads (70% add operations) caused p99 latency to spike to 380ms with mem0+pgvector. Root cause: HNSW index write locks under high concurrency.

Mitigation: Batching memory additions in 50-fragment chunks reduced p99 to 195ms:

from mem0 import Memory

memory = Memory.from_config(config)

# Batch add instead of individual inserts
memories = [
    {"text": f"Context fragment {i}", "metadata": {"batch": "session_init"}}
    for i in range(50)
]

memory.add_batch(memories, user_id="agent_session_42")
Enter fullscreen mode Exit fullscreen mode

When to Stay on Raw Vector Stores

If your architecture already implements:

  • Custom embedding deduplication via content hashing
  • Agent session isolation through table partitioning
  • Relevance decay scoring in application logic

...then mem0's abstraction adds latency without delivering new functionality. The production threshold is whether you're building memory infrastructure from scratch or extending existing systems.

For greenfield multi-agent platforms with 100+ concurrent sessions and complex conversational state, mem0's managed layer justifies the 20-30% throughput tradeoff. For latency-critical retrieval pipelines or systems under 50 agents, direct vector store access remains the correct choice.

Top comments (0)