-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
channel和网络连接之间的关系 #131
Comments
channel和socket是多对多的关系,多个channel可以共用一个socket(通过引用计数),一个channel也可以指向多个socket(连接集群)。 |
@jamesge 多谢解惑。 |
@jamesge 顺便问一句,http connection type设置成short,即使复用channel, 每次请求也是新建连接吧? |
@jamesge 我看了一下源码和文档,试图修改http example,看一下连接重用的情况(代码如下)。因为 ` while (true) {
|
idle timeout 是server的配置. client端的socket如果没有被任何channel或者RPC引用的话, 默认是直接释放。 如果希望延迟释放需要配置一下 --defer_close_second |
@chenzhangyi 这个文档和你讲的不一致,文档上说的都是客户端行为,文档链接 https://github.com/brpc/brpc/blob/master/docs/cn/client.md |
@gydong 我也在测试brpc http client, ,10秒idle关闭连接没问题。 你上面的例子每9秒channel就析构了,而对应的socket又没有别的channel引用, 就会被close了。 |
@cool-colo 明白了。那我要重用连接的话,还是设置defer_close_second吧。 |
@cool-colo 设置为short即使复用channel每次也新建连接。 |
coredump的话你就具体看下挂在哪了。 |
应该是内存越界这类的问题, 跑起来内存占用量很稳定,不会是memory leak. |
从这个栈看不出什么。你可以试下用example/http_c++模拟能否复现:
|
@jamesge @chenzhangyi 测试了一下这个场景,代码如下(运行的命令为:http_client -defer_close_second=15 "www.baidu.com"),和预期还是不符。defer确实是defer了,但在前一个channel析构后,后一个构造的channel并没有重用到前一个channel腾出的连接。机器上还是看到很多time-wait状态的连接。是说重用这个动作只能发生在前一个channel析构之前吗? ` while (true) {
} ` |
你最好试下本地server,访问公网可能超时并导致关连接。defer_close对所有协议,single/pooled都有效。 |
好的,我再试一下。 |
已测试,证实 -defer_close_second 确实可以起作用。多谢解答! |
如果channel在程序运行期间没有发生析构,那为何在服务端netstat -a只看到端口有侦听,但没有ESTABLISHED的socket连接呢? |
从文档来看,使用brpc的http client,如果想达到长连接的效果,应该保存住channel实例并重用它。由此推断,channel和网络连接之间有关联关系。但在文档中又看到,rpc请求发出后,channel实例立马就可以析构了,不用等待结果回来后再析构。由此推断,channel和网络连接又好像没有关系。两个推断有矛盾的地方,求真相。
The text was updated successfully, but these errors were encountered: