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

    文章

    10992

    浏览量

    206745
  • IO接口
    +关注

    关注

    0

    文章

    27

    浏览量

    13273
  • nginx
    +关注

    关注

    0

    文章

    136

    浏览量

    11989

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

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

收藏 人收藏

    评论

    相关推荐

    Nginx的配置文件如何设置头信息保留真实IP不丢失

    Nginx 配置中设置头信息以保留客户端的真实 IP 地址通常是在使用反向代理的场景中需要的。当 Nginx 作为反向代理时,客户端的真实 IP 地址可能会在转发请求时丢失,因为到达应用服务器
    的头像 发表于 11-30 10:54 934次阅读

    Nginx 如何实现高性能低消耗

    Nginx 是一个轻量级的HTTP 服务程序,相比其他服务器程序如Apache,Nginx占用内存少,稳定性高,并发处理能力强。同时Nginx 还是一个反向代理服务程序,和邮件代理服务程序
    的头像 发表于 11-11 11:31 351次阅读
    <b class='flag-5'>Nginx</b> 如何实现高性能低消耗

    Nginx目录结构有哪些

    什么是NginxNginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户
    的头像 发表于 11-11 11:27 385次阅读
    <b class='flag-5'>Nginx</b>目录结构有哪些

    io_uring内核各个组件的性能

    先看看性能 io_uring 需要内核版本在5.1 及以上才支持,liburing的编译安装 很简单,直接clone 官方的代码,sudo make sudo make install 就好了,本文
    的头像 发表于 11-10 11:46 976次阅读
    <b class='flag-5'>io_uring</b>内核各个组件的性能

    linux异步io框架iouring应用

    Linux内核5.1支持了新的异步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe开发,意在提供一套公用的网络和磁盘异步IO,不过io_uring目前在
    的头像 发表于 11-08 15:39 276次阅读
    linux异步<b class='flag-5'>io</b>框架iouring应用

    Nginx常用配置与命令

    对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.j
    发表于 10-18 10:04 171次阅读
    <b class='flag-5'>Nginx</b>常用配置与命令

    不用Nginx,只用Tomcat的Http请求流程

    只用Tomcat,不用Nginx搭建Web服务,行不行?我曾经提出的愚蠢问题,今天详细给自己解释下,为什么必须用Nginx
    的头像 发表于 10-17 10:54 375次阅读

    Nginx的特点和作用 Nginx常用命令和核心配置

    Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行
    的头像 发表于 09-01 09:53 365次阅读
    <b class='flag-5'>Nginx</b>的特点和作用 <b class='flag-5'>Nginx</b>常用命令和核心配置

    【昉·星光 2 高性能RISC-V单板计算机体验】使用nginx、ffmpeg和VLC搭建简单视频直播系统

    本文将介绍——如何在VisonFive2开发板上使用nginx和http-flv模块实现视频流转发、如何使用ffmpeg推流,以及如何在PC上使用VLC播放器查看视频流的画面。本文首先介绍如何通过
    发表于 08-27 19:06

    现代异步存储访问API探索:libaio、io_uring和SPDK

    最近的高性能存储设备暴露了现有软件栈的低效,因而催生了对I/O栈的改进。Linux内核的最新API是io_uring。作者提供了第一个针对io_uring的深度研究,并且和libaio、SPDK比较
    的头像 发表于 06-27 10:54 483次阅读
    现代异步存储访问API探索:libaio、<b class='flag-5'>io_uring</b>和SPDK

    搭建Keepalived+Lvs+Nginx高可用集群负载均衡

      一、Nginx安装 二、配置反向代理 三、配置负载均衡 四、upstream指令参数 五、配置ssl证书提供https访问 六、配置ha nginx 七、LVS(Linux Virtual
    的头像 发表于 06-25 15:39 1814次阅读
    搭建Keepalived+Lvs+<b class='flag-5'>Nginx</b>高可用集群负载均衡

    Nginx日志分割方案

    nginx 默认没有提供对日志文件的分割功能,所以随着时间的增长,access.log 和 error.log 文件会越来越大,尤其是 access.log,其日志记录量比较大,更容易增长文件大小。影响日志写入性能,分割 nginx 日志的方法有很多,这里推荐利用 Log
    发表于 06-19 15:05 278次阅读
    <b class='flag-5'>Nginx</b>日志分割方案

    Nginx搭建流行架构LNMP的步骤

    LNMP是一套技术的组合,L=Linux、N=Nginx、M=MySQL(MyriDB)、P=PHP(Python)
    的头像 发表于 05-22 18:19 706次阅读
    <b class='flag-5'>Nginx</b>搭建流行架构LNMP的步骤

    Nginx 可视化管理平台操作流程

    nginx-proxy-manager 是一个反向代理管理系统,它基于 NGINX,具有漂亮干净的 Web UI。还可以获得受信任的 SSL 证书,并通过单独的配置、自定义和入侵保护来管理多个代理。它是开源的,斩获 11.8K 的 Star 数。
    的头像 发表于 05-18 09:50 467次阅读
    <b class='flag-5'>Nginx</b> 可视化管理平台操作流程

    Nginx常用的配置和基本功能讲解

    Nginx 已经广泛应用于 J-one 和 Jdos 的环境部署上,本文对 Nginx 的常用的配置和基本功能进行讲解,适合 Nginx 入门学习。
    的头像 发表于 05-04 10:25 419次阅读