Hello!
2014/1/4 Kai Ding:
>
> 什么样算是下游写不动?所谓的下游写应该是Nginx将响应数据写入socket内核缓冲区等待发送出去,所谓的“下游写不动"应该指的是内核缓冲区满吧?
对。
> 下游写不动,Nginx收到的数据应该存放在proxy_buffers中了?
你这种说法有问题。无论下游是否写得动,Nginx 从上游收到的数据都是放在 proxy_buffers 中的。而所谓的 busy
buffers 并不是新的独立的缓冲区,而是一个一个的指针,指向 proxy_buffers
中的某些缓冲区或者缓冲区片段。物理上真正的缓冲区只有一套,那就是 proxy_buffers. 我上一封邮件中已经指出了,建议多看几遍。。。
> 那此时是不是所有的buffer都是busy
> buffer?
>
当然不是。我上一封邮件里已经指出了只有是 nginx
尝试发送并未能成功发送出去(即成功写入系统发送缓冲区)的数据(对应某些缓冲区或者某些缓冲区片段)。nginx 并不会尝试发送
proxy_buffers 里的所有数据,或者说 nginx 并不总是会尝试发送从上游接收到的所有数据到下游,这是因为有
proxy_busy_buffers_size 这个限制。请重新阅读我上一封邮件中对 proxy_busy_buffers_size
这个限制的解释。
>
> 不再向下游写更多数据,这些数据确实积压在busy buffers中,但busy
> buffers不会无限增长吧,upstream模块不是有个proxy_buffers指令来限制最大的buffer数量么?
不会无限增长。proxy_busy_buffers_size 的限制总是要小于 proxy_buffers 的总大小。
> 另外,向下游写数据的过程应该是在该socket写事件的回调函数中,当epoll发现某个socket有可写事件,就将proxy_buffer中缓存的数据写入该socket(每次写入多少?一个buffer_size大小么),这和从上游接收响应应该是两个独立的过程?
一般情况下是独立的过程,只有当下游写不动时才会对上游的读取操作产生负反馈。
> 还是说从上游接收响应数据过程其实也会有向下游写的过程?
我觉得我前面已经说得很清楚了,我不想再一遍一遍地重复了。。。累。。。
> 另外,向下游写数据应该会伴随着busy
> buffer的变化吧?
>
每次写操作结果时,nginx 都会尝试重新标记 busy buffers,毕竟 busy buffers 本身只是标志而已,不是物理上独立的缓冲区。
建议仔细阅读 nginx 的 C 源码。代码是获得正确而精确的理解的唯一有效途径。
Regards,
-agentzh