Suricata6.0流表管理源码注释七:流的老化03

博客详细解析了Suricata6.0中流老化的过程,包括FlowTimeoutHashInChunks函数如何按时间分段处理bucket,限制每次遍历的bucket数量,以及FlowSparePoolUpdate函数如何动态调整空闲流的数量以保持合理比例。
摘要由CSDN通过智能技术生成

        流老化入口函数FlowManager检查老化过程中,如果进入紧急模式则直接调用函数FlowTimeoutHash进行老化处理,如果是正常模式则调用函数FlowTimeoutHashInChunks进行老化处理。

1. FlowTimeoutHashInChunks 函数

FlowManager-》FlowTimeoutHashInChunks

函数FlowTimeoutHashInChunks对线程负责bucket分时(就是分次)分范围处理,随着时间往后推移,bucket被分成多范围处理,这个范围是根据经过的秒数分割,经过多少秒,则bucket被分割成多少个范围,经过0秒,则一个范围都没有,就不会进行超时检查,因为时间没变,这个理论也是有道理的,如果经过的秒数越多,则分的范围也越多,chunks = MIN(secs_passed, pass_in_sec);chunks就是分出来的范围个数。

        实际上,思想就是限制不要每次遍历所有bukcet,而是每几秒遍历数个bucket,变量hash_pass_iter控制每次从哪个bucket开始遍历,chunks控制遍历bucket结束范围,hash_pass_iter从0开始一直到pass_in_sec=240秒(30*8),从0到240,就是控制在1秒内只能遍历一个范围的bucket,时间没变则一个bucket都不遍历,时间变了比如从50秒到51秒,则hash_pass_iter++,这样每次遍历的bucket都是往后遍历,前边因为刚刚遍历过,所以这次不会再遍历,每次遍历的bucket个数,是在这个函数内部计算,比如这个线程负责的bucket数量是65536,hash_pass_iter的循环范围最大到pass_in_sec=240秒(30*8),所以每次遍历的bucket个数等于65536/240=273,多余的bucket归最后一个范围里。

    const uint32_t min_timeout = FlowTimeoutsMin();
    const uint32_t pass_in_sec = min_timeout ? min_timeout * 8 : 60;

这块不好理解,说的也啰嗦,上边说那么多,其实也没有准确的说明白,也没有把我想表达的写出来,凑合理解吧。

struct timeval ts;

TimeGet(&ts)

cons

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种菜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值