使用Python+Netmiko批量检查千余台Cisco路由器时钟遇线程超时问题
解决Netmiko多线程250+时读取超时的问题
针对你用Python+Netmiko批量检查1000台Cisco路由器时钟,线程数250+出现读取超时的问题,以下是几个常见原因和解决思路:
1. 设备端SSH并发连接限制
Cisco路由器默认对SSH并发连接数有严格限制(比如部分型号默认ip ssh max-startups为10,ip ssh limit-time为120秒),当大量线程同时发起连接,超过设备处理上限时,后续连接就会超时。
- 解决办法:
- 登录设备检查当前SSH配置:
show running-config | include ip ssh,根据设备性能适当调高ip ssh max-startups(比如调到50),但不要设置过高避免设备过载。 - 控制线程池大小,将
max_workers降到设备能承受的范围(比如50-100),用concurrent.futures.ThreadPoolExecutor管理线程,避免无限制创建线程。
- 登录设备检查当前SSH配置:
2. 本地客户端端口耗尽
线程数过多时,本地TCP客户端端口会被快速耗尽,新连接无法分配到端口,进而导致超时。
- 解决办法:
- 调整系统TCP参数加速端口回收:
- Linux系统:执行
sysctl -w net.ipv4.tcp_tw_reuse=1和sysctl -w net.ipv4.tcp_fin_timeout=30,也可写入/etc/sysctl.conf永久生效。 - Windows系统:修改注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的TcpTimedWaitDelay(设为30)和MaxUserPort(设为65534)。
- Linux系统:执行
- 改用线程池而非手动创建大量线程,线程池会复用线程,减少端口占用。
- 调整系统TCP参数加速端口回收:
3. Netmiko超时参数设置不合理
默认的read_timeout(30秒)可能不足以应对高负载设备的响应延迟,导致读取命令输出时超时。
- 解决办法:
- 初始化连接时增大超时参数:
device = { 'device_type': 'cisco_ios', 'ip': 'x.x.x.x', 'username': 'xxx', 'password': 'xxx', 'timeout': 60, # 连接超时时间 'read_timeout': 60 # 命令输出读取超时时间 } - 执行命令时单独指定更长的读取超时:
output = conn.send_command("show clock", read_timeout=60)
- 初始化连接时增大超时参数:
4. 网络资源瓶颈
大量并发连接会占用带宽,导致数据包延迟或丢失,触发读取超时。
- 解决办法:
- 分批次执行任务,比如每次处理100台,处理完一批后暂停1-2分钟再处理下一批,给网络和设备缓冲时间。
- 按网段分组执行,避免同一网段同时发起大量连接,分散网络压力。
5. 连接资源泄漏
线程结束后未正确关闭Netmiko连接,导致设备端连接未释放,后续新连接被拒绝或超时。
- 解决办法:
- 使用
with语句自动管理连接,确保连接会被关闭:def check_device_clock(device_info): try: with ConnectHandler(**device_info) as conn: clock_output = conn.send_command("show clock") # 处理时钟信息,比如写入日志或数据库 print(f"{device_info['ip']} clock: {clock_output}") except Exception as e: print(f"{device_info['ip']} failed: {str(e)}") - 如果不用
with,一定要在finally块中调用conn.disconnect(),确保无论是否出现异常都能关闭连接。
- 使用
内容的提问来源于stack exchange,提问作者Shashi Dhar
相关产品推荐
相关产品推荐

