Linux
Système
Performance

Kernel Linux 2026 : tuning, modules, compilation et paramètres système

6 février 2026

11 min de lecture

Le kernel Linux est le cœur du système d'exploitation. Ce guide explique comment tuner, compiler et gérer modules kernel pour optimiser performance et sécurité.

Comprendre le Kernel

Qu'est-ce que le Kernel ?

Kernel = Cœur OS entre hardware et applications

Rôles :

  • Gestion mémoire
  • Scheduling processus
  • Drivers hardware
  • Filesystem
  • Réseau
  • Sécurité

Analogie : Kernel = Chef d'orchestre système

Version Kernel
# Version actuelle
uname -r
# 6.5.0-15-generic

# Info détaillée
uname -a

# Version kernel et distribution
cat /proc/version

Format version : 6.5.0-15-generic

  • 6 : Major version
  • 5 : Minor version
  • 0 : Patch level
  • 15 : Build/ABI number
  • generic : Flavor (generic, lowlatency, etc.)

Paramètres Kernel : sysctl

Pour une optimisation complète avec sysctl, consultez notre guide dédié. Pour comprendre la gestion de la mémoire, découvrez notre guide sur le swap Linux et l'optimisation eBPF au niveau kernel.

Qu'est-ce que sysctl ?

sysctl = Interface configuration kernel runtime

Avantages :

  • Modifier paramètres sans reboot
  • Tuning performance
  • Optimisation réseau
  • Sécurité hardening
Voir Paramètres
# Tous paramètres
sysctl -a

# Chercher paramètre
sysctl -a | grep tcp

# Paramètre spécifique
sysctl net.ipv4.ip_forward
# net.ipv4.ip_forward = 0

# Ou directement
cat /proc/sys/net/ipv4/ip_forward
Modifier Temporairement
# Activer IP forwarding
sudo sysctl -w net.ipv4.ip_forward=1

# Vérifier
sysctl net.ipv4.ip_forward
# net.ipv4.ip_forward = 1

# ATTENTION : Perdu au reboot !
Modifier Permanent
# Éditer config
sudo nano /etc/sysctl.conf

# Ou créer fichier custom
sudo nano /etc/sysctl.d/99-custom.conf

# Ajouter paramètres
net.ipv4.ip_forward = 1
vm.swappiness = 10

# Appliquer sans reboot
sudo sysctl -p
# Ou
sudo sysctl -p /etc/sysctl.d/99-custom.conf

# Vérifier
sysctl net.ipv4.ip_forward

Tuning Réseau

TCP Performance
# /etc/sysctl.d/10-network.conf

# TCP Buffer sizes
net.core.rmem_max = 134217728          # 128MB
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# TCP options
net.ipv4.tcp_window_scaling = 1         # Window scaling
net.ipv4.tcp_timestamps = 1             # Timestamps
net.ipv4.tcp_sack = 1                   # Selective ACK
net.ipv4.tcp_fastopen = 3               # Fast open

# Congestion control (BBR recommandé)
# Voir [tuning TCP/IP et BBR](/blog/tcp-tuning-bbr) pour plus de détails
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# Connection handling
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000

# TIME_WAIT sockets
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
Sécurité Réseau
# /etc/sysctl.d/10-security.conf

# Protection SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# IP spoofing protection
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0

# Ignore ICMP ping
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Log martians
net.ipv4.conf.all.log_martians = 1

# Disable source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# IPv6 disable (si pas utilisé)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Tuning Mémoire

VM Paramètres
# /etc/sysctl.d/20-vm.conf

# Swappiness (0-100)
# Pour plus d'infos, consultez notre [guide complet du swap Linux](/blog/swap-linux-2026)
vm.swappiness = 10                      # Desktop/Workstation
# vm.swappiness = 1                     # Serveur avec beaucoup RAM

# Cache pressure (0-200)
vm.vfs_cache_pressure = 50              # Moins agressif sur cache

# Dirty pages
vm.dirty_ratio = 15                     # % RAM dirty avant sync
vm.dirty_background_ratio = 5           # % avant background sync

