Process memory buffer分配机制——show buffers相关

思科设备巡检过程中,往往要求工程师注意show buffers输出的failures及misses,出于对buffer以及其中各项参数的意义的好奇,特进行了探究,遂编写此文档。

1.路由器数据转发机制

1.1 转发机制概述

(1)Process Switching

基于进程的转发,数据流量的处理需要依赖RP(Routing Processor)。

(2)Fast Switching

类似于MLS技术,数据流量在第一次被转发时,是基于进程的转发方式,需要依赖RP。

在第一次转发时,建立起转发缓存,之后处理相关数据流量时,直接查询缓存项转发,而不用依赖RP。

(3)CEF

直接根据RIB、ARP转发表等信息,构建起FIB以及Adjacency Table,不用依赖RP。

1.2 数据被路由器转发的过程

对于需要RP处理的数据,其转发过程这里进行大致介绍。

①Ingress Traffic

某个端口收到入站流量,该流量需要交给RP处理。

②Ask for buffer

InterfaceProcessor向RP发出请求,申请一块ProcessorMemory中的buffer,以待RP处理。

③Response

RP根据Processor Memory的实际情况进行回复。

如有buffer可容纳该待发packet,则其将被发送至Processor Memory的buffer中;否则则会产生丢包。

2.Cisco Buffer分配机制

2.1 Buffer概述

2.1.1 什么是Buffer

在Cisco路由器中,Processor Memory被划分为了6种不同尺寸的pools,每种pool中包含相同大小的blocks,这些blocks即被称为buffers。

2.1.2 不同Pool类型中Buffer的尺寸

①Small buffer——104 bytes

②Middle buffer——600 bytes

③Big buffer——1536 bytes

④VeryBig buffer——4520 bytes

⑤Large buffer——5024 bytes

⑥Huge buffer——18024 bytes

2.1.3 Pool与Buffer的关系

一个pool中可能存在如下情况:

(1)已分配空间

已分配空间中,是已经被创建的、占据了memory的buffers。这些buffers可能正有packet待处理,也有可能正等待packet进驻。

(2)未分配空间

未分配空间指的是,该部分空间没有buffer,当需要创建buffer时,可从中划分出buffer以供packet使用。

注意:

①Pool中所能创建的buffers总量是有限定的,该限定可能来自于memory本身的容量,也可能来自于管理员的指定。

②Buffer是按需创建而非固定充满于pool中的,因此pool没有固定的大小。

③Pool的类型决定了其中buffer的尺寸。

2.2 Buffer请求过程

2.2.1 Interface Processor如何请求

InterfaceProcessor根据待转发packet的大小,确定需申请的buffer。

Packet尺寸(单位bytes) 申请的buffer类型
<104 Small buffer
104~600 Middle buffer
600~1536 Big buffer
1536~4520 VeryBig buffer
4520~5024 Large buffer
5024~18024 Huge buffer

2.2.2 Routing Processor如何处理

(1)情况一:当前pool中有free buffer

RP将该buffer授权给interface processor。

(2)情况二:当前pool中没有free buffer,但有free space

①RP从free space中创建buffer。

②RP为该pool记录一个miss。

③RP将该buffer授权给interfaceprocessor。

(3)情况三:当前pool中无free buffer,无freespace

①RP为该pool记录一个miss。

②RP为该pool记录一个failure。

③RP检查下一等级(更大)的pool,查看是否有buffer能承载该packet。

注意:

如果各级pool中都没有可分配的buffer,该过程会一直持续到huge buffer后,被丢弃。产生failure,并不意味着丢包。

2.3 相关配置

2.3.1 show相关

showbuffers示例:

从Public buffer pools往下开始计数:

(1)第一行——buffer总数相关

①Total

当前pool中总共的buffers数量,包括inusedbuffer以及free buffer。

②Permanent

永久留存在pool中的buffer数量, pool中的buffer数量是直接受到permanent影响的,permanent应理解为buffers总数的一个下限。

(2)第二行——free buffer相关

①in free list

记录了free buffer的总数。

②min

指定了free list中最少的buffer数量,当buffer数量小于min值时,RP将主动创建buffer。

③max allowed

指定了free list中最多的buffer数量,当buffer数量达到max allowed值以上时,RP开始主动对buffer进行修剪。

注意:

①Buffer的总数受到permanent参数影响,min与max allowed影响的是freelist中的buffer数量。

