流老化入口函数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