# Memory overcommit
vm.overcommit_memory = 1                # 0=heuristic, 1=always, 2=never
vm.overcommit_ratio = 50

# Transparent Huge Pages
# echo never > /sys/kernel/mm/transparent_hugepage/enabled  # Databases
OOM Killer
# OOM behavior
vm.panic_on_oom = 0                     # 0=kill process, 1=panic
vm.oom_kill_allocating_task = 0         # Kill task causing OOM

# Per-process OOM adjustment
# /proc/[PID]/oom_adj
# -17 = never kill, 15 = always kill first

Tuning Filesystem

Paramètres FS
# /etc/sysctl.d/30-fs.conf

# File handles
fs.file-max = 2097152

# Inotify (pour outils comme Docker)
fs.inotify.max_user_watches = 524288    # Pour surveiller fichiers (voir [inotify](/blog/inotify-alert))
fs.inotify.max_user_instances = 512

# AIO (Async I/O)
fs.aio-max-nr = 1048576

Modules Kernel

Qu'est-ce qu'un Module ?

Module = Driver/fonctionnalité chargeable dynamiquement

Avantages :

  • Pas recompiler kernel
  • Load/unload à chaud
  • Economise mémoire
Lister Modules
# Modules chargés
lsmod

# Avec détails
lsmod | head
# Module                  Size  Used by
# nvidia              39419904  45
# usbhid                 69632  0

# Info module
modinfo nvidia
modinfo e1000e

# Dépendances module
modprobe --show-depends nvidia
Charger/Décharger Modules
# Charger module
sudo modprobe module_name

# Décharger
sudo modprobe -r module_name

# Force décharger (attention !)
sudo modprobe -rf module_name

# Charger avec paramètres
sudo modprobe module_name param=value
Modules au Boot
# Charger automatiquement
sudo nano /etc/modules-load.d/modules.conf

# Ajouter modules (1 par ligne)
loop
nbd
br_netfilter

# Paramètres modules
sudo nano /etc/modprobe.d/custom.conf

# Options
options module_name parameter=value

# Exemple :
options kvm_intel nested=1
Blacklist Modules
# Empêcher chargement module
sudo nano /etc/modprobe.d/blacklist.conf

# Blacklist
blacklist nouveau         # Driver Nvidia open-source
blacklist pcspkr          # PC speaker

# Rebuild initramfs
sudo update-initramfs -u

# Reboot
sudo reboot

Compilation Kernel Custom

Pourquoi Compiler ?

Raisons :

  • Optimisations spécifiques hardware
  • Activer features expérimentales
  • Désactiver features inutiles
  • Patches custom
  • Dernière version kernel
Prérequis
# Installer outils build
sudo apt update
sudo apt install build-essential libncurses-dev bison flex \
    libssl-dev libelf-dev bc dwarves

# Espace disque requis : ~20GB
Télécharger Sources
# Créer répertoire
mkdir ~/kernel-build
cd ~/kernel-build

# Télécharger kernel
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.0.tar.xz

# Extraire
tar -xvf linux-6.12.0.tar.xz
cd linux-6.12.0
Configuration
# Copier config actuelle (recommandé)
cp /boot/config-$(uname -r) .config

# Ou config par défaut
make defconfig

# Menu configuration (ncurses)
make menuconfig

# Navigation :
# ↑↓ : Naviguer
# Space : Sélectionner [*] actif, [ ] inactif, [M] module
# Enter : Sous-menu
# / : Rechercher
# Esc Esc : Quitter
Options Compilation
# Optimisations processeur
Processor type and features →
  Processor family (Generic-x86-64) → [Choisir CPU]
  [*] Multi-core scheduler support

# Disable debug (plus petit, plus rapide)
Kernel hacking →
  [ ] Compile the kernel with debug info

# Modules réseau
Networking support →
  Networking options →
    [*] Network packet filtering (replaces ipchains)
Compiler
# Nombre CPU cores
nproc
# 8

# Compiler (parallèle)
make -j8

