Optimiser le kernel Linux pour un VPS de production

Optimiser le kernel Linux pour un VPS de production

Tunez votre VPS Linux pour obtenir les meilleures performances réseau et système. Ce guide couvre sysctl, TCP BBR (le contrôleur de congestion de Google), les file descriptors, le scheduler I/O et les optimisations spécifiques aux VPS.

Introduction

Les valeurs par défaut du kernel Linux sont conçues pour fonctionner partout, du Raspberry Pi au serveur enterprise. Sur un VPS de production qui héberge un site web, une base de données ou un serveur de jeux, ces valeurs sont sous-optimales.

Ce tuto vous donne des optimisations éprouvées qui :

  • Améliorent la latence et le débit réseau (BBR, fast open)
  • Permettent plus de connexions simultanées (file descriptors, ports)
  • Réduisent la consommation mémoire (swappiness)
  • Préviennent les attaques classiques (anti-SYN flood)

Prérequis

  • VPS Linux (Debian 12 / Ubuntu 22.04+)
  • Accès root
  • Kernel 5.4+ (pour TCP BBR)

Vérifiez votre version :

uname -r

Étape 1 : Backup et structure

sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
sudo mkdir -p /etc/sysctl.d/

Toutes les modifications iront dans /etc/sysctl.d/99-tuning.conf (mieux pour la maintenance qu'éditer /etc/sysctl.conf).

sudo nano /etc/sysctl.d/99-tuning.conf

Étape 2 : Activer TCP BBR

TCP BBR (Bottleneck Bandwidth and Round-trip propagation time) est le contrôleur de congestion développé par Google. Il remplace l'algorithme CUBIC par défaut et améliore drastiquement le débit, surtout sur des connexions à latence variable.

Avant tuning : ~20-50 Mbps sur une connexion mobile, packet loss > 1%. Après BBR : ~80-150 Mbps sur la même connexion.

Ajoutez à 99-tuning.conf :

# === TCP BBR ===
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

Appliquez :

sudo sysctl --system

Vérifiez :

sysctl net.ipv4.tcp_congestion_control

Doit retourner bbr.

Étape 3 : Augmenter les buffers réseau

Sur les VPS qui transfèrent beaucoup de données (download/upload massif, streaming) :

# === Buffers réseau ===
# Buffer recv max
net.core.rmem_max = 67108864
net.core.rmem_default = 262144

# Buffer send max
net.core.wmem_max = 67108864
net.core.wmem_default = 262144

# Buffer TCP
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432

# Queue length
net.core.netdev_max_backlog = 16384

Étape 4 : Optimiser TCP

# === Optimisations TCP ===
# Activer TCP Fast Open (réduit la latence d'établissement)
net.ipv4.tcp_fastopen = 3

# Réutilisation rapide des sockets en TIME_WAIT
net.ipv4.tcp_tw_reuse = 1

# Durée TIME_WAIT
net.ipv4.tcp_fin_timeout = 15

# Keepalive plus rapide pour détecter les connexions mortes
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

# Augmenter le nombre de connexions max en attente
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# Activer MTU probing
net.ipv4.tcp_mtu_probing = 1

# Empêcher la chute du débit après un idle
net.ipv4.tcp_slow_start_after_idle = 0

Étape 5 : Protection anti-DDoS basique

Netrix gère le gros, mais quelques sysctl complètent au niveau kernel :

# === Anti-DDoS ===
# SYN flood protection
net.ipv4.tcp_syncookies = 1

# Ignorer les ping broadcasts
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignorer les ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Anti-spoofing (rp_filter)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Logger les paquets martians
net.ipv4.conf.all.log_martians = 1

# Désactiver le source routing
net.ipv4.conf.all.accept_source_route = 0

Étape 6 : Augmenter la plage de ports éphémères

Par défaut, Linux utilise environ 28K ports éphémères. Pour des serveurs très chargés (proxies, load balancers), c'est limitant :

# === Plage de ports éphémères élargie ===
net.ipv4.ip_local_port_range = 1024 65535

Étape 7 : Optimisations mémoire

# === Mémoire / Swap ===
# Réduire l'usage du swap (privilégier la RAM)
vm.swappiness = 10

# Cache filesystem plus agressif
vm.vfs_cache_pressure = 50

# Ratio dirty pages avant écriture sur disque
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

vm.swappiness = 10 : ne swap que si > 90% de RAM utilisée. Sur SSD/NVMe, baissez à 1 pour minimiser l'usure.

Étape 8 : File descriptors

Beaucoup de serveurs hit la limite par défaut de 1024 file descriptors par process. Augmentez :

# === File descriptors ===
fs.file-max = 2097152
fs.nr_open = 1048576

Et côté shell, dans /etc/security/limits.conf :

sudo nano /etc/security/limits.conf

Ajoutez à la fin :

* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
root soft nofile 1048576
root hard nofile 1048576

Et activez dans PAM :

sudo nano /etc/pam.d/common-session

Ajoutez :

session required pam_limits.so

Pour systemd-services (Nginx, MySQL, etc.) :

sudo mkdir -p /etc/systemd/system.conf.d
sudo nano /etc/systemd/system.conf.d/limits.conf
[Manager]
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65535

Étape 9 : Optimiser le scheduler I/O

Sur SSD/NVMe, le scheduler par défaut (mq-deadline) est bien, mais none peut être plus rapide :

# Voir le scheduler actuel
cat /sys/block/sda/queue/scheduler

# Changer (temporaire, perdu au reboot)
echo none | sudo tee /sys/block/sda/queue/scheduler

Pour persister, créez une règle udev :

sudo nano /etc/udev/rules.d/60-scheduler.rules
# Pour les SSD/NVMe
ACTION=="add|change", KERNEL=="sd[a-z]|nvme[0-9]n[0-9]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

Étape 10 : Appliquer tout en une fois

Après avoir édité 99-tuning.conf :

sudo sysctl --system

Vérifiez qu'aucune valeur ne déclenche d'erreur :

sudo sysctl -p /etc/sysctl.d/99-tuning.conf 2>&1 | grep -i error

Étape 11 : Vérifier les performances

Test débit réseau

# iPerf3 entre votre VPS et un autre serveur
sudo apt install -y iperf3

# Sur le serveur de test
iperf3 -s

# Sur votre VPS
iperf3 -c IP_AUTRE_SERVEUR -t 30

Test latence TCP

# Time to first byte sur 100 connexions
time for i in {1..100}; do curl -o /dev/null -s "https://google.com"; done

Vérifier BBR actif

sysctl net.ipv4.tcp_congestion_control
# bbr

cat /proc/sys/net/ipv4/tcp_available_congestion_control
# Doit lister bbr en plus de cubic

Compter les sockets

ss -s

Étape 12 : Optimisations applicatives complémentaires

Le tuning kernel donne le maximum si vos applis sont aussi tunées. Voir :

  • Nginx tuning (workers, keepalive) : /docs/article/nginx-tuning
  • MySQL/MariaDB tuning (buffer pool) : /docs/article/mysql-tuning
  • PHP-FPM (pm.max_children) : ajustez selon la RAM

Dépannage

Performances pires après tuning

C'est rare mais possible. Comparez avant/après avec iperf3. Si pire :

sudo cp /etc/sysctl.conf.bak /etc/sysctl.conf
sudo mv /etc/sysctl.d/99-tuning.conf /etc/sysctl.d/99-tuning.conf.bak
sudo sysctl --system

"Operation not permitted" sur certains sysctl

Le kernel ne supporte pas certaines options. Vérifiez :

uname -r

Pour BBR, kernel 4.9+ requis. Pour tcp_fastopen, 4.0+.

Limite "Too many open files" persiste

Le service doit être redémarré pour prendre en compte les nouvelles limites :

sudo systemctl restart nginx mysql php8.3-fpm

Vérifiez la limite d'un process :

cat /proc/$(pidof nginx | awk '{print $1}')/limits | grep "Max open files"

Commandes utiles

# Voir tous les sysctl actifs
sudo sysctl -a

# Voir une valeur spécifique
sudo sysctl net.ipv4.tcp_congestion_control

# Appliquer un changement temporaire
sudo sysctl -w net.core.somaxconn=65535

# Recharger toute la config sysctl
sudo sysctl --system

# Limites courantes d'un user
ulimit -a

# File descriptors ouverts par un process
ls /proc/PID/fd | wc -l

# Connections TCP actuelles
ss -tn state established | wc -l

Conclusion

Avec ces optimisations, votre VPS Linux est prêt à encaisser de gros volumes. Bénéfices typiques observés :

  • +50 à +150% débit TCP grâce à BBR
  • 2-5x plus de connexions simultanées grâce aux file descriptors
  • Latence réduite sur les nouveaux établissements TCP

Pour aller plus loin :

  • Activez NUMA awareness si votre VPS a 8+ cores
  • Tunez le IRQ affinity pour binder les interruptions réseau
  • Utilisez eBPF/XDP pour du networking ultra-rapide (cas extrêmes)

Ressources

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres