本帖对参加华为云TaurusDB性能挑战赛初赛选手的问题进行解答
Q1: 是否可以使用aio
可以使用
Q2:
class
KVIntf {
public
:
virtual
~KVIntf() {};
virtual
bool
Init(
const
char
* dir,
int
id) = 0;
virtual
void
Close() = 0;
virtual
int
Set(KVString &key, KVString & val) = 0;
virtual
int
Get(KVString &key, KVString & val) = 0;
};
1. 接口Init的参数id是什么含义,怎样约定的?
测试程序运行时,每个线程会调用Init,init中的dir相同,id不同。参赛者可以使用,也可以不使用这个id来识别不同的线程。这个id仅体现线程的不同,没有其他含义。另外每个线程都会调用 GetKVIntf, Init, Close; 只有init会传线程标记。
2. 接口Get和Set的返回值是怎样约定的?
在一个实际的使用场景中,返回值可以表征错误码/或者分区信息等,第一阶段的比赛中,没有检验这个返回值;
3. kv_string.h是否可以修改?如果不能修改,主办方如何保证判题的时候、所有人的kv_string.h是原始没有被修改?
判题为自动化程序,判题时不会检查kv_string文件本身是否被修改,但会判题程序会使用原始kv_string的定义来检验返回的k/v是否和原始值相同。
4. 性能评测
性能评测
随机写入:16个线程并发随机写入,每个线程使用Set各写400万次随机数据(key 8B、value 4KB)
顺序读取:16个线程并发按照写入顺序读取,每个线程各使用Get读取400万次随机数据
随机读取:16个线程并发读取,每个线程随机读取400万次数据,读取范围覆盖全部写入数据
注:
1. 共2个维度测试性能,每一个维度测试结束后会保留DB数据,关闭实例,重启进程,清空PageCache,下一个维度开始后重新打开新的实例
这里是2个维度还是3个维度?如果是2个维度,哪两个阶段是在一起的?
随机写入和顺序读取是一个阶段(即写入完成后立即读取),随机读取是另一个阶段(经过Close和Init后再读取)
Q3:关于 Key的问题
1)不同线程的key不会重复
Q4: GCC 版本
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.