evpp icon indicating copy to clipboard operation
evpp copied to clipboard

高并发缓冲区不够。

Open 0xdddddddd opened this issue 5 years ago • 8 comments

在使用期间,遇到高并发大流量缓冲区不足,而buff没有动态申请,

而我的做法是 ReserveInputBuffer(1610241024) 16MB的大小给每个session 30个用户大概有500M左右的内存占用。

遇到高并发时buff类堆积数据不足会导致拆解数据失败的情况,从而丢失了数据。

请问我该如何解决。

0xdddddddd avatar Aug 13 '19 11:08 0xdddddddd

evpp::buffer类是自动扩充的呀,怎么会没有缓冲区不足了?

void Write(const void* /*restrict*/ d, size_t len) {
    EnsureWritableBytes(len);
    memcpy(WriteBegin(), d, len);
    assert(write_index_ + len <= capacity_);
    write_index_ += len;
}

void EnsureWritableBytes(size_t len) {
    if (WritableBytes() < len) {
        grow(len);
    }

    assert(WritableBytes() >= len);
}

void grow(size_t len) {
    if (WritableBytes() + PrependableBytes() < len + reserved_prepend_size_) {
        //grow the capacity
        size_t n = (capacity_ << 1) + len;
        size_t m = length();
        char* d = new char[n];
        memcpy(d + reserved_prepend_size_, begin() + read_index_, m);
        write_index_ = m + reserved_prepend_size_;
        read_index_ = reserved_prepend_size_;
        capacity_ = n;
        delete[] buffer_;
        buffer_ = d;
    } else {
        // move readable data to the front, make space inside buffer
        assert(reserved_prepend_size_ < read_index_);
        size_t readable = length();
        memmove(begin() + reserved_prepend_size_, begin() + read_index_, length());
        read_index_ = reserved_prepend_size_;
        write_index_ = read_index_ + readable;
        assert(readable == length());
        assert(WritableBytes() >= len);
    }
}

qlaiaqu avatar Sep 12 '19 01:09 qlaiaqu

高并发的情况下,缓冲区数据会错乱。我已经经过很详细的测试了。 现在项目搁置很久不维护,我已经重写了evpp。请看我的主页。

0xdddddddd avatar Sep 12 '19 11:09 0xdddddddd

@X-Crack grow 自动无限增长的是应用层数据缓冲区buffer_的大小, 这里不够用的是内核缓存区的大小,请问是这么理解么?

xmyqsh avatar Sep 13 '19 02:09 xmyqsh

@X-Crack grow 自动无限增长的是应用层数据缓冲区buffer_的大小, 这里不够用的是内核缓存区的大小,请问是这么理解么?

内核缓冲区足够,具体数据错乱bug在buff类,问题找不出来。所以我使用chenshuo的moduo的buffer重构了evpp,bug都没有了。

chenshuo的那个buffer默认缓冲区大小是65535不会无限制的增长,把新的数据覆盖使用过的数据,新数据向前移动覆盖旧数据。

0xdddddddd avatar Sep 13 '19 03:09 0xdddddddd

@X-Crack 扫了一下chenshuo的buffer,我觉的问题出在这一行 char* d = new char[n]; vs std::vector<char> buffer_; 其它逻辑我觉得没错

xmyqsh avatar Sep 13 '19 04:09 xmyqsh

@xmyqsh

不管那些了,反正这个项目也不维护了,能修复问题是好的。

0xdddddddd avatar Sep 13 '19 07:09 0xdddddddd

高并发的情况下,缓冲区数据会错乱。我已经经过很详细的测试了。 现在项目搁置很久不维护,我已经重写了evpp。请看我的主页。

请问,重写的evpp是你主页那个? 你主页有个evpp,刚才下载比较了下,跟360/evpp好像没啥区别;

andylau004 avatar Mar 18 '20 15:03 andylau004

我也碰到这个问题了,具体的测试方法是:在服务器对数据算md5,在客户端对比md5。我并发不高,但是数据大,一条数据基本都是2M以上,大的有20几M

Rendtime avatar Apr 11 '20 01:04 Rendtime