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
    +关注

    关注

    88

    文章

    11628

    浏览量

    217959
  • IO接口
    +关注

    关注

    0

    文章

    32

    浏览量

    13975
  • nginx
    +关注

    关注

    0

    文章

    180

    浏览量

    12966

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何基于Nginx构建微服务网关

    今天,我将分享我们团队如何基于Nginx构建了一个日均处理10亿+请求的微服务网关,以及踩过的那些坑。这套方案已经稳定运行2年+,经历过多次大促考验。
    的头像 发表于 09-02 16:29 628次阅读

    Nginx高并发优化方案

    作为一名在生产环境中摸爬滚打多年的运维工程师,我见过太多因为Nginx配置不当导致的性能瓶颈。今天分享一套完整的Nginx高并发优化方案,帮助你的系统从10万QPS突破到百万级别。
    的头像 发表于 08-13 15:51 668次阅读

    Nginx在企业环境中的调优策略

    Nginx作为现代互联网架构中最重要的Web服务器和反向代理服务器,其性能调优对企业级应用的稳定性和效率至关重要。本指南将从运维实践角度出发,详细介绍Nginx在企业环境中的各种调优策略和最佳实践。
    的头像 发表于 07-14 11:13 401次阅读

    Nginx和Apache的差异

    Nginx是一个 轻量级/高性能 的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和IMAP 协议。
    的头像 发表于 07-09 09:45 473次阅读

    Nginx配置终极指南

    Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热
    的头像 发表于 06-18 15:56 797次阅读
    <b class='flag-5'>Nginx</b>配置终极指南

    云原生环境里Nginx的故障排查思路

    本文聚焦于云原生环境下Nginx的故障排查思路。随着云原生技术的广泛应用,Nginx作为常用的高性能Web服务器和反向代理服务器,在容器化和编排的环境中面临着新的故障场景和挑战。
    的头像 发表于 06-17 13:53 638次阅读
    云原生环境里<b class='flag-5'>Nginx</b>的故障排查思路

    Nginx性能优化终极指南

    而worker 进程数默认为 1 。单进程最大连接数为1024。如下图(打开Nginx目录下的/conf/nginx.conf 文档),现在我们来对这两个数值进行调优
    的头像 发表于 06-16 13:44 912次阅读
    <b class='flag-5'>Nginx</b>性能<b class='flag-5'>优化</b>终极指南

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的头像 发表于 05-09 10:50 693次阅读

    Nginx缓存配置详解

    Nginx 是一个功能强大的 Web 服务器和反向代理服务器,它可以用于实现静态内容的缓存,缓存可以分为客户端缓存和服务端缓存。
    的头像 发表于 05-07 14:03 1037次阅读
    <b class='flag-5'>Nginx</b>缓存配置详解

    Nginx实战全攻略

    Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3 代理服务器。它以其高并发处理能力、稳定性、丰富的功能模块和低内存消耗而闻名。
    的头像 发表于 03-31 10:44 4669次阅读
    <b class='flag-5'>Nginx</b><b class='flag-5'>实战</b>全攻略

    Nginx服务优化教程

    隐藏Nginx版本号,避免安全漏洞泄漏:修改配置文件法;修改源码法
    的头像 发表于 03-12 15:57 801次阅读
    <b class='flag-5'>Nginx</b>服务<b class='flag-5'>优化</b>教程

    Nginx常见面试题总结

    Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
    的头像 发表于 03-03 09:36 1534次阅读
    <b class='flag-5'>Nginx</b>常见面试题总结

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

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

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

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

    nginx+lua+redis实现灰度发布

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