neighbour table overflow 问题解决

本文详细记录了一次服务器故障排查过程,针对neighbourtableoverflow错误进行深入分析,揭示了错误背后的原因在于默认路由配置不当,并给出了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接到保障,说某来机器服务没法访问,于是,准备连接到机器上去看个究竟.

尼玛居然连不上,连ping都ping不通,无奈只能求助机房. 机房人员检查, 发现报 neighbour table overflow 错误. 无奈让机房的人员重启了服务器.


查找原因,搜索得到如下说法:


第一种说法:

内核维护的arp表过于庞大, 发生抖动, 因此导致了这种情况,几个内核ARP参数:
=================================
gc_stale_time
决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。
gc_thresh1
存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。
gc_thresh2
保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512。
gc_thresh3
保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。
=================================
比如arp -an|wc -l的结果是300左右, 那么应当调高gc_thresh各项数值,防止抖动的发生:
echo "net.ipv4.neigh.default.gc_thresh1 = 512" >> sysctl.conf
echo "net.ipv4.neigh.default.gc_thresh2 = 2048" >> sysctl.conf
echo "net.ipv4.neigh.default.gc_thresh3 = 4096" >> sysctl.conf

或者

echo 120 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 512 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

第二种说法:
默认路由或者子网掩码设置错误,检查

第三种说法:
内核编译错误

第四种说法:
原来那台机器的iptables没有开,不知道开了以后会不会好了,等等看吧。


于是查看了下 ARP 表,发现ARP表不断的在增长.一度增长到730多条记录.理论上来说,机器应该只会保存一条ARP记录,就是网关的.而现在保存了很多条记录,都是公网IP对应网关MAC地址的记录.以为是机器被人入侵了,种下了ARP欺骗神马的程序. 通过 tcpdump 抓包发现,确实是本机不断的在发送ARP请求包. 找了一个多小时,硬是没找到原因.

后来通过访问本机上的某个服务,ARP表中立即就增加了一条ARP记录. 是我的出口的IP,对应的服务器网关的MAC.

于是,理了一下思绪,为什么ARP表中的记录不是网关的MAC,而是直接对应我用户的公网IP和服务器网关的MAC地址.看一下网络通信的流程:


1. 用户请求服务器的服务到达服务器

2. 服务器响应请求,首先查找本机的路由表,如果有路由,直接通过该接口将数据丢过去.如果没有路由,则将数据丢给默认网关.

3. 丢数据出去,得解析ARP,将IP转换为MAC地址. 二层都是通过MAC地址通信的嘛

4. 于是查找本地的MAC地址表,有记录则发送过去.没记录,则广播ARP. 问谁是 x.x.x.x .

5. 现在的问题很显然是服务器在不断的广播ARP,而响应的则是服务器网关.而服务器网关是交换机.顺便查了下,交换机的代理ARP功能. 而这个功能交换机一般默认都是开启的.

6. 于是不断的添加ARP记录到ARP表中,都是用户的访问IP和网关的MAC地址

6. 尼玛去查了一下路由表,震惊了. 网关居然配置的自己本身的接口IP地址,而不是网关的IP. 怪不得.

7. 默认路由是自己的接口IP,为嘛还能与外界通信? 因为服务器是跟网关直连的呀! 我勒个擦


所以, 我这个问题,验证了第二种方法,默认路由或者子网掩码设置错误!

而这个错误,导致了ARP记录过于庞大,最终服务器挂了.




