mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
build cache_log table
This commit is contained in:
parent
463b42b4c3
commit
9c9870f021
@ -48,8 +48,10 @@ void IFileCache::addQueryRef(String & query_id)
|
|||||||
{
|
{
|
||||||
std::lock_guard cache_lock(logs_mutex);
|
std::lock_guard cache_lock(logs_mutex);
|
||||||
auto iter = cache_logs.find(query_id);
|
auto iter = cache_logs.find(query_id);
|
||||||
if (iter == cache_logs.end())
|
if (iter == cache_logs.end()) {
|
||||||
iter = cache_logs.insert({query_id, std::make_shared<CacheLogRecorder>()}).first;
|
iter = cache_logs.insert({query_id, std::make_shared<CacheLogRecorder>()}).first;
|
||||||
|
iter->second->logs = std::make_shared<CacheFileTrace>();
|
||||||
|
}
|
||||||
iter->second->ref++;
|
iter->second->ref++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,11 +70,16 @@ void IFileCache::DecQueryRef(String & query_id)
|
|||||||
{
|
{
|
||||||
if (auto cache_log = Context::getGlobalContextInstance()->getCacheLog())
|
if (auto cache_log = Context::getGlobalContextInstance()->getCacheLog())
|
||||||
{
|
{
|
||||||
CacheLogElement cache_elem;
|
/// [remote_file_name, [hit_count, miss_count]]
|
||||||
cache_elem.query_id = query_id;
|
for (const auto & access : *(iter->second->logs))
|
||||||
cache_elem.hit_count = iter->second->cache_hit_count;
|
{
|
||||||
cache_elem.miss_count = iter->second->cache_miss_count;
|
CacheLogElement cache_elem;
|
||||||
cache_log->add(cache_elem);
|
cache_elem.query_id = iter->first;
|
||||||
|
cache_elem.remote_file_path = access.first;
|
||||||
|
cache_elem.hit_count = access.second.first;
|
||||||
|
cache_elem.miss_count = access.second.second;
|
||||||
|
cache_log->add(cache_elem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cache_logs.erase(iter);
|
cache_logs.erase(iter);
|
||||||
}
|
}
|
||||||
@ -80,7 +87,7 @@ void IFileCache::DecQueryRef(String & query_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IFileCache::updateQueryCacheLog(String & query_id, size_t hit_count, size_t miss_count)
|
void IFileCache::updateQueryCacheLog(String & query_id, String &remote_fs_path, size_t hit_count, size_t miss_count)
|
||||||
{
|
{
|
||||||
/// must be a query log
|
/// must be a query log
|
||||||
if (query_id.size())
|
if (query_id.size())
|
||||||
@ -89,8 +96,9 @@ void IFileCache::updateQueryCacheLog(String & query_id, size_t hit_count, size_t
|
|||||||
auto iter = cache_logs.find(query_id);
|
auto iter = cache_logs.find(query_id);
|
||||||
if (iter != cache_logs.end())
|
if (iter != cache_logs.end())
|
||||||
{
|
{
|
||||||
iter->second->cache_hit_count += hit_count;
|
/// [query_id, [remote_fs_path, [hit_count, miss_count]]]
|
||||||
iter->second->cache_miss_count += miss_count;
|
(*iter->second->logs)[remote_fs_path].first += hit_count;
|
||||||
|
(*iter->second->logs)[remote_fs_path].second += miss_count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ public:
|
|||||||
|
|
||||||
void DecQueryRef(String & query_id);
|
void DecQueryRef(String & query_id);
|
||||||
|
|
||||||
void updateQueryCacheLog(String &query_id, size_t hit_count, size_t miss_count);
|
void updateQueryCacheLog(String &query_id, String &remote_fs_path, size_t hit_count, size_t miss_count);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
String cache_base_path;
|
String cache_base_path;
|
||||||
|
@ -48,7 +48,7 @@ CachedReadBufferFromRemoteFS::CachedReadBufferFromRemoteFS(
|
|||||||
|
|
||||||
CachedReadBufferFromRemoteFS::~CachedReadBufferFromRemoteFS()
|
CachedReadBufferFromRemoteFS::~CachedReadBufferFromRemoteFS()
|
||||||
{
|
{
|
||||||
cache->updateQueryCacheLog(settings.current_query_id, cache_hit_count, cache_miss_count);
|
cache->updateQueryCacheLog(settings.current_query_id, remote_fs_object_path, cache_hit_count, cache_miss_count);
|
||||||
cache->DecQueryRef(settings.current_query_id);
|
cache->DecQueryRef(settings.current_query_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,9 +14,10 @@ NamesAndTypesList CacheLogElement::getNamesAndTypes()
|
|||||||
{"event_date", std::make_shared<DataTypeDate>()},
|
{"event_date", std::make_shared<DataTypeDate>()},
|
||||||
{"event_time", std::make_shared<DataTypeDateTime>()},
|
{"event_time", std::make_shared<DataTypeDateTime>()},
|
||||||
{"query_id", std::make_shared<DataTypeString>()},
|
{"query_id", std::make_shared<DataTypeString>()},
|
||||||
|
{"remote_file_path", std::make_shared<DataTypeString>()},
|
||||||
{"hit_count", std::make_shared<DataTypeUInt64>()},
|
{"hit_count", std::make_shared<DataTypeUInt64>()},
|
||||||
{"miss_count", std::make_shared<DataTypeUInt64>()},
|
{"miss_count", std::make_shared<DataTypeUInt64>()},
|
||||||
{"hit_ratio", std::make_shared<DataTypeFloat64>()},
|
/// {"hit_ratio", std::make_shared<DataTypeFloat64>()},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,22 +41,22 @@ void CacheLogElement::appendToBlock(MutableColumns & columns) const
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
const auto current_time = std::chrono::system_clock::now();
|
const auto current_time = std::chrono::system_clock::now();
|
||||||
auto event_time = std::chrono::system_clock::to_time_t(current_time);
|
auto event_time = std::chrono::system_clock::to_time_t(current_time);
|
||||||
/// auto event_time_microseconds = time_in_microseconds(current_time);
|
|
||||||
|
|
||||||
columns[i++]->insert(DateLUT::instance().toDayNum(event_time).toUnderType());
|
columns[i++]->insert(DateLUT::instance().toDayNum(event_time).toUnderType());
|
||||||
columns[i++]->insert(event_time);
|
columns[i++]->insert(event_time);
|
||||||
|
|
||||||
columns[i++]->insert(query_id);
|
columns[i++]->insert(query_id);
|
||||||
|
columns[i++]->insert(remote_file_path);
|
||||||
columns[i++]->insert(hit_count);
|
columns[i++]->insert(hit_count);
|
||||||
columns[i++]->insert(miss_count);
|
columns[i++]->insert(miss_count);
|
||||||
|
|
||||||
if (hit_count + miss_count)
|
/// if (hit_count + miss_count)
|
||||||
{
|
/// {
|
||||||
double hit_ratio = 1.0 * hit_count / (hit_count + miss_count);
|
/// double hit_ratio = 1.0 * hit_count / (hit_count + miss_count);
|
||||||
columns[i++]->insert(hit_ratio);
|
/// columns[i++]->insert(hit_ratio);
|
||||||
}
|
/// }
|
||||||
else
|
/// else
|
||||||
columns[i++]->insert(0);
|
/// columns[i++]->insert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -3,37 +3,34 @@
|
|||||||
#include <Core/NamesAndAliases.h>
|
#include <Core/NamesAndAliases.h>
|
||||||
#include <Core/NamesAndTypes.h>
|
#include <Core/NamesAndTypes.h>
|
||||||
#include <Core/Settings.h>
|
#include <Core/Settings.h>
|
||||||
|
#include <DataTypes/DataTypeArray.h>
|
||||||
|
#include <DataTypes/DataTypeTuple.h>
|
||||||
#include <Interpreters/SystemLog.h>
|
#include <Interpreters/SystemLog.h>
|
||||||
#include <Interpreters/TransactionVersionMetadata.h>
|
#include <Interpreters/TransactionVersionMetadata.h>
|
||||||
|
#include <base/logger_useful.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/// [remote_file_path, [hit_count, miss_count]]
|
||||||
|
using CacheFileTrace = std::unordered_map<String, std::pair<size_t, size_t>>;
|
||||||
|
|
||||||
struct CacheLogRecorder
|
struct CacheLogRecorder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
size_t ref = 0;
|
size_t ref = 0;
|
||||||
size_t cache_hit_count = 0;
|
std::shared_ptr<CacheFileTrace> logs;
|
||||||
size_t cache_miss_count = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CacheLogElement
|
struct CacheLogElement
|
||||||
{
|
{
|
||||||
/// time_t event_time{};
|
/// time_t event_time{};
|
||||||
/// Decimal64 event_time_microseconds{};
|
|
||||||
|
|
||||||
String query_id;
|
String query_id;
|
||||||
|
String remote_file_path;
|
||||||
|
|
||||||
UInt64 hit_count;
|
UInt64 hit_count;
|
||||||
UInt64 miss_count;
|
UInt64 miss_count;
|
||||||
|
|
||||||
/// Float64 hit_ratio;
|
|
||||||
/// Float64 miss_ratio;
|
|
||||||
|
|
||||||
/// TODO for next version
|
|
||||||
/// std::unordered_map<String, size_t> hit_records;
|
|
||||||
/// std::unordered_map<String, size_t> miss_records;
|
|
||||||
|
|
||||||
static std::string name() { return "CacheLog"; }
|
static std::string name() { return "CacheLog"; }
|
||||||
|
|
||||||
static NamesAndTypesList getNamesAndTypes();
|
static NamesAndTypesList getNamesAndTypes();
|
||||||
|
Loading…
Reference in New Issue
Block a user