On Sat, Mar 31, 2012 at 12:35 AM, chosen0ne <
chos...@gmail.com> wrote:
> 响应内容大小370k,是由多个子请求去请求磁盘文件然后合并生成的,使用的echo模块的echo_location_async指令。开了4个
> worker进程,在20000并发的情况下,有一个worker进程内存占用达到了2g。我想知道,这个多个(大约50个)并发子请求是否有关。是不
> 是需要收集完所有子请求的响应内容后才会输出,导致nginx占用很大的内存?
>
echo_location_async 并不会缓存完整个子请求的响应数据才输出,这一点不同于 ngx_lua 模块的子请求 capture 接口。考虑下面这个例子:
echo_location_async /foo;
echo_location_async /bar;
其中子请求 /foo 是得到一份响应数据就立即向下游输出一份,即是非缓存的输出模式。但 /bar 的响应数据在 /foo 的响应全部输出之前会进行缓存。一旦 /foo 的响应数据全部发出,/bar 也会像 /foo 一样进入非缓存输出模式。
根据你这里的测试数据,假设你只启用了一个 nginx worker 进程,则 2g 内存分摊到 20000 个并发请求,也不过 100KB,进一步分摊到 50 个并发子请求,每个子请求也不过 2KB 而已。当然,我不确定你究竟启用了多少个 nginx worker 进程。
Regards,
-agentzh