②当inused buffer数量与free buffer数量之和并未超过permanent指定的buffer数时,即便free buffer数量超过了max allowed,这些buffers也不会被修剪——保证总数。

③当min值大于permanent指定的buffer总数时,RP会保证free buffer的数量至少达到min指定的buffer数量。此时buffer总数实际上直接受到min值的影响。

(3)第三行——buffer处理相关

①hits

当前pool收到buffer请求时,hits值累加。hits直观地反映了6个pools的利用情况。

②misses

当收到buffer请求,而pool中没有可用freebuffer时,misses累加。

③trims

当buffer被修剪时,trims累加。

④created

当RP创建buffer时,created累加。当收到buffer申请或free buffer数量少于min指定值时,buffer都有可能被创建。

(4)第四行——分配buffer失败相关

①failures

当没有free buffer又无法创建新的buffer时,failures累加。

RP此时将该packet移交给下一级pool。

②no memory

当由于memory空间不足而导致buffer创建失败时,此时no memory累加。

2.3.3 配置

(1)配置buffer参数

Router(config)#buffer small/middle…permanent/min-free/max-free/initial <num>

initial指的是设备刚启动时分配的临时buffer数量,之所以有这个参数,是因为设备刚启动时有建立大量控制层面会话的潜在可能,这种潜在的可能都是直接需要RP进行处理的。因此,在稳定运作之前,临时分配较大的buffer数量是合理的。

(2)如何清除buffer统计数据

目前,只能通过重启设备实现。

2.4 现象分析

以下为Cisco 2811的show version和show buffers输出:

(1)现象

从上图中可以看到,当期设备在7w0d时出现过buffer利用的高峰,并且出现了failures。

(2)流量类型判断

该设备为Cisco 2811,支持CEF并能实现硬件转发,且failures是从Small buffers开始。因此可以推断是由于control plane的流量过大而导致的buffers利用率偏高。

(3)进一步分析

buffers创建的峰值出现在7w0d时,而设备已运行了1 year,8weeks。现状态下,总共buffers 191,其中21个为free buffer;而达到峰值时,buffers数量为264,要高出现状态1.4倍。因此推断,这是由突发状况导致的(比如新启用协议、新开服务等)。

由于处理控制流量和创建buffer都依赖RP,因此,如果需要应对突发状况防止CPU利用率过高,建议的做法就是在memory中预留更多的Small buffers,牺牲内存来换保障CPU。

3.实验-Buffer不足导致的丢包

3.1 环境概述

(1)模拟环境

IOU-WEB1.2.2-23

(2)拓扑概述

①三台路由器如上图互联,运行EIGRP保证全网全通。

②R1、R2、R3的串口均使用mtu命令调整MTU值为最大值4072。

3.2 实验思路

(1)目标

通过修改中间转发的路由器R2的buffer值参数,模拟出R2由于buffer不足对实际流量的影响。

(2)使R2收到的packet尺寸尽可能大

由于某个pool中无法创建buffer时,packet是逐级向下提交的,应当尽可能保证R2收到的packet大小匹配buffer容量较高的pool——通过修改所有设备接口的MTU值到最大,可以防止由于IP分片导致的R2实际接收流量包大小过小的情况。

在模拟流量产生的设备R1、R3上,通过指定packet大小,使得生成的流量尺寸尽可能大(至少达到本地接口MTU)

(3)使R2对流量都经过RP转发

关闭CEF以及fast switching,防止R2接收到的流量不经过RP而被直接转发。

(4)使R2尽可能出现buffer短缺情况

调整R2的permanent buffer、minbuffer、max allowed buffer都为0。

3.3 关键步骤

(1)调整MTU

R2(config)#interfaces0/0

R2(config-if)#mtu4072

(2)关闭CEF及fastswitching

R2(config)#noip cef

R2(config)#interfaces0/0

R2(config-if)#noip route-cache

(3)调整buffer参数

R2(config)#buffersverybig permanent 0

R2(config)#buffersverybig min-free 0

R2(config)#buffersverybig max-free 0

R2(config)#bufferslarge permanent 0

R2(config)#bufferslarge min-free 0

R2(config)#bufferslarge max-free 0

R2(config)#buffershuge permanent 0

R2(config)#buffershuge min-free 0

R2(config)#buffershuge max-free 0

(4)R1与R3互ping

R1#ping31.31.23.3 repeat 1000000 size 18024

R3#ping31.31.12.1 repeat 100000 size 18024

3.4 实验现象

