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架构——数据结构和代码流程图解相关推荐

  1. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  2. 信息架构和零代码应用搭建

    文/明道云创始人任向晖 本文来自即将出版的<零代码企业应用搭建指南>中的关键章节,指导用户进行相对复杂应用的前期信息架构工作. 零代码平台赋能了业务开发者,让他们可以不写代码就能完成应用实 ...

  3. MySQL系列---架构与SQL执行流程详解

    文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...

  4. (11)高通AP10.4开发者指南——WLAN(2.5 代码流程)

    2.5 代码流程(Code Flow) 这部分讲解一些主要的配置通路.收发数据的通路.下面这些颜色,用于区分不同的模块. 2.5.1配置通路(Configuration Path) WLAN驱动的配置 ...

  5. day02Web开发流程图解

    Web开发流程图解 一 需求分析阶段 二 项目开发阶段 2.1产品设计.>PM\UE\UI 2.2测试用例.>QA 2.3前端设计.>FD 2.4后端设计.>RD 2.5开发 ...

  6. Camera camx代码结构、编译、代码流程简介

    文章目录 一.camx 代码结构 二.camx 编译 三.camx 代码流程分析 转载链接: https://juejin.cn/post/6870358276425875463 https://ww ...

  7. 游戏公司组成架构和游戏开发流程简述

    游戏公司组成架构和游戏开发流程简述 [基本概念] 游戏公司一般是指游戏开发公司或游戏发行.代理公司. 那游戏公司开发游戏需要哪些技术人员?简单的说:需要游戏造型.游戏动画.3D美工.纹理师.原画设计师 ...

  8. 3-uboot-spl代码流程

    [uboot] (第三章)uboot流程--uboot-spl代码流程 2016年10月28日 16:24:14 阅读数:2077 以下例子都以project X项目tiny210(s5pv210平台 ...

  9. Spark架构与作业执行流程简介

    2019独角兽企业重金招聘Python工程师标准>>> Spark架构与作业执行流程简介 博客分类: spark Local模式 运行Spark最简单的方法是通过Local模式(即伪 ...

最新文章

  1. Devstack单节点环境实战配置
  2. 单点登陆框架CAS的研究
  3. 使用扩展技术对SAP Fiori应用进行端到端的增强,一个实际案例介绍
  4. Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
  5. 如何在Angular 10中生成QR码
  6. python登录界面源码_基于Python的自媒体小助手---登录页面的实现代码
  7. 一个关于反序列化的小问题
  8. 4.23上海交大PMP试题每日一题
  9. python爬虫淘宝评论图片_淘宝上的图片是怎么被爬取的
  10. 并行学习框架下基于GAN的城市道路网短时路段交通预测方法
  11. 数控切削加工尺寸不稳定怎么办?这么办!
  12. Android数据排序之集合排序
  13. 云计算入门:10个基本知识
  14. [2022-04-27] refresh PDB
  15. 修改select2未搜索到数据时的提示语
  16. 【项目实战】IPC摄像头在线状态ping检测与告警邮件发送项目总结
  17. linux多核cpu 优化,Ubuntu是否针对多核CPU进行了优化?
  18. AVFoundation
  19. 7-12 打印倒直角三角形图案
  20. AILearning 吴恩达 L1 Week2 02 用神经网络思想实现Logistic回归(Cat)

热门文章

  1. div不继承父类样式_Java三大特性之继承
  2. java arraylist_死磕 java集合之ArrayList源码分析
  3. linux device_create_file属性 怎么调用,device_create_file创建多级目录
  4. 怎样用计算机kd求平均数,利用pandas和numpy计算表中每一列的均值
  5. Nginx核心模块ngx_http_proxy_module与nginx反向代理、负载均衡详解
  6. MAC 安装brew raw.githubusercontent.com port 443: Connection refused 本人亲自认证过,踩过多种方案,最终认证的解决方案
  7. Docker及K8S使用碎碎记
  8. IDEA启动hadoop报Could not locate executable null\bin\winutils.exe in the Hadoop binaries.错误的解决办法
  9. 计算机用户权限设置不了,电脑中怎样设置everyone权限
  10. mysql查看当前数据库的连接信息_查看 mysql 数据库当前连接数