OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

31 | 性能下降10倍的真凶:阻塞函数

使用 lua-resty-logger-socket
将日志发送到远端的日志服务器
lua-resty-socket的兼容性
使用场景
架构上的调整
使用 lua-io-nginx-module 第三方C模块
使用基于 ngx.pipelua-resty-shell
使用FFI库
Nginx的事件处理
Lua协程机制
luasocket
磁盘 I/O
执行外部命令
OpenResty的性能保持高效的原因
为什么不要用阻塞操作?
性能下降10倍的真凶:阻塞函数
性能优化

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
通过前面几个章节的学习,相信你已经对 LuaJIT、OpenResty 的架构,以及 Lua API 和测试等方面有了全面的了解。下面,我们就要进入本专栏内容最多,也是最容易被忽视的性能优化章节了。
在性能优化章节中,我会带你熟悉 OpenResty 中性能优化的方方面面,并把前面章节中提到的零散内容,总结为全面的 OpenResty 的编码指南,以便你编写出更高质量的 OpenResty 代码。
要知道,提升性能并不容易,你需要考虑到系统架构优化、数据库优化、代码优化、性能测试、火焰图分析等不少步骤。但相反,降低性能却很容易,就像今天这节课的标题一样,你只需要加几行代码,就可以让性能下降 10 倍甚至更多。如果你使用了 OpenResty 来编写代码,但性能却一直提不上去,那么很可能就是因为使用了阻塞函数。
所以,在介绍性能优化的具体方法之前,让我们先来了解下 OpenResty 编程中的一个重要原则:避免使用阻塞函数
我们从小就被家长和老师教育,不要玩火,不要触碰插头,这些都是危险的行为。同样的,在 OpenResty 中也存有这种危险的行为。如果你的代码中存在阻塞的操作,就会导致性能的急剧下降,那么我们使用 OpenResty 来搭建高性能服务端的初衷,也将会落空。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OpenResty 性能优化专栏的第31篇文章强调了避免使用阻塞函数对OpenResty性能优化的重要性。文章首先解释了阻塞函数对性能的影响,指出阻塞操作会导致请求排队等待,从而拖慢整个服务的性能。针对执行外部命令和磁盘I/O的阻塞函数误用场景,提供了解决方案,包括优先使用FFI库调用外部命令或使用基于ngx.pipe的lua-resty-shell库,以及使用lua-io-nginx-module库和架构上的调整。总的来说,本文为读者提供了实用的性能优化指南,认识到阻塞操作的类型和解决方法是做好性能优化的基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 高远
    这些年来一直有个疑虑,既然这些阻塞调用是官方极力不鼓励的,为什么不直接禁用呢?(或者加一个flag让用户选择禁用)

    作者回复: 我的个人看法哈,因为 OpenResty 的周边生态还不够完善,有时候还不得不调用阻塞的库来实现一些功能。比如 1.15.8 之前调用外部的命令行还需要 os.execute,而不是 lua-resty-shell。

    2019-08-06
    2
    2
  • HelloBug
    有些阻塞操作可以使用nginx线程池,使主线程腾出来。nginx是多进程,单线程的是吧,这里是会重新创建线程池?而且这里的阻塞操作不一定是异步执行的?此时执行阻塞操作的线程可以和主线程进行一个同步的操作,阻塞操作执行完了,通知主线程接着处理?

    作者回复: 是的,nginx 是多进程单线程的。nginx 是有线程池的,可以参考:https://www.infoq.cn/article/thread-pools-boost-performance-9x 这里面的流程图:)

    2019-08-18
    1
  • 刘丹
    请问最新版的OpenResty里有ngx.io模块吗?另外ngx.log好像每条日志记录不能超过4K字节,能否改大?

    作者回复: 你说的 ngx.io 是指操作文件的库吗?这个并没有带,还是要用 Lua 的库。 ngx.log 的这个限制没法修改。

    2019-08-05
    2
    1
  • yousan
    ngx.log是阻塞的吗,为什么说是不小的开销呢
    2020-07-19
    3
  • 北冥Master
    一个worker对应有几个协程?
    2019-11-20
  • HelloBug
    ngx.log是否有缓存,记得QQ群里讨论过一次,这里没有缓存,而是access.log写的时候有缓存?我来调查一下吧
    2019-08-18
  • Geek_41dcba
    sock=ngx.req.socket() while sock.receive(10) 虽然调用非阻塞receive,但也算个阻塞操作吧! 我这么干了一次,nginx时间就不更新,看了一下底层实现,有数据可读不会去yield。
    2019-08-05
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部