nginx 正则匹配优化(一)


背景

在 IPV6 改造方案中使用了大量正则匹配进行域名改写,使用perf 进行分析,pcre_exec 是主要热点。

如何优化?

  1. 减少输入规模
  2. 使用pcre_jit hyperscan 等,针对库做优化(新版本的库或者其他更好的库)
  3. 计算缓存 缓存计算结果可以 针对结果的内容缓存 以及 针对输入的 中间态 匹配缓存

针对本次业务,主要选择改动较小的pcre jit 进行优化,对库的优化 也要注意版本的更新情况。

测试结果

经过系列调优(开启 pcre_jit 、更新pcre 到最新库)后,CPU 使用率 优化效果约一倍
perf pcre_exec 热点函数从13% 降低到约3%
线上空闲率提升较为明显

测试记录:使用 foreach -c 2000 -w 1 “curl -voa http://aaa.aa:82/cnr.html -x 127.1:81” 请求152KB 的html文件进行改写

  1. 系统默认pcre-8.32 nginx 编译不带 --with-pcre-jit
    配置pcre_jit on cpu 65%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    22335 root 20 0 220076 101116 1704 R 65.5 2.8 0:20.62 nginx

    配置pcre_jit off cpu 81.7%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    29177 root 20 0 219496 100832 1700 R 81.7 2.8 0:36.09 nginx

  2. 使用源码pcre-8.32 nginx 编译带 --with-pcre-jit
    配置pcre_jit on cpu 65%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    22335 root 20 0 220076 101116 1704 R 65.5 2.8 0:20.62 nginx

    配置pcre_jit off cpu 76.7%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    29177 root 20 0 219496 100832 1700 R 76.7 2.8 0:36.09 nginx

  3. 使用源码pcre-8.42 nginx 编译带 --with-pcre-jit
    配置pcre_jit on cpu 58%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    22335 root 20 0 220076 101116 1704 R 58.5 2.8 0:20.62 nginx

    配置pcre_jit off cpu 66%

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    29177 root 20 0 219496 100832 1700 R 66.7 2.8 0:36.09 nginx

原因分析

到底何为 JIT 以及 pcre 源码中的 pcre-sljit

First, a regular expression is compiled into an internal representation by pcre_compile(). The internal representation (usually called MIR - Middle Level Representation) is a sequence of byte-codes. Each byte-code is basically a command, which tells the next step for the interpreter inside pcre_exec(). The JIT compiler translates MIR to machine code when the appropriate flags are passed to pcre_study(). The returned pcre_extra data contains a pointer to a machine executable function if the machine code generation was successful.JIT compilers totally eliminate the continual reparsing of MIR. Even if the MIR code is much simpler than the original pattern string, the execution engine is full of ifs and switches, and executing them consumes considerable time. The compiled machine code only contains those machine instructions whose are absolutely necessary for this particular pattern, and nothing more.

PCRE Performance Project https://zherczeg.github.io/sljit/pcre.html

深入浅出JIT 编译器 https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/index.html

JIT 为什么能够大幅提升性能 https://www.zhihu.com/question/19672491 https://segmentfault.com/q/1010000000366720

hyperscan -Why and How to Replace Perl Compatible Regular Expressions (PCRE) with Hyperscan

https://software.intel.com/en-us/articles/why-and-how-to-replace-pcre-with-hyperscan

为何新版本性能更高,待后续研究 PCRE 版本change-log

https://abi-laboratory.pro/?view=changelog&l=pcre&v=8.42

sljit

https://zherczeg.github.io/sljit/

OPEN INFORMATION SECURITY FOUNDATION

https://oisf.net/

值得研究的软件

Suricata ebpf hyperscan

https://suricata-ids.org/news/

nginx 正则匹配优化(一)相关推荐

  1. Nginx rewrite正则匹配重写

    Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向.这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1. ...

  2. nginx location 匹配 多个规则_你需要知道的Nginx配置二三事

    Nginx是俄罗斯人Igor Sysoev基于C语言编写的十分轻量级的HTTP服务器,它主要有以下特点: 它是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器 ...

  3. 11 个 Nginx 参数性能优化工作

    工作上,需要配置 Nginx,要投入生产使用,做了一点优化工作,加上以前也经常折腾 Nginx,故记下一些优化工作. 优化 Nginx 进程数量 配置参数如下: worker_processes 1; ...

  4. nginx配置和优化详解

    本文为多篇文章集合和使用过程中的一些配置优化. 一.nginx的说明. nginx的下载地址.Nginx  是一个高性能的HTTP和反向代理服务器,他实现了http协议,服务器端的负载均衡.(与spr ...

  5. nginx location匹配优先级_一分钟搞清楚:Nginx之Location优先级

    Location表达式类型 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location = 进行 ...

  6. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

    一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...

  7. nginx location 匹配 多个规则_三道小练习助你弄懂 Nginx location 匹配

    在 Nginx 中我们可以通过配置 location 指令块,来决定一个请求 url 如何处理.如果我们编写了多条 location 指令块,如何保证各个 location 不会产生冲突?如何理清 l ...

  8. nginx location 匹配 多个规则_nginx配置location与rewrite规则教程

    nginx配置location与rewrite规则教程 location 教程 示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ...

  9. [转载+整理]Nginx Location匹配规则

    目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, 优先度 ...

最新文章

  1. Contos7 克隆实例 以及 配置网络-服务-等相关信息
  2. aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条
  3. lua学习笔记之模块、包
  4. java实现动态验证码源代码——绘制验证码的jsp
  5. ubuntu 编译 /usr/bin/ld: cannot find 问题解决
  6. rsync 3.1.1源代码编译安装配置
  7. Go原子操作 sync/atomic
  8. proc源码解析(一)--proc文件系统的内容
  9. 闭包函数和装饰器(待补充)
  10. git branch 分支管理
  11. 多元统计分析及R语言建模(第四版)--第二章多元数据的数学表达式及R使用课后习题
  12. 小米笔记本怎么恢复出厂的系统
  13. ArcGIS制图之地形图制作
  14. 【转-参考】九宫格时间管理-第三代时间管理方法:人生平衡发展的八个方向
  15. 记录虚拟机安装黑苹果
  16. java中file系统找不到指定的路径_java.io.FileNotFoundException: (系统找不到指定的路径。)怎么处理...
  17. [Power--IC]电源管理IC-STNS01
  18. [多阶段DP] 洛谷P1282 多米诺骨牌 (01背包)
  19. 板材品牌排名之饰面板-也叫贴面板
  20. 社区电脑计算机培训即将结束,电脑培训感言(2页)-原创力文档

热门文章

  1. 如何获得瑞星网络安全工程师
  2. 分区视图(转自小春BOOK)
  3. mesos+marathon平台搭建
  4. Oracle——redo+undo总结
  5. Java内存溢出详解
  6. gradle构建android项目
  7. 霍布森选择效应(Hobson choice Effect)
  8. web开发过程中经常用到的一些公共方法及操作
  9. 使用Bash编写Linux Shell脚本-7.复合命令
  10. 在RHEL5下构建基于系统用户的Postfix邮件系统