31.7. Identifier les goulots d'étranglement de la mémoire tampon de la socket de lecture de l'application
Si les applications TCP n'effacent pas les tampons de lecture de la socket assez fréquemment, la performance peut en souffrir et des paquets peuvent être perdus. Red Hat Enterprise Linux fournit différents utilitaires pour identifier de tels problèmes.
31.7.1. Identification de l'effondrement et de l'élagage de la mémoire tampon de réception
Lorsque les données de la file d'attente de réception dépassent la taille du tampon de réception, la pile TCP tente de libérer de l'espace en supprimant les métadonnées inutiles du tampon de la socket. Cette étape est connue sous le nom de "collapsing".
Si l'effondrement ne parvient pas à libérer suffisamment d'espace pour le trafic supplémentaire, le noyau élague les nouvelles données qui arrivent. Cela signifie que le noyau supprime les données de la mémoire et que le paquet est perdu.
Pour éviter les opérations de réduction et d'élagage, surveillez si la réduction et l'élagage des tampons TCP se produisent sur votre serveur et, dans ce cas, réglez les tampons TCP.
Procédure
Utilisez l'utilitaire
nstat
pour interroger les compteursTcpExtTCPRcvCollapsed
etTcpExtRcvPruned
:# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
Attendez un peu et exécutez à nouveau la commande
nstat
:# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0
Si les valeurs des compteurs ont augmenté par rapport à la première exécution, un réglage est nécessaire :
-
Si l'application utilise l'appel
setsockopt(SO_RCVBUF)
, envisagez de le supprimer. Avec cet appel, l'application n'utilise que la taille du tampon de réception spécifiée dans l'appel et désactive la capacité de la socket à ajuster automatiquement sa taille. -
Si l'application n'utilise pas l'appel
setsockopt(SO_RCVBUF)
, réglez les valeurs par défaut et maximale de la mémoire tampon de la socket TCP read.
-
Si l'application utilise l'appel
Affichez la file d'attente des commandes en attente de réception (
Recv-Q
) :# ss -nti State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.0.2.1:443 192.0.2.125:41574 :7,7 ... lastrcv:543 ... ESTAB 78 0 192.0.2.1:443 192.0.2.56:42612 :7,7 ... lastrcv:658 ... ESTAB 88 0 192.0.2.1:443 192.0.2.97:40313 :7,7 ... lastrcv:5764 ... ...
Exécutez la commande
ss -nt
plusieurs fois en attendant quelques secondes entre chaque exécution.Si la sortie ne mentionne qu'un seul cas de valeur élevée dans la colonne
Recv-Q
, l'application se trouvait entre deux opérations de réception. Toutefois, si les valeurs deRecv-Q
restent constantes alors quelastrcv
augmente continuellement ou queRecv-Q
augmente continuellement au fil du temps, l'un des problèmes suivants peut en être la cause :- L'application ne vérifie pas ses tampons de socket assez souvent. Contactez le fournisseur de l'application pour savoir comment résoudre ce problème.
L'application n'a pas assez de temps d'utilisation du processeur. Pour déboguer davantage ce problème :
Affichage des cœurs de l'unité centrale sur lesquels l'application s'exécute :
# ps -eo pid,tid,psr,pcpu,stat,wchan:20,comm PID TID PSR %CPU STAT WCHAN COMMAND ... 44594 44594 5 0.0 Ss do_select httpd 44595 44595 3 0.0 S skb_wait_for_more_pa httpd 44596 44596 5 0.0 Sl pipe_read httpd 44597 44597 5 0.0 Sl pipe_read httpd 44602 44602 5 0.0 Sl pipe_read httpd ...
La colonne
PSR
affiche les cœurs de l'unité centrale auxquels le processus est actuellement affecté.- Identifier les autres processus s'exécutant sur les mêmes cœurs et envisager de les affecter à d'autres cœurs.
Ressources supplémentaires