31 | 性能下降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
《OpenResty 从入门到实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- 高远这些年来一直有个疑虑,既然这些阻塞调用是官方极力不鼓励的,为什么不直接禁用呢?(或者加一个flag让用户选择禁用)
作者回复: 我的个人看法哈,因为 OpenResty 的周边生态还不够完善,有时候还不得不调用阻塞的库来实现一些功能。比如 1.15.8 之前调用外部的命令行还需要 os.execute,而不是 lua-resty-shell。
2019-08-0622 - HelloBug有些阻塞操作可以使用nginx线程池,使主线程腾出来。nginx是多进程,单线程的是吧,这里是会重新创建线程池?而且这里的阻塞操作不一定是异步执行的?此时执行阻塞操作的线程可以和主线程进行一个同步的操作,阻塞操作执行完了,通知主线程接着处理?
作者回复: 是的,nginx 是多进程单线程的。nginx 是有线程池的,可以参考:https://www.infoq.cn/article/thread-pools-boost-performance-9x 这里面的流程图:)
2019-08-181 - 刘丹请问最新版的OpenResty里有ngx.io模块吗?另外ngx.log好像每条日志记录不能超过4K字节,能否改大?
作者回复: 你说的 ngx.io 是指操作文件的库吗?这个并没有带,还是要用 Lua 的库。 ngx.log 的这个限制没法修改。
2019-08-0521 - yousanngx.log是阻塞的吗,为什么说是不小的开销呢2020-07-193
- 北冥Master一个worker对应有几个协程?2019-11-20
- HelloBugngx.log是否有缓存,记得QQ群里讨论过一次,这里没有缓存,而是access.log写的时候有缓存?我来调查一下吧2019-08-18
- Geek_41dcbasock=ngx.req.socket() while sock.receive(10) 虽然调用非阻塞receive,但也算个阻塞操作吧! 我这么干了一次,nginx时间就不更新,看了一下底层实现,有数据可读不会去yield。2019-08-05
收起评论