Course contentsShow
← Linux
Lesson 1818 of 1,81915. Kernel Concepts for Systems AdministratorsFree lesson

Kernel preemption configuration

You will choose appropriate preemption models for low-latency versus general-purpose workloads.

In this lesson, you will learn how to select the appropriate kernel preemption model to balance system throughput against task responsiveness.

Kernel preemption determines when the scheduler is permitted to interrupt a process running in kernel mode to switch to a higher-priority task. By default, Linux offers several configuration options (via CONFIG_PREEMPT_* symbols) that trade off between general-purpose efficiency and low-latency requirements.

Understanding the Models

  1. No Forced Preemption (CONFIG_PREEMPT_NONE): This is the traditional server model. The kernel only preempts tasks at explicit "reschedule points" or when returning to user-space. This maximizes system throughput because it minimizes the overhead of frequent context switches, making it ideal for computational workloads where raw CPU efficiency is the priority.
  2. Voluntary Kernel Preemption (CONFIG_PREEMPT_VOLUNTARY): Designed for desktop systems, this model adds extra explicit preemption points throughout the kernel code. If a thread is performing a long-running operation, it "voluntarily" checks if a higher-priority task needs the CPU. This provides a smoother user experience without the full cost of a preemptible kernel.
  3. Preemptible Kernel (CONFIG_PREEMPT): In this model, the kernel is fully preemptible. The scheduler can interrupt almost any kernel-space activity at any time, provided the thread is not holding a critical spinlock. This is essential for low-latency and soft real-time applications where you cannot afford to wait for a system call to finish before addressing an interrupt or a high-priority task.

Configuration Selection

Choosing the right model depends on your workload's sensitivity to scheduling latency. You can verify your current configuration by checking your kernel config file:

grep CONFIG_PREEMPT /boot/config-$(uname -r)

If your application suffers from high scheduling latency despite optimized CPU affinity, switching to CONFIG_PREEMPT will drastically reduce the duration for which a task is blocked while in kernel mode. However, be aware that this increased responsiveness comes at the cost of higher context-switching overhead and potential performance degradation for throughput-bound processes.

Key Takeaway: Choose CONFIG_PREEMPT_NONE for maximum throughput on compute servers, and use CONFIG_PREEMPT to minimize scheduling latency for real-time or responsive interactive tasks.