From 9deba410f92dbbced29937998b3e3a0716687afb Mon Sep 17 00:00:00 2001 From: kevinyao0901 Date: Sun, 5 Jan 2025 15:55:26 +0800 Subject: [PATCH] Recheck code and Readme --- README.md | 201 ++++++++++++------------------------------- Report/png/new_benchmark.png | Bin 0 -> 91405 bytes db/db_impl.cc | 14 ++- test/Benchmark_test.cc | 142 +++++++++++++++++++++++++++--- 4 files changed, 202 insertions(+), 155 deletions(-) create mode 100644 Report/png/new_benchmark.png diff --git a/README.md b/README.md index 054134c..3958762 100644 --- a/README.md +++ b/README.md @@ -588,165 +588,78 @@ Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { **性能测试:** **Benchmark测试运行结果及分析:** -![error](./Report/png/benchmark.png) +![error](./Report/png/new_benchmark.png) ### 2.结果分析 -1. **插入时间 (Insertion time for 100001 entries: 516356 microseconds)** +### 1. **总写入时间(Total time for 100001 writes)** -这个时间(516356 微秒,约 516 毫秒)看起来是合理的,特别是对于 100001 条记录的插入操作。如果数据插入过程没有特别复杂的计算或操作,这个时间应该是正常的,除非硬件性能或其他因素导致延迟。 +- **结果**: 1464.65 ms +- **分析**: 该值表示100001次写入操作所花费的总时间,接近1.46秒。这个时间段包括了所有写入操作和可能的其他处理,如日志记录和合并等。根据吞吐量(Throughput)可以看出每秒操作次数约为68277次,说明写入性能还是较为稳定。 -2. **没有索引的查询时间 (Time without index: 106719 microseconds)** +### 2. **吞吐量(Throughput)** -这个时间是查询在没有索引的情况下执行的时间。106719 微秒(大约 107 毫秒)对于没有索引的查询来说是可以接受的,尤其是在数据量较大时。如果数据库没有索引,查找所有相关条目会比较耗时。 +- **结果**: 68276.6 OPS (operations per second) +- **分析**: 吞吐量是每秒钟能够完成的写操作数量,68277次每秒的吞吐量表明系统在进行批量写入时性能良好,适合高负载下的写入操作。 -3. **创建索引的时间 (Time to create index: 596677 microseconds)** +### 3. **平均延迟(Average latency)** -这个时间(596677 微秒,约 597 毫秒)对于创建索引来说是正常的,尤其是在插入了大量数据后。如果数据量非常大,索引创建时间可能会显得稍长。通常情况下,创建索引的时间会随着数据量的增加而增大。 +- **结果**: 0.0133881 ms +- **分析**: 平均延迟为0.0134毫秒,表示每个写入操作的平均响应时间非常低。延迟较低说明系统能够快速响应每个请求,这对需要低延迟的应用非常重要。 -4. **有索引的查询时间 (Time with index: 68 microseconds)** +### 4. **P75 和 P99 延迟** -这个时间(68 微秒)非常短,几乎可以认为是一个非常好的优化结果。通常,索引查询比没有索引时要快得多,因为它避免了全表扫描。因此,这个时间是非常正常且预期的,说明索引大大加速了查询。 +- **结果**: P75 latency: 0.012 ms, P99 latency: 0.016 ms +- 分析: + - **P75延迟**为0.012毫秒,表示75%的请求在0.012毫秒内完成。 + - **P99延迟**为0.016毫秒,表示99%的请求在0.016毫秒内完成。 + - 这表明绝大多数请求的延迟都非常小,延迟稳定,且尾延迟(P99)也处于可接受范围。 -5. **查询结果 (Found 1 keys with index)** +### 5. **索引创建时间(Time to create index)** -这里显示索引查询找到了 1 个键。是正常的, `name=Customer#10000` 应该返回 1 条记录。 +- **结果**: 661884 microseconds (~661.88 ms) +- **分析**: 索引的创建时间接近660毫秒,可能由于索引数据结构的构建和填充过程。该时间相对较长,但不至于影响整体性能。 -6. **数据库统计信息 (Database stats)** +### 6. **索引查询时间(Time with index)** -``` -Compactions -Level Files Size(MB) Time(sec) Read(MB) Write(MB) --------------------------------------------------- - 0 2 6 0 0 7 - 1 5 8 0 16 7 -``` +- **结果**: 97 microseconds +- **分析**: 使用索引进行查询的时间非常低,仅为97微秒。这表明通过索引可以显著提高查询性能,特别是在查询大数据量时,查询响应时间大幅降低。 + +### 7. **写放大(Write Amplification)** + +- **结果**: Write Amplification Factor: 2.24915 +- **分析**: 写放大因子为2.25,表示系统写入的数据量是原始数据量的2.25倍。这个值较为理想,说明合并过程和磁盘上的写入是有效的,没有造成过多的额外写入。 + +### 8. **总数据写入量(Total data written)** + +- **结果**: 7058762 bytes (~7.06 MB) +- **分析**: 这是在进行100001次写入操作过程中,系统写入到磁盘的总字节数。与写放大因子2.25结合来看,系统的写入开销较为合理。 + +### 9. **索引删除时间(Time to delete index on field 'name')** + +- **结果**: 1235916 microseconds (~1235.92 ms) +- **分析**: 删除索引所需的时间较长,接近1.24秒。这可能是因为索引结构的更新和删除操作涉及较多的计算和磁盘操作,影响了响应速度。 + +### 10. **数据库状态(Compactions)** + +- 分析: + - 在Level 0上有1个文件,大小为3MB,写入了7MB的数据。 + - 在Level 1上有4个文件,大小为8MB,写入了15MB的数据。 + - 这些数据说明系统在进行数据合并时,Level 0和Level 1的文件大小和写入数据量都显示出一定的合并操作,表明系统在进行正常的磁盘整理。 + +------ + +### 总结 -这些信息表明数据库的压缩(Compaction)过程。`Level 0` 和 `Level 1` 显示了数据库的文件数和大小。此部分数据正常,意味着数据库在处理数据时有一些 I/O 操作和文件整理。 - -7. **删除索引的时间 (Time to delete index on field 'name': 605850 microseconds)** - -删除索引的时间(605850 微秒,约 606 毫秒)比创建索引的时间稍长。这个时间是合理的,删除索引通常会涉及到重新整理数据结构和清理索引文件,因此可能比创建索引稍慢。 - -> 根据这些结果,以下是吞吐、延迟、和写放大的分析: -> -> ------ -> -> ### **吞吐量** -> -> 吞吐量衡量的是系统在单位时间内能处理的操作量。根据插入时间和查询时间,可以推算吞吐量。 -> -> 1. **插入操作的吞吐量** -> -> - 插入时间为 516,356 微秒(约 516 毫秒)。 -> -> - 记录总数为 100,001。 -> -> $$ -> 吞吐量 = 总操作数总时间\frac{\text{总操作数}}{\text{总时间}}。 -> $$ -> -> -> -> $$ -> 吞吐量=100,0010.516≈193,798 条/秒吞吐量 = \frac{100,001}{0.516} \approx 193,798 \, \text{条/秒} -> $$ -> -> -> -> 2. **查询操作的吞吐量** -> -> - 有索引的查询时间为 68 微秒(非常快)。 -> -> $$ -> 查询操作吞吐量 = 10.000068≈14,705,882 次/秒\frac{1}{0.000068} \approx 14,705,882 \, \text{次/秒}。 -> $$ -> -> -> -> - 无索引的查询时间为 106,719 微秒。 -> -> -> $$ -> 无索引的查询吞吐量=10.106719≈9.37 次/秒无索引的查询吞吐量 = \frac{1}{0.106719} \approx 9.37 \, \text{次/秒} -> $$ -> -> -> ------ -> -> ### **延迟** -> -> 延迟是单个操作所需的时间,可以从实验结果中直接得出: -> -> 1. **插入延迟** -> -> -> $$ -> 平均插入延迟 = 516,356100,001≈5.16 微秒/条\frac{516,356}{100,001} \approx 5.16 \, \text{微秒/条}。 -> $$ -> -> -> 2. **查询延迟** -> -> - 有索引的查询延迟:68 微秒。 -> - 无索引的查询延迟:106,719 微秒。 -> -> ------ -> -> ### **写放大** -> -> 写放大是写入数据量与实际写入磁盘数据量的比值。根据数据库统计信息,可以估算写放大: -> -> 1. **统计数据** -> -> - 数据量:插入 100,001 条记录,假设每条记录大小为 64 字节,总大小约为 -> -> -> $$ -> 100,001×64=6.4 MB100,001 \times 64 = 6.4 \, \text{MB} -> $$ -> -> -> - 压缩日志显示: -> -> - 读取数据量:16 MB。 -> - 写入数据量:14 MB(Level 0 和 Level 1 总写入量)。 -> -> 2. **计算写放大** -> -> -> $$ -> 写放大 = 总写入量数据量=146.4≈2.19\frac{\text{总写入量}}{\text{数据量}} = \frac{14}{6.4} \approx 2.19。 -> $$ -> -> -> - 这个写放大值在 LSM 树中属于合理范围,尤其是数据量较大时。 -> -> ------ -> -> ### **总结** -> -> - **吞吐量**: -> - 插入操作约为 **193,798 条/秒**。 -> - 有索引的查询吞吐量为 **14,705,882 次/秒**,而无索引的查询吞吐量仅为 **9.37 次/秒**。 -> - **延迟**: -> - 插入操作的平均延迟为 **5.16 微秒/条**。 -> - 有索引的查询延迟远低于无索引的查询延迟(68 微秒 vs 106,719 微秒)。 -> - **写放大**: -> 写放大约为 **2.19**,表明索引的写入效率较高,但仍需注意在高频写入场景中的性能影响。 -> -> 如果进一步优化,建议从减少写放大(例如改进合并机制)和提升无索引查询性能入手,以平衡系统资源。 - - - -**benchmark运行结果总结:** - -整体来看,输出结果是正常的: - -- **插入和索引创建时间**:插入数据和创建索引所需的时间相对较长,但考虑到数据量和索引的生成,时间是合理的。 -- **有索引的查询时间**:索引加速了查询,这部分的时间(68 微秒)非常短,表现出色。 -- **删除索引的时间**:删除索引需要稍长时间,这也是常见的现象。 +- 性能优点: + - 吞吐量较高(68277 OPS),平均延迟和尾延迟较低,表明系统在高负载下能够稳定运行。 + - 索引查询时间非常低,能够有效提升查询性能。 + - 写放大因子在2.25左右,表现较为理想。 +- 需要关注的方面(代价): + - 索引创建和删除操作时间较长,尤其是删除索引的时间较为显著,可能需要优化索引管理策略。 + - 合并操作(Compaction)虽然正常,但可以根据实际需求进一步优化以减少对性能的影响。 +整体来看,该系统在性能上表现良好,适用于高吞吐量的写入操作,并能有效提升查询性能。
@@ -760,7 +673,7 @@ Level Files Size(MB) Time(sec) Read(MB) Write(MB) ## 六,问题与解决方案 -### 1. **问题:如何避免** `**indexDb_**` **的递归调用?** +### 1. **问题:如何避免** `indexDb_` **的递归调用?** 在实现 `Put` 和 `Delete` 方法时,由于 `indexDb_` 也调用了 `DBImpl` 的方法,可能导致递归调用的问题。具体表现为在 `indexDb_` 内部操作时仍会试图更新索引。 diff --git a/Report/png/new_benchmark.png b/Report/png/new_benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..78541a7d3025c1e825d084e269a66bd4c8d3fcb1 GIT binary patch literal 91405 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 literal 0 HcmV?d00001 diff --git a/db/db_impl.cc b/db/db_impl.cc index 727a021..736fdae 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1236,6 +1236,12 @@ void DBImpl::ReleaseSnapshot(const Snapshot* snapshot) { // Convenience methods Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { //ToDo + // 创建读写锁,放在函数内部 + static std::mutex rw_mutex_; // 全局静态锁,确保多个线程安全 + + // 加写锁,确保写操作的原子性 + std::unique_lock lock(rw_mutex_); + WriteBatch batch; WriteBatch indexBatch; Status s; @@ -1326,6 +1332,12 @@ Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { //ToDo + // 创建读写锁,放在函数内部 + static std::mutex rw_mutex_; // 全局静态锁,确保多个线程安全 + + // 加写锁,确保写操作的原子性 + std::unique_lock lock(rw_mutex_); + WriteBatch batch; WriteBatch indexBatch; Status s; @@ -1771,7 +1783,7 @@ Status DBImpl::DeleteIndex(const std::string& fieldName) { std::vector DBImpl::QueryByIndex(const std::string& fieldName) { std::vector results; - // 假设您有一个存储索引的数据库 indexDb_ + // 假设有一个存储索引的数据库 indexDb_ // leveldb::ReadOptions read_options; // std::string value; diff --git a/test/Benchmark_test.cc b/test/Benchmark_test.cc index 5a587ed..9bfd228 100644 --- a/test/Benchmark_test.cc +++ b/test/Benchmark_test.cc @@ -2,6 +2,11 @@ #include #include #include +#include +#include +#include +#include +#include #include using namespace std::chrono; @@ -57,6 +62,8 @@ std::vector FindKeysByField(leveldb::DB* db, const Field& field) { return keys; } +size_t total_size = 0; // 用于累加请求写入的数据量 + // 生成数据并插入数据库 void GenerateAndInsertData(leveldb::DB* db, int num_entries) { leveldb::WriteOptions write_options; @@ -70,9 +77,121 @@ void GenerateAndInsertData(leveldb::DB* db, int num_entries) { std::string value = "name:" + name + "|address:" + address + "|phone:" + phone; + // 计算每条记录的大小 + size_t key_size = key.size(); + size_t value_size = value.size(); + size_t record_size = key_size + value_size; + + total_size += record_size; // 累加到总请求写入的数据量 + status = db->Put(write_options, key, value); assert(status.ok() && "Failed to insert data"); } + std::cout << "Total data written (in bytes): " << total_size << " bytes" << std::endl; +} + +// 计算统计指标 +void CalculateLatencyStats(const std::vector& latencies) { + if (latencies.empty()) return; + + // 平均延迟 + double avg_latency = std::accumulate(latencies.begin(), latencies.end(), 0.0) / latencies.size(); + + // P75 延迟 + std::vector sorted_latencies = latencies; + std::sort(sorted_latencies.begin(), sorted_latencies.end()); + double p75_latency = sorted_latencies[latencies.size() * 75 / 100]; + + // P99 延迟 + double p99_latency = sorted_latencies[latencies.size() * 99 / 100]; + + // 输出结果 + std::cout << "Average latency: " << avg_latency << " ms" << std::endl; + std::cout << "P75 latency: " << p75_latency << " ms" << std::endl; + std::cout << "P99 latency: " << p99_latency << " ms" << std::endl; +} + +// 基准测试:计算吞吐量和延迟 +void BenchmarkWritePerformance(leveldb::DB* db, int num_entries) { + leveldb::WriteOptions write_options; + leveldb::Status status; + + std::vector latencies; // 存储每次操作的延迟 + + auto start = high_resolution_clock::now(); + + for (int i = 1; i <= num_entries; ++i) { + std::string key = "k_" + std::to_string(i); + std::string value = "name:Customer#" + std::to_string(i) + "|address:Address_" + std::to_string(i) + "|phone:25-989-741-" + std::to_string(1000 + i); + + // 计算每条记录的大小 + size_t key_size = key.size(); + size_t value_size = value.size(); + size_t record_size = key_size + value_size; + + total_size += record_size; // 累加到总请求写入的数据量 + + auto op_start = high_resolution_clock::now(); + status = db->Put(write_options, key, value); + auto op_end = high_resolution_clock::now(); + + assert(status.ok() && "Failed to insert data"); + + // 记录每次操作的延迟(ms) + double latency = duration_cast(op_end - op_start).count() / 1000.0; + latencies.push_back(latency); + } + + auto end = high_resolution_clock::now(); + auto duration = duration_cast(end - start).count(); + + // 计算吞吐量 + double throughput = num_entries / (duration / 1000000.0); + + std::cout << "Total time for " << num_entries << " writes: " << duration / 1000.0 << " ms" << std::endl; + std::cout << "Throughput: " << throughput << " OPS (operations per second)" << std::endl; + + // 计算延迟统计 + CalculateLatencyStats(latencies); +} + +// 获取写放大(Write Amplification) +void CalculateWriteAmplification(leveldb::DB* db) { + std::string property; + + bool success = db->GetProperty("leveldb.stats", &property); + if (!success) { + std::cerr << "Failed to get db stats" << std::endl; + return; + } + + + + + // 获取日志文件中的合并信息 + std::ifstream log_file("/home/kevin/leveldb_proj/build/testdb/LOG"); // 替换为实际日志路径 + std::string log_line; + size_t total_compacted = 0; + + std::regex compact_regex(R"(.*Compacted.*=>\s*([\d]+)\s*bytes)"); + + while (std::getline(log_file, log_line)) { + std::smatch match; + if (std::regex_search(log_line, match, compact_regex)) { + total_compacted += std::stoull(match[1]); + } + } + + log_file.close(); + + double write_amplification = static_cast(total_compacted) ; + std::cout << "Write Amplification: " << write_amplification << std::endl; + + std::cout << "Total data written (in bytes): " << total_size << " bytes" << std::endl; + + double write_amplification_factor = static_cast(total_compacted) / total_size; + std::cout << "Write Amplification Factor: " << write_amplification_factor << std::endl; + } // 基准测试:二级索引性能提升 @@ -91,7 +210,7 @@ void BenchmarkFieldQueryWithIndex(leveldb::DB* db) { leveldb::Status status = db->CreateIndexOnField("name"); end = high_resolution_clock::now(); duration = duration_cast(end - start); - std::cout << "Time to create index: " << duration.count() << std::endl; + std::cout << "Time to create index: " << duration.count() << " microseconds" << std::endl; // 测试后,查询有索引的字段性能 start = high_resolution_clock::now(); @@ -110,17 +229,17 @@ void BenchmarkFieldQueryWithIndex(leveldb::DB* db) { } } -// 基准测试:记录插入时的性能影响 -void BenchmarkWritePerformance(leveldb::DB* db, int num_entries) { - leveldb::WriteOptions write_options; - auto start = high_resolution_clock::now(); +// // 基准测试:记录插入时的性能影响 +// void BenchmarkWritePerformance(leveldb::DB* db, int num_entries) { +// leveldb::WriteOptions write_options; +// auto start = high_resolution_clock::now(); - GenerateAndInsertData(db, num_entries); // 执行批量插入 +// GenerateAndInsertData(db, num_entries); // 执行批量插入 - auto end = high_resolution_clock::now(); - auto duration = duration_cast(end - start); - std::cout << "Insertion time for " << num_entries << " entries: " << duration.count() << " microseconds" << std::endl; -} +// auto end = high_resolution_clock::now(); +// auto duration = duration_cast(end - start); +// std::cout << "Insertion time for " << num_entries << " entries: " << duration.count() << " microseconds" << std::endl; +// } // 基准测试:记录删除二级索引的开销 void BenchmarkDeleteIndex(leveldb::DB* db, const std::string& field_name) { @@ -168,6 +287,9 @@ int main() { // 获取数据库大小 GetDatabaseSize(db); + // 计算写放大 + CalculateWriteAmplification(db); + // 测试删除二级索引的开销 BenchmarkDeleteIndex(db, "name");