0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

io_uring 优化 nginx,基于通用应用 nginx 的实战

Linux阅码场 来源:Linuxer 作者:Linuxer 2020-10-10 16:19 次阅读

引言

io_uring是Linux内核在v5.1引入的一套异步IO接口,随着其迅速发展,现在的io_uring已经远远超过了纯IO的范畴。从Linux v5.3版本开始,io_uring陆续添加了网络编程相关的API,对用户提供sendmsg、recvmsg、accept、connect等接口的异步支持,将io_uring的生态范围扩大到了网络领域。

另外从Linux v5.7开始,io_uring对这些异步接口提供FAST POLL机制,用户无需再使用像select、event poll等多路复用机制来监听文件句柄,只要把读写请求直接丢到io_uring的submit queue中并提交,当文件句柄不可读写时,内核会主动添加poll handler,当文件句柄可读写时主动调用poll handler再次下发读写请求,从而减少系统调用次数提高性能。

上一篇我们初探了 io_uring 用于网络的编程模型以及 echo server benchmark 下的性能表现,这篇文章我们将基于通用应用 nginx 实战。

Nginx io_uring 代码优化

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

从架构上看,Nginx由一个master和多个worker进程组成,多个worker之间不需要加锁,独立处理与client的连接和网络请求。worker是一个单线程大循环,这与上一篇“你认为 io_uring 只适用于存储 IO?大错特错!”文章中描述的 echo server 模型基本一致。

基于event poll的编程模型

event poll是Nginx在Linux下的默认事件模型。

event poll事件模型把listen fd以及新建连接的sock fd都注册进event poll中,当这些fd上有数据可读时,等待在epoll_wait()的worker进程会被唤醒,调用相应的回调函数进行处理,这里的recv、writev请求都为同步请求。

基于io_uring的编程模型

前面提到,io_uring的FAST POLL机制允许数据在未ready的情况下就直接下发,不需要再把普通连接的fd注册进event poll。另外这里的读写请求通过io_uring异步下发,处理流程大致如下:

事实上,accept()也可以采取FAFST POLL机制,无需等待listen_fd数据可读就直接下发,以减少系统调用次数。但在调试过程中发现这样accept()失败概率大大增加,而每次失败的accept()都会带来一次无效的sock内存申请和释放,这个开销较大,因此依然采用类似event poll的方式来侦听listen fd。后续针对这块可以做一些优化。

测试结果

测试环境

测试机器
CPU: Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz 64逻辑核
server cmdline添加:mitigation=on

nginx配置

