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
- Documentation kernel sysctl : https://www.kernel.org/doc/Documentation/sysctl/
- TCP BBR (Google) : https://github.com/google/bbr


















