Tampons réseau#
Pourquoi#
Un serveur NTP public reçoit des paquets par rafales, en particulier lors de pics de trafic ou d’attaques par scan. Les tampons réseau par défaut du noyau sont dimensionnés pour un usage généraliste, pas pour absorber ces rafales sans perte de paquets, ni pour transporter les métadonnées supplémentaires du timestamping matériel (chapitre suivant).
Comment#
cat > /etc/sysctl.d/99-ntp-buffers.conf <<'EOF'
# Tampons L3/L4 (paquets UDP)
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
# Mémoire auxiliaire pour les métadonnées de timestamping matériel
net.core.optmem_max = 262144
# File d'attente logicielle L2 -> L3
net.core.netdev_max_backlog = 30000
# Pression mémoire UDP globale
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
EOF
sysctl --system| Directive | Signification |
|---|---|
rmem_max/wmem_max = 33554432 (32 Mio) | Plafond maximal qu’une application peut demander via setsockopt(SO_RCVBUF/SNDBUF), pas une allocation par défaut : largement au-dessus du minimum viable (quelques Mio) pour absorber une rafale sans perte, sans peser sur la RAM tant qu’aucune socket ne demande réellement ce maximum |
rmem_default/wmem_default = 1048576 (1 Mio) | Taille de tampon par défaut quand une application (comme chronyd) ne fixe pas explicitement sa propre taille, plusieurs fois supérieure au défaut Linux généraliste (~208 Kio), pour absorber des sursauts de trafic sans réglage applicatif particulier |
netdev_max_backlog = 30000 | Nombre maximal de paquets en attente entre le pilote de la carte réseau et la pile IP quand le CPU ne les traite pas assez vite (très au-dessus du défaut de 1000), un filet d’absorption de rafale avant que des paquets ne soient perdus, particulièrement utile ici où un seul cœur dédié (chapitre Affinité IRQ) traite l’ensemble du trafic entrant |
udp_mem = 65536 131072 262144 (pages mémoire) | Les trois seuils globaux de pression mémoire UDP (bas / pression / haut), sur le même principe que tcp_mem : au-delà du seuil haut, le noyau commence à réclamer de la mémoire aux sockets UDP existantes |
udp_rmem_min/udp_wmem_min = 16384 (16 Kio) | Plancher de tampon par socket UDP, relevé au-dessus du plancher Linux par défaut (4 Kio), garantit une capacité minimale même sous pression mémoire globale |
Erreurs à éviter#
- Négliger
net.core.optmem_max. C’est le paramètre le plus souvent oublié dans les guides de tuning réseau génériques, car il n’a pas d’effet visible pour du trafic UDP ordinaire. Il devient nécessaire dès qu’on active le timestamping matériel (chapitre PHC) : chaque paquet transporte alors des métadonnées supplémentaires (cmsg, control message) via ce canal auxiliaire, et unoptmem_maxtrop petit tronque silencieusement ces métadonnées. - Copier des valeurs de tuning génériques sans les adapter. Les valeurs ci-dessus sont dimensionnées pour un serveur NTP public de taille modeste. Un serveur avec un trafic beaucoup plus important nécessiterait probablement des tampons plus grands, mais un tampon surdimensionné n’apporte aucun bénéfice et gaspille simplement de la RAM.
Vérifier#
sysctl net.core.rmem_max
# Doit retourner 33554432
sysctl net.core.optmem_max
# Doit retourner 262144La preuve la plus parlante de l’utilité de ce chapitre viendra plus tard, au chapitre Vérification finale : le pourcentage de paquets recevant un horodatage matériel plutôt que logiciel dépend directement de ces réglages.