Linux · August 1, 2025

Dynamic Memory Allocation and Deallocation in Linux

Introduction

This document explores the core mechanisms of Linux memory management and analyzes optimization strategies for memory usage in the context of Hong Kong servers. As a critical internet hub in the Asia-Pacific region, servers in Hong Kong must handle high-load and high-concurrency requests, making memory management optimization essential for performance and stability.


1. Fundamentals of Linux Memory Allocation: Buddy System

  • Linux uses the Buddy System to manage physical memory.

  • Memory is divided into blocks of varying sizes (typically 4KB units), fulfilling allocation requests through merging and splitting.

    • Example: For an 8KB allocation, the system may split a 16KB block.

  • Research indicates:

    • Effective for managing memory fragmentation.

    • Larger granularity may cause waste, especially in frequent small-allocation scenarios.

  •  Server Perspective:

    • Understanding the Buddy System helps administrators monitor and optimize memory usage.

    • Under high load, frequent allocation/deallocation makes Buddy System efficiency critical for performance.

    • Use Case: Delayed allocations in web servers handling transient connections may increase response latency.


2. Kernel-Space Allocation: Slab Allocator

  • Purpose: Optimize frequent small allocations (e.g., 8 bytes) where the Buddy System is inefficient.

  • Mechanism: Divides memory into caches, each dedicated to specific data structures or size ranges (e.g., kmalloc-32 for 32-byte allocations).

  • Three Implementations: slabslub, and slob, each optimized for different scenarios.

  • Evidence: Slab allocator significantly improves small-allocation efficiency.

  • Server Perspective:

    • Kernel small-allocation performance directly impacts overall efficiency during high concurrency.

    • Use Case: Network servers allocating memory per connection benefit from reduced overhead and faster response times.

  • Relationship with Buddy System:

    • Slab acquires large blocks (e.g., 4KB) from the Buddy System and subdivides them.

    • Both are algorithmically co-equal; Slab acts as a secondary manager for small allocations.


3. Kernel Memory Allocation Functions: kmalloc vs. vmalloc

Featurekmallocvmalloc
ContiguityPhysically contiguousVirtually contiguous (physically non-contiguous)
Typical SizeSmall (hundreds of bytes – few KB)Large (several MB+)
MappingPre-mapped; no page table opsRequires page table setup
Memory ZoneSuitable for low-memory regionsSuitable for high-memory regions
  •  Server Perspective:

    • Selection is critical for performance.

    • Use Cases:

      • Web servers (many small allocations) → kmalloc preferred.

      • Database servers (large data blocks) → vmalloc more appropriate.

    • Administrators must balance performance and contiguity based on application needs.


4. User-Space Allocation: malloc & Lazy Allocation

  • Mechanism:

    1. User-space requests memory via malloc.

    2. Linux uses Lazy Allocation: Only virtual address space is reserved; no physical memory is immediately allocated.

    3. Access triggers a Page Fault.

    4. Physical pages are allocated on-demand by the kernel.

  • Research shows: This improves memory utilization, especially under constraints.

  • Server Perspective:

    • Enables rapid allocation without immediate resource consumption.

    • Use Case: Allocating 100MB at startup while assigning physical pages only when used – ideal for high-concurrency workloads.


5. Linux Server Cache Management

  • Challenge: Caches boost performance but excessive usage can degrade system responsiveness.

  • Cache Cleaning Methods:

    • 🗂️ Clear Page, Directory, & Inode Caches:

      bash
      sudo sync; echo 3 > /proc/sys/vm/drop_caches

      (Syncs disk data before release)

    • 📊 Monitor Usage: Tools like htop or top to identify high-memory processes.

    • ⚙️ Tune Application Caches: Adjust caching policies (e.g., Apache/Nginx cache size/TTL).

    • 💾 Database Optimization: Configure parameters like MySQL’s innodb_buffer_pool_size or PostgreSQL caches.

  • Memory Optimization Techniques:

    • 🖥️ Add Physical RAM: Upgrade hardware if swap usage is frequent.

    • ⚙️ Adjust Cache Policy: Modify vm.swappiness (e.g., set to 10) to reduce swapping.

    • 🧩 Allocation Optimization: Use Memory Pools to reduce fragmentation and minimize malloc/free calls.

    • 🔍 Leak Detection: Employ valgrind or heaptrack to identify/fix memory leaks.

  • Server Perspective:

    • Critical for maintaining stability and performance during high-load/high-concurrency scenarios.


6. Handling Low Memory: OOM Mechanism

  • Mechanism: The OOM Killer (Out-Of-Memory Killer) activates during severe memory exhaustion.

  • Operation: Terminates processes based on OOM score (calculated from memory usage + priority). Higher scores are killed first.

  • Administrator Control: Adjust /proc/<pid>/oom_score_adj to:

    • Protect critical processes (assign negative values).

    • Prioritize termination (assign positive values).

  •  Server Perspective:

    • Essential for protecting mission-critical services (e.g., web servers, databases).

    • Unplanned termination can cause service disruption or system failure.

    • Use Case: Configuring OOM scores prevents accidental termination of core services like web servers.


Conclusion

Linux memory management encompasses multiple layers: the Buddy System for physical allocation, Slab Allocator for kernel efficiency, kmalloc/vmalloc for kernel-space flexibility, Lazy Allocation for user-space agility, and the OOM Killer for resource emergencies. For Hong Kong servers operating under high load and concurrency, optimization requires focus on:

  • Cache management strategies

  • Context-aware allocation methods

  • Proactive OOM configuration

Through deliberate tuning, administrators maximize resource utilization to deliver high-performance, stable services.