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

    文章

    11203

    浏览量

    208695
  • IO接口
    +关注

    关注

    0

    文章

    30

    浏览量

    13387
  • nginx
    +关注

    关注

    0

    文章

    142

    浏览量

    12152

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    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

    如何使用nginx反向代理功能?保姆级教程!

    一关于nginxnginx是一款高性能的开源Web服务器软件,也可以用于反向代理、负载均衡等,并且具有高性能、低内存消耗等优点。本文我们主要讲解关于nginx的反向代理功能,并在服务器上实现如下功能
    的头像 发表于 06-21 08:21 539次阅读
    如何使用<b class='flag-5'>nginx</b>反向代理功能?保姆级教程!

    核心开发者因安全策略分歧离队,Nginx分叉出freenginx项目

    值得注意的是,Nginx是一款由俄罗斯人伊戈尔•赛索耶夫(Igor Sysoev)创作,并于2004年起向公众公开的异步网页服务器平台,广泛用于反向代理、负载均衡和HTTP缓存等功能。据官方公布的2021年6月数据,Nginx已经超越Apache成为全球最受欢迎的网页服务
    的头像 发表于 02-19 15:51 377次阅读

    Apache服务器和Nginx服务器

    Apache和Nginx都是常见的开源Web服务器软件,它们用于处理HTTP请求并提供网站和应用程序的服务。下面是对Apache和Nginx的一些基本特点的比较: 一、Apache HTTP
    的头像 发表于 01-22 16:48 491次阅读

    Nginx在Windows/docker中的使用

    nginx 是一个高性能的开源反向代理服务器和 web 服务器,一般用来搭建静态资源服务器、负载均衡器、反向代理,本文将分享其在 Windows/docker 中的使用,使用 nssm 部署成服务的方案脚本,局域网中自定义域名解决https提示不安全的解决方案,以及一路踩过的坑。
    的头像 发表于 01-03 10:20 1708次阅读
    <b class='flag-5'>Nginx</b>在Windows/docker中的使用

    如何通过Nginx实现禁止国外IP访问网站

    最近不少小伙伴反馈自己维护的项目中,经常在后台可以看到来自国外IP的攻击,令人头疼。今天浩道跟大家分享如何通过Nginx来实现禁止国外IP访问网站,确保你网站免遭国外IP攻击了!
    的头像 发表于 12-01 11:12 1351次阅读
    如何通过<b class='flag-5'>Nginx</b>实现禁止国外IP访问网站

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

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

    在应用层nginx的处理流程

    数据包从网卡到nginx 本文将研究一个数据包从被网卡接收到流出应用层到底经历了什么,并探究在应用层nginx的处理流程。**注:**本文只讨论物理网卡,暂不涉及虚拟网卡。 从网卡到内存 1
    的头像 发表于 11-13 14:44 477次阅读
    在应用层<b class='flag-5'>nginx</b>的处理流程

    Nginx 如何实现高性能低消耗

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

    Nginx目录结构有哪些

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

    io_uring内核各个组件的性能

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

    异步IO框架iouring介绍

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