原子变量导致 Pika 性能下降 90% #2653
AlexStocks
started this conversation in
General
Replies: 1 comment 1 reply
-
template<typename T>
bool GetConfIntHuman(const std::string& name, T* value) const {
for (auto& i : rep_->item) {
if (i.type == Rep::kComment) {
continue;
}
if (name == i.name) {
auto c_str = i.value.c_str();
(*value) = static_cast<int32_t>(strtoll(c_str, nullptr, 10));
char last = c_str[i.value.size() - 1];
if (last == 'K' || last == 'k') {
(*value) = (*value) * (1 << 10);
} else if (last == 'M' || last == 'm') {
(*value) = (*value) * (1 << 20);
} else if (last == 'G' || last == 'g') {
(*value) = (*value) * (1 << 30);
}
return true;
}
}
return false;
} 如果这里把
|
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
PR #2622 改进了 Pika 加载配置的方式,加载配置时从使用锁改为使用
min_write_buffer_number_to_merge_.load(std::memory_order_relaxed)
原子形式的变量。上面这个 PR 合进去以后,Pika的写速度大幅下降:
这个PR之前:valueSize=1KB,写ops能到24W,valueSize=10KB, 写Ops能到9.6W
这个PR之后:valueSize=1KB,写ops只到4.2W,valueSize=10KB, 写Ops只到0.6W
原因:
1 把一些读锁改为了原子变量访问,通过 perf 发现 cache miss 会翻一倍。
2 他这个pr不止是去掉了锁,原来一些没有锁的配置项(一些配置项,在pika启动时赋值,后面不会再修改,只会高并发的读),他也给搞成原子变量了
比如说这些判断当前请求是否要走cache配置项,每一条请求都会去读取,并发量极高,本来人家就是普通类型,也无锁。他加上原子变量了,搞的就有竞争了。
最终:
在 #2636 这个 PR 中,revert 了 PR #2622 。
Beta Was this translation helpful? Give feedback.
All reactions