<think>我们遇到一个DLL加载失败的错误,具体是在尝试从neighbour_table_ext模块导入时失败。错误信息指出在指定路径下存在一个.pyd文件(neighbour_table_ext.cp39-win_amd64.pyd),但无法加载,因为找不到指定的模块。 .pyd文件是Python的扩展模块,本质上是DLL文件。这种错误通常由以下原因引起: 1. 依赖的DLL缺失:该.pyd文件可能依赖其他DLL,而这些DLL在系统路径中不可用。 2. 环境问题:可能是由于环境变量(如PATH)没有包含必要的路径,或者当前环境(如Anaconda环境)中缺少运行时库(如Visual C++ Redistributable)。 3. 版本不匹配:该.pyd文件可能是为特定版本的Python编译的,而当前使用的Python版本不匹配,或者与当前系统的架构(如64位)不兼容。 4. 文件损坏:.pyd文件本身可能已损坏。 根据错误信息,我们使用的是Python 3.9(因为文件名中有cp39)和64位Windows(win_amd64)。因此,我们需要确保: - 系统上安装了与Python 3.9兼容的Visual C++ Redistributable(特别是用于构建该扩展的版本,通常是Visual Studio 2015-2019或2022)。 - 检查环境变量PATH是否包含必要的路径,特别是包含所需DLL的路径。 ### 解决步骤: 1. **安装Visual C++ Redistributable**: - 访问Microsoft官方下载页面:https://aka.ms/vs/16/release/vc_redist.x64.exe - 下载并安装适用于Visual Studio 2015、2017、2019和2022的VC++运行时库(因为Python 3.5及以上版本通常使用VC++14编译,即VS2015-2022)。 2. **检查环境变量**: - 确保Anaconda环境的路径(如`C:\Anaconda\envs\anuga`)在系统PATH中。 - 如果.pyd文件依赖其他第三方DLL,确保这些DLL所在的目录也在PATH中。 3. **检查Python环境**: - 确认当前激活的环境是`anuga`,并且该环境中安装了正确版本的anuga包。 - 尝试重新安装anuga包,以确保.pyd文件没有损坏。 4. **使用Dependency Walker检查依赖**: - 下载Dependency Walker(depends.exe)工具:https://www.dependencywalker.com/ - 使用该工具打开`neighbour_table_ext.cp39-win_amd64.pyd`文件,查看缺少哪些DLL。 - 根据缺少的DLL,将其所在目录添加到PATH,或者安装相应的运行时。 ### 具体操作建议: 1. 首先,安装最新的Visual C++ Redistributable(x64版本)。 2. 如果问题仍然存在,尝试重新创建anuga环境并重新安装anuga: ```bash conda create -n anuga python=3.9 conda activate anuga pip install anuga ``` 3. 如果还是不行,使用Dependency Walker检查依赖。 ### 注意: 如果anuga库是通过源码编译安装的,可能需要确保编译环境与运行环境一致。但根据路径(`...\site-packages\anuga\...`)来看,可能是通过pip安装的预编译包,所以重点检查运行时环境。 §§相关问题§§ 1. 如何检查Windows系统中是否安装了正确的Visual C++ Redistributable? 2. 在Anaconda环境中,如何查看当前环境变量PATH的设置? 3. 使用Dependency Walker时,如何识别并解决缺失的DLL依赖? 4. 如果重新安装anuga包后问题依旧,还有哪些可能的解决方法?</think>### 错误分析与解决方案 该错误表明 Python 在导入 `neighbour_table_ext` 模块时无法加载所需的 DLL 文件(`.pyd` 本质是 Windows 的 DLL)。核心原因是 **依赖库缺失或环境配置问题**,具体排查方向如下: --- #### **1. 安装 Visual C++ 运行时库** - **问题原因**:`.pyd` 文件通常依赖 VC++ 运行时库(如 `msvcp140.dll`, `vcruntime140.dll`)。 - **解决方案**: 1. 下载并安装 [Microsoft Visual C++ Redistributable](https://aka.ms/vs/16/release/vc_redist.x64.exe)(选择 **64位版本**)。 2. 重启系统使环境变量生效。 #### **2. 检查 Python 环境兼容性** - **问题原因**:`.pyd` 文件名 `cp39-win_amd64` 表明它是为 **Python 3.9 + 64位系统** 编译的。若环境不匹配(如使用 32 位 Python),将导致加载失败。 - **解决方案**: 1. 确认当前环境:在终端执行: ```bash conda activate anuga python -c "import sys; print(sys.version, sys.executable)" ``` 2. 检查输出是否包含 `64 bit` 和 `Python 3.9.x`。 #### **3. 修复 Anaconda 环境** - **问题原因**:环境依赖项损坏或路径冲突。 - **解决方案**: 1. 重建环境: ```bash conda remove -n anuga --all conda create -n anuga python=3.9 conda activate anuga pip install anuga ``` 2. 检查环境变量:确保 `PATH` 不包含旧 Python 路径(如 `C:\Anaconda\envs\anuga` 应优先于其他路径)。 #### **4. 手动验证 DLL 依赖** - **工具**:使用 [Dependency Walker](https://www.dependencywalker.com/) 分析 `neighbour_table_ext.cp39-win_amd64.pyd`。 - **步骤**: 1. 将 `.pyd` 文件拖入 Dependency Walker。 2. 检查标红的 **缺失 DLL**(如 `MSVCP140.dll`)。 3. 根据缺失项安装对应运行时库。 --- ### 总结排查流程: 1. ✅ 安装 VC++ 运行时库(64位) 2. ✅ 确认 Python 为 64 位 + 版本 3.9 3. ✅ 重建 Conda 环境并重装 anuga 4. ✅ 用 Dependency Walker 分析缺失 DLL 若问题仍存在,可能是 anuga 库的预编译包与系统不兼容,建议联系开发者或从源码编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值