(1)R1&R3现象

(2)R2现象

可以看到从VeryBig buffers开始出现大量的failures,该failures一直延续到了Huge buffers,导致了最终丢包。

(3)R2开启CEF

R2(config)#ipcef

开启后R1、R3现象:

可以很明显地看到,开启CEF后,R1、R3上都不再丢包。

R2现象:

在开启CEF后,R2的VeryBigbuffer往下不再有hits、misses、failures的增加。

以上现象出现的原因是:开启CEF后,ICMP流量直接通过硬件转发而不再需要RP进行处理。

时间: 2024-08-03 00:51:09

Process memory buffer分配机制——show buffers相关的相关文章

一个利用memory block分配机制的高性能的内存管理器类

问题描述: 1.众所周知,内存管理机制几乎存在于一切优秀的系统中.这样做原因不外乎以下几点:1.改善性能:2.减少碎片的产生:3.侦测系统的内存使用情况,便于调错,便于了解系统的内存使用,以对系统的架构从内存使用层面上进行设计考量: 2.我前面有文已经说明,内存管理的机制一般分为:1.预先分配大量等尺寸的块,自己维护,逐次满足对单个内存单元的请求:2.释放的内存也自己维护,以便重复使用:3.使用定长和变长机制进行内存管理. 3.本文试着以较大尺寸(4096)的内存块为分配单元,然后在一个块中利用

[C++]内存管理器--谈论如何自定义内存分配机制

内存管理器–谈论如何自定义内存分配机制 Memory pools, also called fixed-size blocks allocation, is the use of pools for memory management that allows dynamic memory allocation comparable to malloc or C++'s operator new. As those implementations suffer from fragmentation

memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)

内存分配机制Slab Allocation 本文参考博客:https://my.oschina.net/bieber/blog/505458 Memcached的内存分配是以slabs为单位的,会根据初始chunk大小.增长因子.存储数据的大小实际划分出多个不同的slabs class,slab class中包含若干个等大小的trunk和一个固定48byte的item信息.trunk是按页存储的,每一页成为一个page(默认1M). 1.slabs.slab class.page三者关系: sl

list的内存分配机制分析

该程序演示了list在内存分配时候的问题.里面的备注信息是我的想法. /* 功能说明: list的内存分配机制分析. 代码说明: list所管理的内存地址可以是不连续的.程序在不断的push_back的过程中,程序仅会将操作的元素进行复制一份,保存到list中.通过复制构造函数和析构函数,可以看到这些操作. 实现方式: 限制条件或者存在的问题: 无 */ #include <iostream> #include <string> #include <list> #inc

vector的内存分配机制分析

该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. 1 /* 2 功能说明: 3 vector的内存分配机制分析. 4 代码说明: 5 vector所管理的内存地址是连续的.程序在不断的push_back的过程中,如果当前所管理的内存不能装下新的元素的时候,程序会创建更大的地址连续的空间来保存更多的元素. 6 这种机制会引起大量的无用的复制和删除操作.如果vector的元素为类结构的时候,他就会有很多临时变量产生.通过复制构造函数和析构函数,可

map的内存分配机制分析

该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代码说明: map所管理的内存地址可以是不连续的.如果key是可以通过<排序的,那么,map最后的结果是有序的.它是通过一个平衡二叉树来保存数据.所以,其查找效率极高. 实现方式: 限制条件或者存在的问题: 无 */ #include <iostream> #include <strin

Memcache简介 &amp; 内存分配机制

关于这个东西里面到底应该存放数据网上一直有很多种说法,有的说sql进行md5之后作为键值,结果作为内容存放,也有人说按照业务逻辑错放,反正是炒的不亦乐乎. 本人经过将近2年的实践,最后还是觉得要根据业务逻辑来存放,不能将sql加密然后对应结果集存放.这样做,基本上无法实现数据的及时更新,只能依靠memcahce的过期时间来更新.资讯类的静态数据比较合适,不过这种网站一般会做静态化的处理,所以memcache也发挥不了太大用途.真正有用武之地的地方是社区类网站,这类网站大部分是动态数据,而且性能要

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

Go语言内存分配机制

前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请注明出处! Go语言有两种内存分配机制 , 分别是内置函数 new() 和make(). - new() - 定义: func new(Type) * Type - 返回值是一个内存块指针 - new() 是一个内置函数, 不同于其他语言中的new操作符, 它只将内存清零, 而不是初始化内存. - make(