不好意思。。。我自己忘了 cc openresty 邮件组了,呵呵。。。现在抄送上。。。
On Tue, Mar 13, 2012 at 8:05 PM, lucas <
lzc6@vip.qq.com> wrote:
> hi,yichun:
> 我使用你开发的OpenResty实现了一个日志服务器,今天做了一下测试,发现结果并没有我预期的好,
> 为此特来请教一下是不是因为我的使用问题造成的.测试结果如下:
>
> 测试工具:apache ab
> 测试环境:公司普通开发机, linux环境.
> 测试内容:记录 '$remote_addr $arg_name $http_referer $id' 格式的日志
> 在并发10/100/200/500/1000,50000次请求的测试结果.
> 对比jboss-web(log4j)的服务器
> 用nginx lua 做的log server,性能提升在 50%+ ,但是小于100%
> 没有特别明显的优势
>
我想知道在你用 ab 压测时,什么资源是瓶颈。比如 CPU 是否跑满?磁盘 I/O 是否跑满?你使用 ab 时是否启用了 -k 选项,即是否启用 HTTP 1.0 keepalive?
当然,对于 ngx_log 而言可以适当调大写 buffer,见
http://wiki.nginx.org/HttpLogModule#access_log
> 使用jmeter,压测5分钟结果,结果linux的优势亦在50%左右,没有明显差别...
>
> ----------------------------------------结束------------------------------------------------------
>
> 对此结果我有以下猜想,请帮忙指正一下:
> 1.处理请求方面 : 两者实质上都是用linux的epoll模型
> 2.日志记录方式 : 两者对日志文件的读写都是采用的append方式.
> (log4j有写入buffer,也抵消了一些语言的优势)
> 3.lua自身的效率问题. (我已采用用的是luajit配置).
> 比较与标准的c模块,效率在一个量级的差别.
>
观察你的系统中实际的瓶颈比猜测要有效得多,呵呵。
> 如果用c模块来改写,是不是效率会有提高呢?
这决定于 CPU 时间是否是瓶颈。你这里涉及磁盘 I/O,如果磁盘写入并发度还有提高余地,也可以考虑增加 nginx worker 的数量。话说你是几核的系统,又配置了几个 worker 呢?
> 另外我看ngx_lua的说明中说会缓存lua的代码,这个是什么意思呢?
>
Lua 代码缓存的意思是,你的 Lua 代码不会每次请求都加载和编译一遍,仅在 Nginx 启动时加载和预编译一次。细节见
http://wiki.nginx.org/HttpLuaModule#lua_code_cache你应当确保 lua_code_cache 未被禁用(默认是开启的),否则性能会迅速下降。
另外,确保你没有开启 nginx 的调试日志(即在 ./configure 时没有传入 --with-debug 选项),同时你在压测时,Nginx 错误日志中没有什么特别的。
> lua代码如下:
>
> log_format show '$remote_addr $arg_name $http_referer $id';
>
> location /log {
> set $id "";
> access_by_lua '
> local id = ngx.var.cookie_id;
> if not id then
> os.setlocale("zh_CN");
> id = os.date("%Y%m%d%H%S",os.time()) .. math.random(10000);
看你的 Lua 代码,这里有优化的余地,os.time 和 os.date 会涉及系统调用,尽量使用 ngx_lua 提供的接口获取 Nginx 内部的缓存时间吧。系统调用的开销是很可观的。
由于你的邮件未涉及什么敏感信息,我顺便抄送给 openresty 邮件组,这样更多的人可以从我们的讨论中获益 :) 请在回复时也带上 ;)
Best regards,
-agentzh> local cookie = "ID=" .. id .. ";path=/";
> ngx.header["Set-Cookie"] = cookie;
> end
>
ngx.var.id = id;
> ';
> access_log logs/show.log show;
> echo "";
> }