evpp
evpp copied to clipboard
高并发缓冲区不够。
在使用期间,遇到高并发大流量缓冲区不足,而buff没有动态申请,
而我的做法是 ReserveInputBuffer(1610241024) 16MB的大小给每个session 30个用户大概有500M左右的内存占用。
遇到高并发时buff类堆积数据不足会导致拆解数据失败的情况,从而丢失了数据。
请问我该如何解决。
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);
}
}
高并发的情况下,缓冲区数据会错乱。我已经经过很详细的测试了。 现在项目搁置很久不维护,我已经重写了evpp。请看我的主页。
@X-Crack
grow
自动无限增长的是应用层数据缓冲区buffer_
的大小,
这里不够用的是内核缓存区的大小,请问是这么理解么?
@X-Crack
grow
自动无限增长的是应用层数据缓冲区buffer_
的大小, 这里不够用的是内核缓存区的大小,请问是这么理解么?
内核缓冲区足够,具体数据错乱bug在buff类,问题找不出来。所以我使用chenshuo的moduo的buffer重构了evpp,bug都没有了。
chenshuo的那个buffer默认缓冲区大小是65535不会无限制的增长,把新的数据覆盖使用过的数据,新数据向前移动覆盖旧数据。
@X-Crack 扫了一下chenshuo的buffer,我觉的问题出在这一行
char* d = new char[n];
vs
std::vector<char> buffer_;
其它逻辑我觉得没错
@xmyqsh
不管那些了,反正这个项目也不维护了,能修复问题是好的。
高并发的情况下,缓冲区数据会错乱。我已经经过很详细的测试了。 现在项目搁置很久不维护,我已经重写了evpp。请看我的主页。
请问,重写的evpp是你主页那个? 你主页有个evpp,刚才下载比较了下,跟360/evpp好像没啥区别;
我也碰到这个问题了,具体的测试方法是:在服务器对数据算md5,在客户端对比md5。我并发不高,但是数据大,一条数据基本都是2M以上,大的有20几M