caidj

Results 16 comments of caidj

测试的qps多少?加大qps看看?理论上应该能触发,后续我看看能不能在我环境复现一下

是不是有异步rpc main函数结束后访问了bvar?

> bvar中有一些常驻线程,应该是程序退出的时候有些变量被释放掉了,这些线程在跑的时候就会出core。 触发的原因可以暂时通过规范用户使用bvar的方式规避吗?比如正确的hide, 销毁bvar.....

开发方案描述: 1. 类Socket中增加_rpc_count表示上面请求的rpc个数,用于表示负载。 GetSocket()时_rpc_count加一,ReturnSocket()时_rpc_count减一。 2. gflag max_connection_multiple_size表示最多可创建的connection 3. gflag gap_threshold_for_switch_multiple_connection 表示当两个连接上的_rpc_count的差值大于这个数时,将选择负载较轻的连接。 - 所以当gap_threshold_for_switch_multiple_connection为0时,类似于pooled的方式,每次都尽量选择负载为0的连接,不同是,当连接创建满时,复用现有的负载最轻的连接。 - 当gap_threshold_for_switch_multiple_connection设置为无限大时,就是single的方式。 4. 类SocketMultiple(类似SocketPooled,会共同继承一个抽象类SocketGroup)用来管理multiple connection。 - SocketMultiple::_lightest_sid:当前负载最轻连接(和gap_threshold_for_switch_multiple_connection值相关),每个连接 GetSocket()和ReturnSocket()时都会和当前的_lightest_sid比较,如果_lightest_sid负载减去当前连接负载的差值超过gap_threshold_for_switch_multiple_connection。则替换_lightest_sid。 - SocketMultiple::_free:一个数组,用来记录当前负载为0的连接。记录的原因是负载为0的不会再更新负载了,需要记录下来。 - SocketMultiple::GetSocket():选择一个连接,方式如下:先选择_lightest_sid,如果其负载_rpc_count

@jamesge 帮忙看下上面的方案描述

伪码实现: ```{r eval=FALSE} class SocketMultiple : public SocketGroup { public: explicit SocketMultiple(const SocketOptions& opt); virtual ~SocketMultiple(); virtual int GetSocket(SocketUniquePtr* ptr); virtual void ReturnSocket(Socket* sock); private: butil::atomic _rpc_count; // 总请求数 butil::atomic...

选择连接: ```{r eval=FALSE} int SocketMultiple::GetSocket(SocketUniquePtr* ptr) { _rpc_count.fetch_add(1, butil::memory_order_relaxed); SocketId lsid = _lightest_sid.load(butil::memory_order_acquire); SocketUniquePtr lptr; const uint32_t threshold = FLAGS_gap_threshold_for_multiple_connections; // 先检查_lightest_sid的负载是否小于threshold,如果小于保持在_lightest_sid发送请求 if (Socket::Address(lsid, &lptr) == 0) { if (...

返还连接: ```{r eval=FALSE} void SocketMultiple::ReturnSocket(Socket* sock) { // 总rpc_cout减一 _rpc_count.fetch_sub(1, butil::memory_order_relaxed); // 当前连接的rpc_cout减一 uint32_t load = sock->_rpc_count.fetch_sub(1, butil::memory_order_acquire); --load; SocketId min_sid = _lightest_sid.load(butil::memory_order_relaxed); if (id == min_sid) { return; }...

> @lorinlee 是客户端延迟数据,服务端延迟基本都在1ms左右,服务端都是万兆网卡,请求基本在200B以内,没有打满。 > > 另外同时启动两个测试,一个连26个下游,一个只连一个下游,还是一样的结果。一个下游的测试耗时比较低,多个下游的测试耗时明显高出很多。 > > 请问可能还有哪些原因呢 用的是什么连接方式?qps大约多少?网络的rtt大约多少?

这里有相似的issue 可以参考 https://github.com/apache/incubator-brpc/issues/1773