<hr class=“my12大纲无baw0 bb bc-POWER-400”/
想改进此问题吗?更新问题,使其成为堆栈溢出的主题。
已于8个月前关闭
我正在尝试配置ARP年龄超时。我想我应该将/proc/sys/net/ipv4/neigh/default/base\u reachable\u time\u ms设置为所需的超时。但尽管我将其设置为30000ms(30秒)从ARP缓存中删除一个条目仍然需要将近10分钟。读了几篇文章后,我发现影响超时的设置很少:
/proc/sys/net/ipv4/neigh/default/gc\u interval
/proc/sys/net/ipv4/neigh/default/gc\u过时时间
/proc/sys/net/ipv4/route/gc\u间隔
/proc/sys/net/ipv4/route/gc\u超时
我不确定要为这些设置什么。在Linux中,gc\u超时默认为5分钟。我将其更改为30秒,但仍然没有看到在base\u reachable\u time/2或3*base\u reachable\u time/2内删除该条目
如何设置ARP缓存的过期时间
Linux内核中的邻居缓存并不像人们想象的那么简单。我将尝试解释它的一些怪癖
实际上完全脱离缓存或只是被标记为陈旧/无效的相邻缓存项之间存在细微差别。在基本可访问时间/2和3*基本可访问时间/2之间的某个点上,该项仍将在缓存中,但它将被标记为陈旧状态。您应该能够通过“ip-s邻居秀”查看状态
[email protected]:~$ip-s邻居列表
192.168.42.1 dev eth0 lladdr 00:25:90:7d:7e:cd参考2使用184/184/139探针4过时
192.168.10.2 dev eth0 lladdr 00:1c:23:cf:0b:6a参考3使用33/28/0探头1可到达
192.168.10.1 dev eth0 lladdr 00:17:c5:d8:90:a4参考219使用275/4/121探头1可到达
当处于如上所示的陈旧状态时,如果我ping 192.168.42.1,它会立即将数据包发送到00:25:90:7d:7e:cd。大约一秒钟后,它通常会为拥有192.168.42.1的用户发送一个ARP请求,以便将其缓存更新回可访问状态。但是,为了让事情更加混乱,内核有时会更改超时值基于更高级别协议的积极反馈。这意味着,如果我ping 192.168.42.1,它会回复,那么内核可能不会麻烦发送ARP请求,因为它假设pong意味着它的ARP缓存项是有效的。如果该项处于过时状态,它也会被发生的未经请求的ARP回复更新我想看看
现在,对于大多数情况,您只需要担心处于过时状态的条目。为什么需要将该条目从缓存中完全删除?内核花费了大量精力,只需更改缓存条目的状态,而不是始终将其删除并添加到缓存中,从而避免对内存造成冲击时间
如果你真的坚持认为它不仅会被标记为过时,而且会从邻居缓存使用的hashmap中实际删除,那么你必须注意几件事。首先,如果该条目没有被使用并且过时了gc\u STALE\u time秒,那么它应该有资格被删除。如果gc\u STALE\u timep当垃圾收集器运行时(通常在gc\u interval秒之后),该条目将被删除
现在的问题是,邻居条目在被引用时不会被删除。。您将遇到的主要问题是来自ipv4路由表的引用。有很多复杂的垃圾收集内容,但需要注意的是,路由缓存的垃圾收集器位于ly在许多内核上每隔5分钟(/proc/sys/net/ipv4/route/gc_timeout秒)对条目进行一次过期。这意味着必须将相邻条目标记为过时(可能是30秒,取决于基本可访问_时间),然后在路由缓存停止引用该条目之前必须经过5分钟(如果你运气好的话),然后是gc\u stale\u time和gc\u interval的组合,在它真正被清理之前通过(因此,总的来说,大约5-10分钟会过去)
小结:您可以尝试将/proc/sys/net/ipv4/route/gc_timeout减小到一个较短的值,但是变量很多,很难控制它们。要使事情运行良好,需要付出大量的努力,不要过早地删除缓存中的条目(而只是将它们标记为过时甚至失败)