suricata架构——数据结构和代码流程图解
Suricata是一款高性能网络入侵检测防御引擎。该引擎基于多线程,充分利用多核优势。
数据结构
流程
行锁
表锁哈希表,只有一把锁,内存少,实现简单,但是在并发访问时,效率极其低下;
行级锁哈希表则每一行都有一把锁,内存开销大,实现复杂,但是在大并发,高效率的后台服务程序中使用非常广泛。suricata就声称自己可以处理万兆网络,这和多线程架构和更细粒度的锁的机制是分不开的。
先解释一下为什么suricata为什么会使用到行锁,suricata针对snort单线程处理数据包,无法很好利用多核cpu的劣势,开发了多线程架构方式并发处理数据包,而很多数据是线程间共享,所以在很多地方使用行级锁哈希表等其他高效数据结构。第一个行锁使用的地方就是连接管理模块(哈希表,检索速度O(1))
typedef struct FlowBucket_ {Flow *head; /* 链表头*/Flow *tail;/* 链表尾*//* 行锁类型*/
#ifdef FBLOCK_MUTEXSCMutex m;
#elif defined FBLOCK_SPINSCSpinlock s;
#else#error Enable FBLOCK_SPIN or FBLOCK_MUTEX
#endif
} __attribute__((aligned(CLS))) FlowBucket;typedef struct Flow_
{...
/* 节点锁,提高并发*/
#ifdef FLOWLOCK_RWLOCKSCRWLock r;
#elif defined FLOWLOCK_MUTEXSCMutex m;
#else#error Enable FLOWLOCK_RWLOCK or FLOWLOCK_MUTEX
#endif
.../* 由hnext hprev 构成双向链表 *//** hash list pointers, protected by fb->s */struct Flow_ *hnext; /* hash list */struct Flow_ *hprev;
...
} Flow;
flow_hash是一个数组,每个FlowBucket 元素由 head 、tail和flow的hnext、hprev 构成一个双向链表,也就是所谓的行。
nf_conntrack_lock
对比linux内核网络协议栈。
nfconntrack中一个最重要的锁,就是全局的nf_conntrack_lock。这个锁的作用是保护全局会话表。当CPU尝试用当前数据包skb进行会话匹配,或者准备插入新的会话时,都需要对nf_conntrack_lock进行上锁。试想,在大流量的环境中,每个经过设备的数据包都要进行会话匹配,在多核的情况下,对这个锁的竞争是非常激烈的。
现在要减小锁的粒度,最直观的想法是,将以前的全局锁,变成基于桶的锁,一个hash桶就使用一个锁。这个想法,从思路上是没有问题的,但是对于会话表来说,其桶的个数一般很大。如果每个桶一个锁的话,会消耗掉不少内存。
一个折中的办法是:每个锁负责保障多个桶的安全,这样就不需要一个桶对应一个锁了,这样既提高了并发性,又没有增加太多内存消耗。这个方法在3.18版本才被引入到linux内核。
参考:
https://suricata.readthedocs.io
http://www.hyuuhit.com/categories/suricata/
https://blog.csdn.net/weixin_34253126/article/details/86442134
https://www.jianshu.com/p/46db186014e0
suricata 源码分析之行锁
suricata架构——数据结构和代码流程图解相关推荐
- data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解
本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...
- 信息架构和零代码应用搭建
文/明道云创始人任向晖 本文来自即将出版的<零代码企业应用搭建指南>中的关键章节,指导用户进行相对复杂应用的前期信息架构工作. 零代码平台赋能了业务开发者,让他们可以不写代码就能完成应用实 ...
- MySQL系列---架构与SQL执行流程详解
文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...
- (11)高通AP10.4开发者指南——WLAN(2.5 代码流程)
2.5 代码流程(Code Flow) 这部分讲解一些主要的配置通路.收发数据的通路.下面这些颜色,用于区分不同的模块. 2.5.1配置通路(Configuration Path) WLAN驱动的配置 ...
- day02Web开发流程图解
Web开发流程图解 一 需求分析阶段 二 项目开发阶段 2.1产品设计.>PM\UE\UI 2.2测试用例.>QA 2.3前端设计.>FD 2.4后端设计.>RD 2.5开发 ...
- Camera camx代码结构、编译、代码流程简介
文章目录 一.camx 代码结构 二.camx 编译 三.camx 代码流程分析 转载链接: https://juejin.cn/post/6870358276425875463 https://ww ...
- 游戏公司组成架构和游戏开发流程简述
游戏公司组成架构和游戏开发流程简述 [基本概念] 游戏公司一般是指游戏开发公司或游戏发行.代理公司. 那游戏公司开发游戏需要哪些技术人员?简单的说:需要游戏造型.游戏动画.3D美工.纹理师.原画设计师 ...
- 3-uboot-spl代码流程
[uboot] (第三章)uboot流程--uboot-spl代码流程 2016年10月28日 16:24:14 阅读数:2077 以下例子都以project X项目tiny210(s5pv210平台 ...
- Spark架构与作业执行流程简介
2019独角兽企业重金招聘Python工程师标准>>> Spark架构与作业执行流程简介 博客分类: spark Local模式 运行Spark最简单的方法是通过Local模式(即伪 ...
最新文章
- Devstack单节点环境实战配置
- 单点登陆框架CAS的研究
- 使用扩展技术对SAP Fiori应用进行端到端的增强,一个实际案例介绍
- Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
- 如何在Angular 10中生成QR码
- python登录界面源码_基于Python的自媒体小助手---登录页面的实现代码
- 一个关于反序列化的小问题
- 4.23上海交大PMP试题每日一题
- python爬虫淘宝评论图片_淘宝上的图片是怎么被爬取的
- 并行学习框架下基于GAN的城市道路网短时路段交通预测方法
- 数控切削加工尺寸不稳定怎么办?这么办!
- Android数据排序之集合排序
- 云计算入门:10个基本知识
- [2022-04-27] refresh PDB
- 修改select2未搜索到数据时的提示语
- 【项目实战】IPC摄像头在线状态ping检测与告警邮件发送项目总结
- linux多核cpu 优化,Ubuntu是否针对多核CPU进行了优化?
- AVFoundation
- 7-12 打印倒直角三角形图案
- AILearning 吴恩达 L1 Week2 02 用神经网络思想实现Logistic回归(Cat)
热门文章
- div不继承父类样式_Java三大特性之继承
- java arraylist_死磕 java集合之ArrayList源码分析
- linux device_create_file属性 怎么调用,device_create_file创建多级目录
- 怎样用计算机kd求平均数,利用pandas和numpy计算表中每一列的均值
- Nginx核心模块ngx_http_proxy_module与nginx反向代理、负载均衡详解
- MAC 安装brew raw.githubusercontent.com port 443: Connection refused 本人亲自认证过,踩过多种方案,最终认证的解决方案
- Docker及K8S使用碎碎记
- IDEA启动hadoop报Could not locate executable null\bin\winutils.exe in the Hadoop binaries.错误的解决办法
- 计算机用户权限设置不了,电脑中怎样设置everyone权限
- mysql查看当前数据库的连接信息_查看 mysql 数据库当前连接数