被vector动态扩容给坑了

1、现象

调查时分析了2022-2-25和2021-8-13的日志,发现vm11、vm12在下午总会卡住几秒。

2、调查过程

vm11和vm12是修复vm,正常情况不会影响交易。

2.1、修复vm代码分析

修复线程会建立索引,使用了vector<uint64_t> 作为存储。

2.2、vector扩容分析

分析了FSM的show rb日志,高可用RB最多10亿左右,所以代码测试了12亿 vector扩容时所需时间。

测试代码:

void test_vector()
{
    vector<uint64_t> idxs;
    uint64_t last_cap = 0;
    for(int i = 0 ;i < 1200000000;i++)
    {
        auto begin = get_ns();
        idxs.push_back(i);
        auto cost = get_ns() - begin;

        auto cap = idxs.capacity();
        if(last_cap != cap || cost > 100*1000*1000)
        {
            printf("last_cap=%ju,cap=%ju,cost=%ju\n",last_cap,cap,cost/1000000);
            last_cap = cap;
        }
    }
}

输出如下:

last_cap=0,cap=1,cost=0
last_cap=1,cap=2,cost=0
last_cap=2,cap=4,cost=0
last_cap=4,cap=8,cost=0
last_cap=8,cap=16,cost=0
last_cap=16,cap=32,cost=0
last_cap=32,cap=64,cost=0
last_cap=64,cap=128,cost=0
last_cap=128,cap=256,cost=0
last_cap=256,cap=512,cost=0
last_cap=512,cap=1024,cost=0
last_cap=1024,cap=2048,cost=0
last_cap=2048,cap=4096,cost=0
last_cap=4096,cap=8192,cost=0
last_cap=8192,cap=16384,cost=0
last_cap=16384,cap=32768,cost=0
last_cap=32768,cap=65536,cost=0
last_cap=65536,cap=131072,cost=0
last_cap=131072,cap=262144,cost=0
last_cap=262144,cap=524288,cost=1
last_cap=524288,cap=1048576,cost=1
last_cap=1048576,cap=2097152,cost=3
last_cap=2097152,cap=4194304,cost=6
last_cap=4194304,cap=8388608,cost=13
last_cap=8388608,cap=16777216,cost=25
last_cap=16777216,cap=33554432,cost=51
last_cap=33554432,cap=67108864,cost=102
last_cap=67108864,cap=134217728,cost=204
last_cap=134217728,cap=268435456,cost=407
last_cap=268435456,cap=536870912,cost=818
last_cap=536870912,cap=1073741824,cost=1633
last_cap=1073741824,cap=2147483648,cost=3372

可以看出,vector在2的n次幂都会扩容。重要节点是

  • capacity :1.3亿~2.6亿-时间约400ms
  • capacity :2.6亿~5.3亿-时间约800ms
  • capacity :5.3亿~10.7亿-时间约1600ms
2.3 平台日志验证

2021-8-13 14:05:03
可以看出rb 2217的数据量为5.36亿,恰好是扩容的数据量(上面输出的31行)

2022-2-25 13:31:06
同样,也是rb 2217到达5.36亿。

2022-2-25 14:23:32
这次是rb 2229达到了5.36亿。

3、结论

vm11、vm12建立索引时,vector扩容5亿-》10亿时会卡住。此时内存一般都会满(实际使用+缓存)。所以耗时会大于内网测试值。

但是vm11、vm12不影响正常交易(除非此时产生了丢包)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值