关于nginx-lua性能问题

548 views
Skip to first unread message

yongjian xu

unread,
Jan 26, 2016, 9:34:32 PM1/26/16
to open...@googlegroups.com
想跟大家讨论一下nginx-lua的性能问题,我目前做了一些测试,发现如下现象,不知是否正常,希望各位帮忙

测试说明:
    1)基于OpenResty1.9.7.1,单个worker进程
    2)静态文件测试,但有几个业务模块在运行(防盗链等等);
    3)客户端使用http_load,把服务端压满

测试结果:
1. 每增加一个阶段的lua脚本,QPS下降7%到8%左右(lua脚本为空)
    例如
    ####配置1 QPS 1.5W
    无lua脚本
    ####END

    ####配置2 QPS 1.3W
    header_filter_by_lua_file null.lua;
    body_filter_by_lua_file null.lua;
    access_by_lua_file null.lua;
    ####END

2. QPS与函数定义的个数近似线性负相关(只有函数定义,函数没有被调用,也没有任何其他lua代码逻辑),具体表现为:

    ####配置1,在header_filter阶段加入空的lua脚本
    header_filter_by_lua_file null.lua: QPS 13700
    ####END

    ####配置2,lua脚本中包含100个函数定义
    header_filter_by_lua_file 100FuncDef.lua:QPS 12100 (比配置1降11.6%)
    ####END

    ####配置3,lua脚本包含200个函数定义
    header_filter_by_lua_file 200FuncDef.lua:QPS 11100 (比配置2降9%)
    ####END

    ####配置4,lua脚本包含300个函数定义
    header_filter_by_lua_file 300FuncDef.lua:QPS 10200(比配置3降7.3%)
    ####END

    ####配置5,lua脚本包含400个函数定义
    header_filter_by_lua_file 400FuncDef.lua:QPS 9400(比配置4降7.8%)
    ####END

泡泡鱼

unread,
Jan 26, 2016, 11:55:42 PM1/26/16
to yongjian xu, openresty
Lua是内存cache模式?
发自我的iPhone


------------------ 原始邮件 ------------------
发件人: yongjian xu <yongj...@gmail.com>
发送时间: 2016年1月27日 10:34
收件人: openresty <open...@googlegroups.com>
主题: [openresty] 关于nginx-lua性能问题
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

yongjianchn

unread,
Jan 27, 2016, 12:23:39 AM1/27/16
to 泡泡鱼, yongjian xu, openresty
没有设置,默认就是开启的。

DeJiang Zhu

unread,
Jan 27, 2016, 1:12:28 AM1/27/16
to open...@googlegroups.com
Hello,

在 2016年1月27日 上午10:34,yongjian xu <yongj...@gmail.com>写道:
想跟大家讨论一下nginx-lua的性能问题,我目前做了一些测试,发现如下现象,不知是否正常,希望各位帮忙

测试说明:
    1)基于OpenResty1.9.7.1,单个worker进程
    2)静态文件测试,但有几个业务模块在运行(防盗链等等);
    3)客户端使用http_load,把服务端压满

测试结果:
1. 每增加一个阶段的lua脚本,QPS下降7%到8%左右(lua脚本为空)

这种场景我没测试过
多加一个阶段的 Lua,肯定是会多一些 CPU 消耗的

    例如
    ####配置1 QPS 1.5W
    无lua脚本
    ####END

    ####配置2 QPS 1.3W
    header_filter_by_lua_file null.lua;
    body_filter_by_lua_file null.lua;
    access_by_lua_file null.lua;
    ####END

2. QPS与函数定义的个数近似线性负相关(只有函数定义,函数没有被调用,也没有任何其他lua代码逻辑),具体表现为:

因为 Lua 是动态语言
你所说的定义函数,就是创建一个动态函数(无论是否有调用)
创建完了,还需要 GC
这些都需要消耗 CPU 的

实际使用中,这种都要尽量避免的
把这些函数放入一个模块里,通过 require 来引用,就是全局缓存了


    ####配置1,在header_filter阶段加入空的lua脚本
    header_filter_by_lua_file null.lua: QPS 13700
    ####END

    ####配置2,lua脚本中包含100个函数定义
    header_filter_by_lua_file 100FuncDef.lua:QPS 12100 (比配置1降11.6%)
    ####END

    ####配置3,lua脚本包含200个函数定义
    header_filter_by_lua_file 200FuncDef.lua:QPS 11100 (比配置2降9%)
    ####END

    ####配置4,lua脚本包含300个函数定义
    header_filter_by_lua_file 300FuncDef.lua:QPS 10200(比配置3降7.3%)
    ####END

    ####配置5,lua脚本包含400个函数定义
    header_filter_by_lua_file 400FuncDef.lua:QPS 9400(比配置4降7.8%)
    ####END

--

罗厚付

unread,
Jan 30, 2016, 1:38:46 AM1/30/16
to openresty
Hello,全局缓存与lua_shared_dict 有什么区别,是不是都要在init_by_lua_file 中进行设置才能成为全局的。

在 2016年1月27日星期三 UTC+8下午2:12:28,doujiang写道:

DeJiang Zhu

unread,
Jan 30, 2016, 4:52:11 AM1/30/16
to open...@googlegroups.com
Hello,

在 2016年1月30日 下午2:38,罗厚付 <luoh...@hotmail.com>写道:
Hello,全局缓存

严格来说是 vm 内全局缓存,你看我上一篇回复里的链接
 
与lua_shared_dict 有什么区别

这是 nginx 所有 worker 共享的内存词典
 
是不是都要在init_by_lua_file 中进行设置才能成为全局的。

不是 

罗厚付

unread,
Jan 30, 2016, 9:00:25 PM1/30/16
to openresty
Lua VM 是每一个nginx worker 进程一份,那应该就是有区别了。
您提到了回收,我想问下这两种缓存,效率上是不是没有太大的差距。
还有就是
init_by_lua_file 这里加载的lua文件,是不是也会gc,在什么情况下会被gc。
我看过OpenResty最佳实践,好像没提到这方面。

在 2016年1月30日星期六 UTC+8下午5:52:11,doujiang写道:

DeJiang Zhu

unread,
Jan 30, 2016, 9:30:45 PM1/30/16
to open...@googlegroups.com
Hello,

在 2016年1月31日 上午10:00,罗厚付 <luoh...@hotmail.com>写道:
Lua VM 是每一个nginx worker 进程一份,那应该就是有区别了。
您提到了回收,我想问下这两种缓存,效率上是不是没有太大的差距。

虽然都很快,但是肯定是 Lua 内更快
尤其复杂对象存在 shdict 还需要序列化,反序列化
 
还有就是init_by_lua_file 这里加载的lua文件,是不是也会gc,在什么情况下会被gc。

一样会参与 GC 的,Lua 标准的 GC 策略
Reply all
Reply to author
Forward
0 new messages