user root;http { access_log off; server { access_log off; // 关闭access log,否则会写日志,影响测试 location / { return 200; // 不读本地文件,直接返回200 } }}

benchmark
使用轻量级HTTP性能测试工具wrk进行压测。

测试命令

长连接 wrk -c $connection -t $thread -d 120 $url短连接wrk-c$connection-t$thread-H"Connection:Close"-d120$url

测试结果

长连接

• connection=1000,thread=200, 测试server上不同worker数目性能。

worker数目在8以下时,QPS有20%左右的提升。随着worker数目增大,CPU不成为瓶颈,收益逐渐降低。

server单worker,测试client端不同连接数性能(thread取默认数2)。

可以看到单worker情况下,500个连接以上,QPS有20%以上的提升。从系统调用数目上看,io uring的系统调用数基本上在event poll的1/10以内。

短连接

• connection=1000,thread=200, 测试server上不同worker数目性能。

短连接场景,io uring相对于event poll非但没有提升,甚至在某些场景下有5%~10%的性能下降。究其原因,除了io uring框架本身带来的开销以外,还可能跟io uring编程模式下请求批量下发而带来的延迟有关。

总结及下一步工作

从笔者目前的测试来看,io_uring在网络编程方面的优化更适合长连接场景,在长连接场景下最高有20%多的提升。短连接场景还有待优化,主要考虑以下两方面:
• io uring本身框架开销的优化,当然这个优化对长连接同样适用。
• 针对短连接的优化,如针对accept()请求,先检查是否有数据可读,避免无效内存申请释放;多个accept()一起下发等。

nginx 和 echo server 等优化实践相关内容(包含源代码),我们都已经在 OpenAnolis 社区高性能存储 SIG 开源(openanolis.org)。也欢迎大家积极参与讨论和贡献,一起探索 io_uring 的高性能之路。

责任编辑:xj

原文标题:面对疾风吧!io_uring 优化 nginx 实战演练

文章出处:【微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11357

    浏览量

    210831
  • IO接口
    +关注

    关注

    0

    文章

    31

    浏览量

    13503
  • nginx
    +关注

    关注

    0

    文章

    156

    浏览量

    12265

原文标题:面对疾风吧!io_uring 优化 nginx 实战演练

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    如何通过优化Nginx配置来提高网络环境的安全性

    简介: 在当今数字化时代,网络安全至关重要。Nginx作为流行的Web服务器,不仅提供高性能,还具备强大的安全保障功能。然而,默认配置可能无法抵御所有安全威胁,因此对Nginx进行安全加固尤为重要
    的头像 发表于 02-14 17:49 548次阅读

    华为 FlexusX 与 Docker+Nginx 的高效整合之路

    前言 华为 FlexusX 携手 Docker+Nginx,高效整合,云端性能再升级!FlexusX 服务器,依托华为强大的技术实力,为 Docker 容器与 Nginx 服务器提供了完美的运行环境
    的头像 发表于 01-23 17:55 115次阅读
    华为 FlexusX 与 Docker+<b class='flag-5'>Nginx</b> 的高效整合之路

    玩转Nginx日志管理:高效排查问题的终极指南

    Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求
    的头像 发表于 12-30 13:50 243次阅读

    nginx+lua+redis实现灰度发布

    作者:马仁喜 前言: 授人以鱼不如授人以渔 .先学会用,在学原理,在学创造,可能一辈子用不到这种能力,但是不能不具备这种能力。这篇文章主要是沉淀使用nginx+lua+redis实现灰度,当我们具备
    的头像 发表于 12-17 10:01 146次阅读

    Nginx代理转发实战:零基础掌握服务器流量分发技巧

    Nginx 是最常用的反向代理工具之一,一个指令 proxy_pass搞定反向代理,对于接口代理、负载均衡很是实用,但 proxy_pass指令后面的参数很有讲究,通常一个“/”都可能引发一个血案
    的头像 发表于 12-09 12:28 1187次阅读

    Nginx日常运维方法Linux版

    1,安装? 下载RPM:wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx
    的头像 发表于 12-06 16:38 245次阅读
    <b class='flag-5'>Nginx</b>日常运维方法Linux版

    「服务器」Nginx Proxy Manager申请cloudflare泛域名

    一概述NginxProxyManager是一个基于Nginx的反向代理管理工具,它提供了一个用户友好的Web界面,方便用户管理和配置Nginx反向代理。主要功能包括:简易的用户界面:通过图形界面
    的头像 发表于 12-06 01:03 301次阅读
    「服务器」<b class='flag-5'>Nginx</b> Proxy Manager申请cloudflare泛域名

    详解nginx中的正则表达式

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。
    的头像 发表于 12-03 09:59 392次阅读
    详解<b class='flag-5'>nginx</b>中的正则表达式

    确保网站无缝运行:Keepalived高可用与Nginx集成实战

    目录 keepalived高可用(nginx) keepalived简介 keepalived的重要功能 keepalived高可用架构图 keepalived工作原理描述 keepalived实现
    的头像 发表于 11-27 09:08 713次阅读
    确保网站无缝运行:Keepalived高可用与<b class='flag-5'>Nginx</b>集成<b class='flag-5'>实战</b>

    nginx隐藏版本号与WEB服务器信息

    nginx不仅可以隐藏版本信息,还支持自定义web服务器信息 先看看最终的隐藏结果吧 具体怎么实现呢,其实也很简单,请往下看 1 官网下载最新稳定版 wget http://nginx
    的头像 发表于 11-22 10:25 274次阅读
    <b class='flag-5'>nginx</b>隐藏版本号与WEB服务器信息

    nginx负载均衡配置介绍

    目录 nginx负载均衡 nginx负载均衡介绍 反向代理与负载均衡 nginx负载均衡配置 Keepalived高可用nginx负载均衡器 修改Web服务器的默认主页 开启
    的头像 发表于 11-10 13:39 345次阅读
    <b class='flag-5'>nginx</b>负载均衡配置介绍

    nginx中的正则表达式和location路径匹配指南

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。
    的头像 发表于 09-29 16:02 1030次阅读
    <b class='flag-5'>nginx</b>中的正则表达式和location路径匹配指南

    Jtti:美国VPS开启nginx状态监控,查看web服务器的并发连接数

    Nginx的ngx_http_stub_status_module提供能够获取Nginx自上次启动以来的工作状态的功能。如果需要启用此功能的话,需要在编译的过程中添加如下参数
    的头像 发表于 08-26 15:42 383次阅读

    nginx重启命令linux步骤是什么?

      1、验证nginx配置文件是否正确   方法一:进入nginx安装目录sbin下,输入命令./nginx -t   看到如下显示nginx.conf syntax is ok
    发表于 07-11 17:13

    nginx重启命令linux步骤是什么?

      1、验证nginx配置文件是否正确   方法一:进入nginx安装目录sbin下,输入命令./nginx -t   看到如下显示nginx.conf syntax is ok
    发表于 07-10 16:40