# Temps : 30min - 2h selon machine

# Modules
make modules -j8

# Installer modules
sudo make modules_install

# Installer kernel
sudo make install
Configurer Bootloader
# Debian/Ubuntu (automatique avec make install)
sudo update-grub

# Arch Linux
sudo grub-mkconfig -o /boot/grub/grub.cfg

# Vérifier entrées
grep menuentry /boot/grub/grub.cfg
Reboot et Test
# Reboot
sudo reboot

# Vérifier version
uname -r
# 6.12.0

# Si problème : boot ancien kernel depuis GRUB

Kernel Parameters Boot

GRUB Parameters
# Éditer GRUB
sudo nano /etc/default/grub

# Ligne GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

# Ajouter paramètres
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset acpi=off"
Paramètres Utiles
# Graphiques
nomodeset              # Disable KMS (problèmes GPU)
i915.modeset=0         # Disable Intel GPU modeset

# Mémoire
mem=4G                 # Limiter RAM utilisée
hugepages=128          # Huge pages

# CPU
maxcpus=4              # Limiter CPUs
noapic                 # Disable APIC
nosmp                  # Disable SMP (1 CPU)

# Debug
debug                  # Mode debug
loglevel=7             # Verbosité logs (0-8)

# Sécurité
apparmor=1             # Activer AppArmor
selinux=1              # Activer SELinux

# Performance
transparent_hugepage=never  # THP (databases)
# Schedulers I/O : utiliser udev rules (voir section dédiée)
I/O Scheduler (via udev, moderne)

Note : Le paramètre boot elevator= est déprecié depuis kernel 5.0+. Utiliser udev rules à la place :

# Créer règle udev
sudo nano /etc/udev/rules.d/60-ioschedulers.rules

# Contenu (example : scheduler 'deadline' pour disques SSD)
ACTION=="add|change", KERNEL=="sd*[!0-9]|hd*[!0-9]|nvme*", ATTR{queue/scheduler}="deadline"

# Alternativement, utiliser 'kyber' pour NVMe
ACTION=="add|change", KERNEL=="nvme*", ATTR{queue/scheduler}="kyber"

# Appliquer
sudo udevadm control --reload
sudo udevadm trigger
Appliquer
# Update GRUB
sudo update-grub

# Reboot
sudo reboot

# Vérifier paramètres actifs
cat /proc/cmdline

# Vérifier scheduler actif
cat /sys/block/sda/queue/scheduler

Monitoring Kernel

Stats Kernel
# Uptime kernel
uptime

# Messages kernel
dmesg | less

# Derniers messages
dmesg -T | tail -50

# Filtrer par niveau
dmesg --level=err,warn

# Temps réel
dmesg -w
/proc Filesystem
# Info système
cat /proc/cpuinfo        # CPU
cat /proc/meminfo        # Mémoire
cat /proc/loadavg        # Load average
cat /proc/version        # Kernel version
cat /proc/uptime         # Uptime
cat /proc/cmdline        # Boot parameters

# Processus
cat /proc/[PID]/status   # Status processus
cat /proc/[PID]/cmdline  # Commande
/sys Filesystem
# Hardware info
ls /sys/class/net/       # Interfaces réseau
ls /sys/block/           # Disques
ls /sys/class/power_supply/  # Batterie

# Tuning dynamique
echo 1 > /sys/block/sda/queue/rotational  # SSD vs HDD

Kernel Live Patching

KernelCare / Ksplice

Live patching = Patcher kernel sans reboot

# KernelCare (commercial)
wget -qq -O - https://repo.cloudlinux.com/kernelcare/kernelcare_install.sh | bash
kcarectl --info

# Ksplice (Oracle, gratuit Debian/Ubuntu)
sudo apt install ksplice-uptrack
Alternatives

Canonical Livepatch (Ubuntu)

sudo snap install canonical-livepatch
sudo canonical-livepatch enable TOKEN

Kernel Panic

Comprendre Kernel Panic

Kernel panic = Erreur fatale kernel → système freeze

