| name | sysadmin-kernel-tuning |
| description | Réglage fin du noyau Linux : sysctl, paramètres mémoire/CPU/réseau, scheduler, swappiness, hugepages, cgroups, I/O scheduler, limites système et profils de performance. |
| version | 1.0.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux"] |
| metadata | {"EVA":{"tags":["kernel","sysctl","tuning","performance","memory","cpu","scheduler","cgroups","hugepages","i-o","filesystem","networking"],"related_skills":["os-linux-admin","sysadmin-monitoring","sysadmin-lvm","os-debian-ubuntu-engineering","os-rhel-engineering"]}} |
Réglage Fin du Noyau Linux (Kernel Tuning)
Vue d'ensemble
Le noyau Linux offre des centaines de paramètres ajustables via sysctl pour optimiser les performances selon la charge de travail : base de données, serveur web, calcul Haute Performance (HPC), conteneurisation, etc.
Principe : Charger les paramètres au boot via /etc/sysctl.d/ — chaque fichier .conf est appliqué automatiquement.
Quand l'utiliser
- Optimiser un serveur de base de données (PostgreSQL, MySQL)
- Réduire la latence réseau (serveur web, API)
- Améliorer les performances I/O pour du calcul intensif
- Configurer HugePages pour des applications mémoire-intensive
- Ajuster les limites système (open files, threads, processes)
- Activer/désactiver des fonctionnalités du noyau (sécurité, debogage)
1. Paramètres Généraux
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 40
vm.dirty_background_ratio = 5
vm.max_map_count = 1048576
2. Mémoire et HugePages
vm.nr_hugepages = 2048
grep HugePages /proc/meminfo
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
Taille des Pages et Performances
| Page Size | Avantage | Usage |
|---|
| 4 Ko (défaut) | Standard, faible gaspillage | Usage général |
| 2 Mo (HugePages) | Moins de TLB misses, meilleure cache | BDD, VMs, HPC |
| 1 Go (HugePages géants) | Très grandes allocs | VMs lourdes, GPU |
3. Scheduler CPU et Process
kernel.sched_min_granularity_ns = 4000000
kernel.sched_latency_ns = 24000000
kernel.sched_wakeup_granularity_ns = 3000000
sudo cpupower frequency-set -g performance
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Scheduler I/O
cat /sys/block/sda/queue/scheduler
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
vm.dirty_writeback_centisecs = 1500
4. Réseau (Optimisation pour Faible Latence / Haut Débit)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_notsent_lowat = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_local_port_range = 1024 65535
TCP BBR
cat /proc/sys/net/ipv4/tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
5. Limites Système (ulimit)
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65536
* hard nproc 65536
* soft memlock unlimited
* hard memlock unlimited
cat /proc/1/limits
ulimit -n
ulimit -a
6. Cgroups v2 (Contrôle des Ressources)
ls /sys/fs/cgroup/
sudo mkdir /sys/fs/cgroup/memory/myapp
echo 500000000 | sudo tee /sys/fs/cgroup/memory/myapp/memory.max
echo $PID | sudo tee /sys/fs/cgroup/memory/myapp/cgroup.procs
systemd-run --user --scope -p MemoryMax=500M -p CPUQuota=50% ./myapp
7. Profils par Charge de Travail
Serveur de Base de Données (PostgreSQL / MySQL)
vm.swappiness = 1
vm.dirty_ratio = 30
vm.dirty_background_ratio = 3
vm.nr_hugepages = 4096
kernel.numa_balancing = 0
net.core.somaxconn = 65535
fs.aio-max-nr = 1048576
Serveur Web / API (Haute Concurrence)
net.core.somaxconn = 65535
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_congestion_control = bbr
fs.file-max = 2097152
HPC / Calcul Intensif
kernel.numa_balancing = 0
vm.swappiness = 0
vm.nr_hugepages = 16384
kernel.sched_min_granularity_ns = 10000000
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
8. Script d'Application au Boot
#!/bin/bash
set -euo pipefail
echo "=== Application des réglages noyau avancés ==="
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
for disk in /sys/block/nvme*/queue/scheduler; do
echo none > "$disk"
done
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2>/dev/null || true
echo "OK"
9. Diagnostic et Vérification
sysctl -a | grep -E "swappiness|dirty|hugepage"
sysctl net.ipv4.tcp_congestion_control
sysbench cpu run
sysbench memory run
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 \
--name=test --bs=4k --iodepth=64 --size=1G --readwrite=randrw --rwmixread=75
iperf3 -c serveur_central
Pièges Courants
-
Réglages trop agressifs : Modifier tous les paramètres d'un coup sans les tester individuellement. Utiliser des changements incrémentaux et mesurer l'impact.
-
vm.swappiness=0 : Ne désactive PAS complètement le swap. Le noyau peut encore swapper. Pour désactiver, retirer complètement le swap (swapoff -a).
-
THP pour les BDD : Transparent HugePages cause des latences importantes (allocation de pages fragmentée). Toujours désactiver pour PostgreSQL, MySQL, MongoDB.
-
net.core.rmem_max / wmem_max trop bas : Limite le débit réseau pour les connexions à haute latence (longue distance). Vérifier avec iperf3.
-
BBR non disponible : BBR nécessite un noyau ≥ 4.9. Vérifier avec modprobe tcp_bbr.
-
Oublier de rendre les changements persistants : Les modifications /sys/ sont volatiles. Les passer par sysctl.d/.
Liste de vérification (Checklist)