lua_package_path 和 package.path 有什么区别?

262 views
Skip to first unread message

taka...@163.com

unread,
Jan 28, 2018, 11:05:00 PM1/28/18
to openresty
在使用lua模块的时候,我使用了以下两种方式指定路径:
1. package.path = package.path..';/usr/local/lualib/lua/?.lua';
2. lua_package_path "/usr/local/lualib/lua/?.lua;;";

对接口进行压测,方式1性能十分低下ab压测QPS约600,方式2可以达到较高性能(QPS约6000),是什么原因呢?是因为方式1会频繁加载吗?

tokers

unread,
Jan 29, 2018, 12:43:46 AM1/29/18
to openresty
Hi!

不知道你使用方案 1 的时候,是在什么阶段指定的。
方案 2 只在 init lua vm 的时候会处理一次 package.path

taka...@163.com

unread,
Jan 29, 2018, 1:20:56 AM1/29/18
to openresty
我是在rewrite阶段指定的,大概如下:

location ~ /v1{
   rewrite_by_lua_file /
usr/local/lualib/lua/check.lua;
}

然后是在check.lua中,调用其它模块的函数


在 2018年1月29日星期一 UTC+8下午1:43:46,tokers写道:

tokers

unread,
Jan 29, 2018, 1:23:31 AM1/29/18
to openresty
Hi!

如果 rewrite_by_lua 这个钩子里处理 package.path 的代码在你压测时每个请求都会执行到的话,那性能上是有损失的。
一个是字符串拼接的消耗,另外一个是全局变量的查找。

taka...@163.com

unread,
Jan 29, 2018, 1:48:03 AM1/29/18
to openresty
check.lua文件如下

package.path = package.path..';/usr/local/
lualib/lua/?.lua';
local token_checker =require "tokencheck.lua"

token_checker
.check()


你的意思是有以下两个耗时点:
1. package.path = package.path..';/usr/local/lualib/lua/?.lua';   --这个语句每次在请求进来都会字符串拼接一下,耗时A
2. token_checker.check() ;                                                      -- 这里语句调用中可能用到的全局变量查找,耗时B

A+B联合起来导致了将近10倍速的性能差,但是
如果使用lua_package_path "/usr/local/lualib/lua/?.lua;;";
则check.lua文件变为
local token_checker =require "tokencheck.lua"

token_checker
.check()

二者只差一句,是不是可以认为只是有字符串拼接导致的呢?字符串拼接也不至于带来10倍差距吧?






在 2018年1月29日星期一 UTC+8下午2:23:31,tokers写道:

tokers

unread,
Jan 29, 2018, 1:50:17 AM1/29/18
to openresty
你操作 package 这个 table 的时候,有如下这样的操作吗?

local package = package

如果没有先赋值到本地变量,那么每次操作 package,都是在操作全局变量。

taka...@163.com

unread,
Jan 29, 2018, 2:02:28 AM1/29/18
to openresty
没有这个操作,require后直接使用的,如上所示的代码

在 2018年1月29日星期一 UTC+8下午2:50:17,tokers写道:
Reply all
Reply to author
Forward
0 new messages