本文档讨论路由处理器(RP)上的缓冲区丢失和故障。
本文档没有任何特定的要求。
本文档不限于特定的软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您使用的是真实网络,请确保您已经了解所有命令的潜在影响。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
RP将其处理器内存划分为多个池。每个池包含许多大小相等的内存块。这些内存块称为缓冲区。
有六个缓冲池:
小 — 104字节缓冲区
中间 — 600字节缓冲区
大 — 1524字节缓冲区
VeryBig - 4520字节缓冲区
大 — 5024字节缓冲区
巨大 — 18024字节缓冲区
例如,如果接口处理器需要将20字节的数据包传递到RP,它会“要求”使用小缓冲区。如果接口处理器需要将一个500字节的数据包传递到RP,它会请求一个中间缓冲区,等等。
注意:接口处理器必须请求一定大小的缓冲区。
当接口处理器请求缓冲时,会发生以下情况:
如果请求的池中存在空闲缓冲区,则会授予缓冲区。否则,请求会生成“miss”,缓冲区算法会尝试为该池“创建”更多缓冲区。
当IOS无法获取小缓冲区时,它不会丢弃数据包。它会增加故障计数器,并落入下一级缓冲区,即中间缓冲区,在该缓冲区请求缓冲区。如果它无法获取中间缓冲区,它会请求下一级缓冲区,即大缓冲区。此过程将一直持续,直到它到达巨大的缓冲池。如果它无法获得巨大的缓冲区,则会丢弃数据包。
使用IBM功能集时,错误几乎总是会生成故障。
虽然IBM功能可以进行进程交换,但获取缓冲区以将数据包从接口传送到RP的代码在中断级别执行。
无法在中断级别创建缓冲区;因此,错误会将其请求更多缓冲区排入RP队列。
由于无法现场创建额外的缓冲区,因此缓冲区请求失败,数据包被丢弃。
缓冲区故障是丢包最常见的原因之一。当由于缓冲区故障而丢包时,会发生以下情况:
缓冲区发生故障后,RP有一个未处理的请求,请求为特定池创建更多大小合适的缓冲区。
当RP为创建缓冲区请求提供服务时,池中可能会出现其他故障。
RP甚至无法创建更多缓冲区,因为当需要额外缓冲区时,系统中存在内存限制。
实际上,创建缓冲区操作可能需要几微秒,在这些微秒内,由于缓冲区不足,数据包会不断被丢弃。
此外,如果缓冲区的使用速度与缓冲区的创建速度一样快,则RP可能被迫在缓冲区创建上花费的时间比在数据包处理上花费的时间更多。
这可能导致RP开始快速丢弃数据包,以致性能降低并丢失会话。
幸运的是,正如本文档所讨论的,缓冲区故障问题不难识别和解决。此show buffers命令输出显示路由器缓冲池的当前状态:
dspu-7k#show buffers Buffer elements: 500 in free list (500 max allowed) 2370 hits, 0 misses, 0 created Public buffer pools: Small buffers, 104 bytes (total 16, permanent 10): 11 in free list (0 min, 10 max allowed) 1770 hits, 33 misses, 22 trims, 28 created 9 failures (0 no memory) Middle buffers, 600 bytes (total 90, permanent 90): 89 in free list (10 min, 200 max allowed) 590 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Big buffers, 1524 bytes (total 90, permanent 90): 90 in free list (5 min, 300 max allowed) 126 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) VeryBig buffers, 4520 bytes (total 10, permanent 10): 10 in free list (0 min, 300 max allowed) 50 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Large buffers, 5024 bytes (total 10, permanent 10): 10 in free list (0 min, 30 max allowed) 0 hits, 0 misses, 0 trims, 0 created 0 failures (0 no memory) Huge buffers, 18024 bytes (total 2, permanent 0): 0 in free list (0 min, 13 max allowed) 2 hits, 2 misses, 0 trims, 2 created 0 failures (0 no memory)
在 show buffer 输出中:
Total标识池中包含已用和未使用缓冲区的缓冲区总数。
永久标识池中已分配缓冲区的永久数量。这些缓冲区始终在池中,无法修剪。
在空闲列表中标识池中当前可用的缓冲区数。
Min标识RP应尝试保留在空闲列表中的最小缓冲区数:
min 参数用于在任何指定时间预测对池中缓冲区的需求。
如果可用列表中的缓冲区数低于min值,则RP会尝试为该池创建更多缓冲区。
Max-allowed标识空闲列表中允许的最大缓冲区数:
max-allowed参数可防止池独占它不再需要的缓冲区。它还会释放此内存回系统供进一步使用。
如果空闲列表中的缓冲区数量大于最大允许值,RP应尝试从池中裁减缓冲区。
Hits标识已从池请求的缓冲区数。命中计数器提供一种机制,用于确定哪个池必须满足对缓冲区的最高需求。
Misses标识请求缓冲区的次数和检测到需要池附加缓冲区的RP。换句话说,空闲列表中的缓冲区数量已降到低于最小级别。misses 计数器表示RP被强制创建额外缓冲区的次数。
Trims标识当空闲列表中的缓冲区数量超过最大允许的缓冲区数量时,RP从池中裁减的缓冲区数量。
已创建标识已在池中创建的缓冲区数。RP在以下情况下创建缓冲区:
当缓冲区需求增加,直到空闲列表中的缓冲区数量小于最小缓冲区。
由于可用列表中没有缓冲区,因此会发生错误。
前两种情况。
Failures标识IOS无法获取小缓冲区时,它不会丢弃数据包。它会增加故障计数器,并落入下一级缓冲区,即中间缓冲区,在该缓冲区请求缓冲区。如果它无法获取中间缓冲区,它会请求下一级缓冲区,即大缓冲区。此过程将一直持续,直到它到达巨大的缓冲池。如果它无法获得巨大的缓冲区,则会丢弃数据包。
没有内存标识由内存不足而无法创建额外缓冲区导致的故障数。
您可以检查每个池的特征,以确定哪些池(如果有)遇到问题。如果池似乎显示以下特征,可以调整池的参数以使路由器更好地准备处理负载:
以高速率(按命中百分比)创建的未命中数。
可用列表中的缓冲区数量始终较低。
故障数或内存未增加。
使用buffers 配置命令,可以调整每个缓冲池的以下参数:
initial — 在系统重新加载时分配的临时缓冲区。
max-free — 最大可用缓冲区数。
min-free — 可用缓冲区的最小数量。
permanent — 永久缓冲区的数量。
调整初始缓冲区,以适应路由器重新加载后会话建立流量的突发。
buffers small initial 250
这些缓冲区最终会“修剪”并返回到系统。
初始缓冲区用于处理会话建立,会话建立始终由进程交换。
在会话建立期间,快速交换缓存(由其他路由协议使用)填充;进程交换缓冲区不再需要,可能会返回给系统。
调整初始缓冲区可能不是IBM功能集的正确解决方案,因为几乎所有数据包(在会话建立后)都是进程交换的,而且无论如何都需要额外的缓冲。
注意:对于IBM进程交换功能,您应调整永久缓冲区,而不是调整临时初始缓冲区。
调整max-free缓冲区,使其值等于或大于永久缓冲区。如果所有永久缓冲区都在可用列表中,则RP不应尝试修剪永久缓冲区。Max-free可用于确保在不规则突发期间创建的未使用的缓冲区返回到系统内存。
buffers small max-free 175 buffers small permanent 125
调整最小可用缓冲区,以便该值表示任何时间所需的估计最小缓冲区数量。最小空闲可用于预测缓冲区短缺情况并确保始终有最少数量的缓冲区可用。
buffers small min-free 50
调整永久缓冲区,使该值表示正常处理所需的预估缓冲区数量。
buffers small permanent 125
永久缓冲区用于满足路由器的正常缓冲区要求(包括频繁突发)。确定正常的缓冲区要求是一个交互过程,其中show buffer输出应显示给定时间池中使用的总缓冲区。应根据所需的一致“总”缓冲区调整永久缓冲区。调整永久缓冲区时,应着重于减少创建和消除丢失和故障。
您还可以使用另外两个show命令来识别缓冲区分配问题:
show interfaces interface-identifier
show source-bridge
以下show interfaces interface-identifier命令输出示例包括用于无缓冲区的计数器:
dspu-7k#show interfaces channel 4/2 Channel4/2 is up, line protocol is up Hardware is cxBus IBM Channel MTU 4472 bytes, BW 98304 Kbit, DLY 100 usec, rely 255/255, load 1/255 Encapsulation CHANNEL, loopback not set, keepalive not set Virtual interface Last input 0:00:04, output 0:00:04, output hang never Last clearing of "show interface" counters never Output queue 0/40, 0 drops; input queue 0/75, 8 drops 5 minute input rate 0 bits/sec, 0 packets/sec 5 minute output rate 0 bits/sec, 0 packets/sec 646 packets input, 27760 bytes, 8 no buffer Received 0 broadcasts, 0 runts, 0 giants 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort 328 packets output, 16959 bytes, 0 underruns 0 output errors, 0 collisions, 0 interface resets, 0 restarts 0 output buffer failures, 0 output buffers swapped out
在show interfaces interface-identifier命令输出中:
当接口无法获取入站数据包的缓冲区时,no buffer 计数器会递增。
当接口无法获取入站数据包的缓冲区时,no buffer和drops(输入队列)计数器都会增加。
在show interfaces输出中增量的no buffer 计数器与show buffers输出中增量的misses 计数器相关。可以调整适当的缓冲池。
当为接口配置了源路由桥接(SRB)时,此show source-bridge 命令输出示例包括一个用于限制的接口计数器:
dspu-7k#show source-bridge Local Interfaces: receive transmit srn bn trn r p s n max hops cnt:bytes cnt:bytes drops Ch4/2 666 1 99 * f 7 7 7 652:26020 6:266 0 Global RSRB Parameters: TCP Queue Length maximum: 100 Ring Group 99: This TCP peer: 150.10.20.2 Maximum output TCP queue length, per peer: 100 Peers: state bg lv pkts_rx pkts_tx expl_gn drops TCP TCP 150.10.20.1 open *3 261 266 0 0 0 TCP 150.10.20.2 - *3 0 0 0 0 0 Rings: bn: 1 rn: 888 locvrt ma: 4000.7000.fff1 Buff Ring888 fwd: 0 bn: 1 RN: 666 local ma: 4000.0c48.2e80 Channel4/2 fwd: 261 bn: 1 RN: 88 remote ma: 4000.4000.fff1 TCP 150.10.20.1 fwd: 322 bn: 1 RN: 250 remote ma: 4000.300f.7c09 TCP 150.10.20.1 fwd: 0 Explorers: ------- input ------- ------- output ------- spanning all-rings total spanning all-rings total Ch4/2 0 0 0 0 1 1 Local: fastswitched 0 flushed 0 max Bps 256000 rings inputs bursts throttles output drops Ch4/2 0 0 8 0
在show source-bridge命令输出中:
当接口无法获取入站数据包的缓冲区时,throttles计数器会增加。
show interfaces命令输出中增量的throttles计数器与smiss 计数器相关,该计数器在show buffers 命令输出中增量。可以调整适当的缓冲池。