Le cache voisin dans le noyau Linux n'est pas aussi simple.
Il existe des différences subtiles entre une entrée de cache voisine qui tombe entièrement du cache ou qui est simplement marquée comme obsolète/invalide. À un moment donné entre base_reachable_time /2 et 3* base_reachable_time /2, l'entrée sera toujours dans le cache, mais elle sera marquée avec un état PÉRIMÉ. Vous devriez pouvoir voir l'état avec "ip -s neighbor show".
Dans l'état STALE comme indiqué ci-dessus, si je ping 10.64.42.121, il enverra le paquet à b8:20:00:00:00:00 immédiatement. Environ une seconde plus tard, il enverra généralement une requête ARP pour qui a 10.64.42.121 afin de mettre à jour son cache à un état REACHABLE. MAIS, pour rendre les choses plus confuses, le noyau modifie parfois les valeurs de délai d'attente en fonction des commentaires positifs des protocoles de niveau supérieur. Cela signifie que si je ping 10.64.42.121 et qu'il répond, le noyau peut ne pas se soucier d'envoyer une requête ARP car il suppose que le pong signifie que son entrée de cache ARP est valide. Si l'entrée est dans l'état STALE, elle sera également mise à jour par les réponses ARP non sollicitées qu'elle verra.
Maintenant, dans la majorité des cas, l'entrée étant dans l'état STALE est tout ce dont vous devez vous soucier. Pourquoi avez-vous besoin que l'entrée soit entièrement supprimée du cache ? Le noyau fait beaucoup d'efforts pour ne pas vider la mémoire en changeant simplement l'état des entrées du cache au lieu de les supprimer et de les ajouter au cache tout le temps.
Si vous insistez vraiment pour qu'il soit non seulement marqué comme PÉRIMÉ, mais qu'il soit en fait supprimé de la table de hachage utilisée par le cache voisin, vous devez faire attention à certaines choses. Tout d'abord, si l'entrée n'a pas été utilisée et est obsolète depuis gc_stale_time secondes, il devrait pouvoir être supprimé. Si gc_stale_time passé et marqué l'entrée comme pouvant être supprimée, elle sera supprimée lors de l'exécution du ramasse-miettes (généralement après gc_interval secondes).
Maintenant, le problème est que l'entrée voisine ne sera pas supprimée si elle est référencée . La principale chose avec laquelle vous allez avoir des problèmes est la référence de la table de routage ipv4. Il y a beaucoup de choses compliquées sur le ramasse-miettes, mais la chose importante à noter est que le ramasse-miettes pour le cache de route n'expire les entrées que toutes les 5 minutes (/proc/sys/net/ipv4/route/gc_timeout secondes) sur un grand nombre de noyaux. Cela signifie que l'entrée du voisin devra être marquée comme obsolète (peut-être 30 secondes, selon base_reachable_time ), puis 5 minutes devront s'écouler avant que le cache de route cesse de référencer l'entrée (si vous avez de la chance), suivis d'une combinaison de gc_stale_time et gc_interval passer avant qu'il ne soit réellement nettoyé (donc, dans l'ensemble, entre 5 et 10 minutes s'écouleront).
Résumé :vous pouvez essayer de réduire /proc/sys/net/ipv4/route/gc_timeout à une valeur plus courte, mais il y a beaucoup de variables et il est difficile de toutes les contrôler. Beaucoup d'efforts sont déployés pour que les choses fonctionnent bien en ne supprimant pas les entrées du cache trop tôt (mais en les marquant simplement comme PÉRIMÉS ou même ÉCHEC).
gc_stale_time
est le bon paramètre à modifier pour expulser les entrées STALE de la table ARP. Mais il y a plus :
La récupération de place ARP est exécutée dans le périodique neigh_periodic_work
fonction. L'intervalle peut être modifié via la variable /proc/sys gc_interval
.
Il vérifiera alors qu'il y a au moins gc_thresh1
entrées dans la table ARP. Cela évitera de consommer des cycles CPU supplémentaires si la table est trop petite pour voir un réel avantage en termes de mémoire.
Dans votre cas, je soupçonne gc_thresh1
est la variable que vous voudrez modifier. l'abaisser forcera le GC à fonctionner plus fréquemment. Cela peut cependant avoir un impact négatif sur les performances en fonction de l'intervalle d'exécution.
Remarque :gc_thresh3
est un seuil dur. La table ne conservera jamais plus d'entrées que cette valeur. Ajustez-le avec soin.