增加测试过程熟悉clickhouse源码
【摘要】 在分析clickhouse内存分配部分代码时,想深入了解clickhouse内存池,于是写一些代码进行测试
增加测试过程熟悉clickhouse源码
在分析clickhouse内存分配部分代码时,想深入了解clickhouse内存池,于是写一些代码进行测试,参考代码:
ClickHouse_Kernel_Tag_v21.3.4.25-lts/src/Common/tests/arena_with_free_lists.cpp
同级目录下增加测试CPP:read_bin_file_cfytest.cpp
ClickHouse_Kernel_Tag_v21.3.4.25-lts/src/Common/tests/CMakeLists.txt文件中增加如下指令:
add_executable (arena_with_free_lists arena_with_free_lists.cpp)
target_link_libraries (arena_with_free_lists PRIVATE dbms)
编译生成二进制文件:ClickHouse_Kernel_21.3.x/build/src/Common/tests/read_bin_file_cfytest
cmake .. -DCMAKE_BUILD_TYPE="Debug" -DENABLE_TESTS=ON
截取源码arena_with_free_lists.cpp中的部分代码做测试:
#include <variant>
#include <memory>
#include <array>
#include <sys/resource.h>
#include <ext/bit_cast.h>
#include <ext/size.h>
#include <Common/Arena.h>
#include <Common/ArenaWithFreeLists.h>
#include <common/StringRef.h>
#include <Common/Stopwatch.h>
#include <IO/ReadBufferFromFileDescriptor.h>
#include <IO/ReadHelpers.h>
#include <Core/Field.h>
#include <Compression/CompressedReadBuffer.h>
using namespace DB;
namespace DB
{
namespace ErrorCodes
{
extern const int SYSTEM_ERROR;
}
}
int main(int argc, char ** argv)
{
if (argc < 2)
{
std::cerr << "Usage: program n\n";
return 1;
}
std::cerr << std::fixed << std::setprecision(2);
size_t n = parse<size_t>(argv[1]);
std::vector<std::string> data; // 如果获取datetime类型,修改成time_t
size_t sum_strings_size = 0;
// string类型字段的bin文件读取
{
Stopwatch watch;
DB::ReadBufferFromFileDescriptor in1(STDIN_FILENO);
DB::CompressedReadBuffer in2(in1);
for (size_t i = 0; i < n && !in2.eof(); ++i)
{
data.emplace_back();
readStringBinary(data.back(), in2); // 如果获取datetime类型,修改成readDateTimeText(data.back(), in2);
// 打印列的每行数据到终端
std::cerr << "data :" << data.back() << std::endl;
sum_strings_size += data.back().size() + 1;
}
watch.stop();
std::cerr
<< "Read. Elements: " << data.size() << ", bytes: " << sum_strings_size
<< ", elapsed: " << watch.elapsedSeconds()
<< " (" << data.size() / watch.elapsedSeconds() << " elem/sec.,"
<< " " << sum_strings_size / 1048576.0 / watch.elapsedSeconds() << " MiB/sec.)"
<< std::endl;
rusage resource_usage;
if (0 != getrusage(RUSAGE_SELF, &resource_usage))
throwFromErrno("Cannot getrusage", ErrorCodes::SYSTEM_ERROR);
size_t allocated_bytes = resource_usage.ru_maxrss * 1024;
std::cerr << "Current memory usage: " << allocated_bytes << " bytes.\n";
}
}
测试读取query_log表的query字段:
# ./read_bin_file_cfytest 5 < /home/cfy/var/lib/clickhouse/store/cc0/cc09aa5b-5680-4e91-b8ed-0f51449e2eb9/202112_162_975_82/query.bin
data :select timezone()
FORMAT TabSeparatedWithNamesAndTypes;
data :select timezone()
FORMAT TabSeparatedWithNamesAndTypes;
data :select timezone()
FORMAT TabSeparatedWithNamesAndTypes;
data :select timezone()
FORMAT TabSeparatedWithNamesAndTypes;
data :select version()
FORMAT TabSeparatedWithNamesAndTypes;
Read. Elements: 5, bytes: 279, elapsed: 0.00 (5380.14 elem/sec., 0.29 MiB/sec.)
Current memory usage: 40493056 bytes.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)