Causes :

  • Driver défectueux
  • Corruption mémoire
  • Bug kernel
  • Hardware défaillant
Récupération
# Boot en recovery mode (GRUB)
# Sélectionner : Advanced options → Recovery mode

# Ou kernel précédent
# GRUB → Advanced → Ancien kernel

# Logs panic
dmesg | grep -i panic
journalctl -b -1 | grep -i panic

# Last boot
journalctl -b -1
Config Panic Behavior
# /etc/sysctl.d/99-panic.conf

# Reboot automatique après panic (secondes)
kernel.panic = 10

# Reboot si oops
kernel.panic_on_oops = 1

# Appliquer
sudo sysctl -p /etc/sysctl.d/99-panic.conf

Optimisations Spécifiques

Serveur Web
# /etc/sysctl.d/webserver.conf

# Network
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1

# File descriptors
fs.file-max = 2097152

# Kernel
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
Base de Données
# /etc/sysctl.d/database.conf

# Memory
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# Huge pages (pour PostgreSQL, Oracle)
vm.nr_hugepages = 1024

# Shared memory
kernel.shmmax = 17179869184
kernel.shmall = 4194304
kernel.shmmni = 4096

# IPC
kernel.sem = 250 32000 100 128

# Disable THP (databases)
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
Gaming / Desktop
# /etc/sysctl.d/desktop.conf

# Swappiness (plus tolérant swap)
vm.swappiness = 60

# Responsiveness
vm.vfs_cache_pressure = 100

# Dirty pages (flush plus fréquent)
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

Sécurité Kernel

Hardening
# /etc/sysctl.d/99-hardening.conf

# Restrict kernel pointers
kernel.kptr_restrict = 2

# Restrict dmesg
kernel.dmesg_restrict = 1

# Restrict perf
kernel.perf_event_paranoid = 3

# ASLR (Address Space Layout Randomization)
kernel.randomize_va_space = 2

# Ptrace restrictions
kernel.yama.ptrace_scope = 1

# Core dumps
kernel.core_uses_pid = 1
fs.suid_dumpable = 0

Troubleshooting

Performance Issues
# CPU bottleneck ?
top
htop

# I/O bottleneck ?
iostat -x 2
iotop

# Memory issues ?
free -h
vmstat 2

# Network ?
iftop
nethogs

# Kernel parameters
sysctl -a | grep -i problematic_param
Modules Issues
# Module ne charge pas
dmesg | grep module_name

# Dépendances manquantes
modprobe --show-depends module_name

# Vérifier blacklist
grep -r module_name /etc/modprobe.d/

# Rebuild modules
sudo depmod -a

Bonnes Pratiques

Checklist Tuning
□ Backup config actuelle
□ Tester changements environnement test
□ Un paramètre à la fois
□ Documenter changements
□ Monitoring après changements
□ Rollback plan si problème
Documentation
# Commenter sysctl.conf
# /etc/sysctl.d/99-custom.conf

# Optimisation serveur web
# Augmente backlog connexions
net.core.somaxconn = 65535

# Date et raison
# 2026-02-01 : Augmenté pour charge élevée

Conclusion

Le kernel Linux est hautement configurable :

sysctl tuning :

sudo sysctl -w param=value        # Temporaire
/etc/sysctl.d/99-custom.conf      # Permanent
sudo sysctl -p                    # Appliquer

Modules :

lsmod                     # Lister
modprobe module          # Charger
modprobe -r module       # Décharger
/etc/modules-load.d/     # Auto-load

Compilation :

make menuconfig
make -j$(nproc)
sudo make modules_install
sudo make install

Boot parameters :

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="params"
update-grub

Optimisations courantes :

  • Réseau : BBR, buffers TCP
  • Mémoire : swappiness, dirty_ratio
  • Sécurité : kptr_restrict, dmesg_restrict

Avec ces techniques, optimisez kernel pour vos besoins spécifiques ! ⚙️

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets d'infrastructure et d'infogérance.

Contactez-nous

Articles similaires