原力注入

Java LSM Tree 学习之第一天完成总结

Java LSM Tree 学习之第一天完成总结

项目地址:https://github.com/ForceInjection/java-lsm-tree

1. 任务完成情况

✅ 所有第一天任务已成功完成!

Image

1.1 构建系统设置

1.1.1 build.sh 脚本功能

  • • build.sh - 构建脚本(位于项目根目录)
  • • build/logs/ - 构建日志目录
  • • target/ - Maven 标准构建产物输出目录

1.1.2 构建脚本功能

  • • ✅ 使用 Maven Docker 镜像 (maven:3.8.6-openjdk-8) 构建项目
  • • ✅ 支持 Java 8+ 兼容性(项目配置支持 Java 8,实际运行环境 Java 17)
  • • ✅ 提供多种构建选项:
    • • ./build.sh build - 构建项目
    • • ./build.sh test - 运行测试
    • • ./build.sh clean - 清理项目
  • • ✅ 自动处理构建产物到 Maven 标准目录
  • • ✅ 详细的日志记录和错误处理

1.2 测试套件系统

1.2.1 创建的文件和目录

  • • test-suite/ - 测试套件目录
  • • test-suite/test-suite.sh - 测试套件主脚本
  • • test-suite/README.md - 详细使用说明
  • • test-suite/lib/ - 模块化库文件目录
    • • common.sh - 公共函数库
    • • session.sh - 会话管理模块
    • • tests.sh - 测试执行模块
    • • reports.sh - 报告生成模块
  • • test-suite/results/ - 测试结果目录

1.2.2 测试套件功能

  • • ✅ 功能测试 (functional):
    • • JUnit 测试套件执行
    • • 基本功能示例验证
    • • 数据一致性检查
  • • ✅ 性能测试 (performance):
    • • 顺序写入性能测试
    • • 随机写入性能测试
    • • 读取性能测试
    • • 混合工作负载测试
    • • 写入延迟分布分析
    • • MemTable 刷盘影响测试
  • • ✅ 内存测试 (memory):
    • • 内存使用情况监控
    • • 内存泄漏检测
    • • GC 性能分析
  • • ✅ 压力测试 (stress):
    • • 多线程并发测试
    • • 大数据量稳定性测试
  • • ✅ 会话管理系统:
    • • 智能会话管理和复用
    • • 测试会话历史记录
    • • 会话归档和清理功能
  • • ✅ 测试报告生成:
    • • HTML 格式的详细测试报告
    • • 性能指标统计
    • • 测试结果可视化

1.2.3 测试脚本使用方法

# 运行所有测试
./test-suite/test-suite.sh all

# 运行特定测试

./test-suite/test-suite.sh functional    # 功能测试
./test-suite/test-suite.sh performance   # 性能测试
./test-suite/test-suite.sh memory        # 内存测试
./test-suite/test-suite.sh stress        # 压力测试

# 会话管理

./test-suite/test-suite.sh list          # 列出所有测试会话
./test-suite/test-suite.sh show [会话ID]  # 显示会话详情
./test-suite/test-suite.sh delete [会话ID] # 删除指定会话
./test-suite/test-suite.sh report [会话ID] # 重新生成报告

# 清理和归档

./test-suite/test-suite.sh clean         # 清理当前测试环境
./test-suite/test-suite.sh clean-all     # 清理所有测试数据
./test-suite/test-suite.sh archive [天数] # 归档旧会话

2. 测试报告解读

2.1 测试机器规格

2.1.1 硬件配置

  • • 处理器:Apple M1 Pro (8 核心,8 物理核心,8 逻辑核心)
  • • 架构:ARM64 (Apple Silicon)
  • • 操作系统:macOS 15.6.1 (Build 24G90)
  • • 内核版本:Darwin 24.6.0
  • • 内存:16 GB 统一内存架构,测试分配 2GB 堆内存
  • • 存储:Apple Fabric SSD 固态硬盘,确保 I/O 性能稳定

2.1.2 软件环境

  • • Java 版本:OpenJDK 17.0.16 (Homebrew)
  • • JVM 实现:OpenJDK 64-Bit Server VM
  • • JVM 构建:17.0.16+0, mixed mode, sharing
  • • 垃圾收集器:G1GC (低延迟垃圾收集器)
  • • 构建环境:Docker Maven 3.8.6 + OpenJDK 8 (构建环境)

2.1.3 测试环境特点

  • • macOS 优势:
    • • 优秀的内存管理和进程调度
    • • 稳定的文件系统性能
    • • 低系统噪声,测试结果更稳定
  • • 性能基线说明:
    • • 测试结果基于 macOS 环境
    • • 在 Linux/Windows 环境下性能可能有所差异
    • • 建议在目标部署环境中重新建立性能基线

2.2 测试报告结构说明

测试套件生成的报告包含以下几个层次:

2.2.1 报告文件组织

test-suite/results/sessions/[会话ID]/
├── summary.json              # 测试会话元数据
├── test_results.json         # 详细测试结果数据
├── test_summary.txt          # 简要文本摘要
├── reports/                  # HTML和JSON格式报告
│   ├── test_report_[会话ID].html
│   └── test_report_[会话ID].json
├── functional/               # 功能测试详细结果
├── performance/              # 性能测试详细结果
│   ├── performance_summary.txt
│   ├── performance_results_[会话ID].txt
│   └── benchmark_data_round_[1-3]/
├── memory/                   # 内存测试详细结果
└── stress/                   # 压力测试详细结果

2.2.2 会话管理系统

  • • 会话 ID 格式:YYYYMMDD_HHMMSS(如:20251026_192613)
  • • latest 符号链接:始终指向最新的测试会话
  • • 会话归档:自动归档超过指定天数的旧会话

2.3 报告使用指南

2.3.1 查看测试报告

# 查看最新测试会话
./test-suite/test-suite.sh show latest

# 查看特定会话

./test-suite/test-suite.sh show 20251026_192613

# 重新生成HTML报告

./test-suite/test-suite.sh report latest

2.3.2 性能基线建立

当前测试结果可作为性能基线:

  • • 写入基线:随机写入 ~170,000 ops/sec
  • • 读取基线:~2,500 ops/sec
  • • 混合负载基线:~4,200 ops/sec
  • • 延迟基线:平均 3.1μs,P99 < 7μs

2.3.3 性能回归检测

通过对比历史测试会话,可以检测:

  • • 性能回归问题
  • • 优化效果验证
  • • 不同配置的性能差异

2.4 性能测试报告深度解读

2.4.1 测试环境信息

{
  "environment": {
    "java_version": "17.0.16",
    "os": "Darwin 24.6.0",
    "java_opts": "-Xmx2g -Xms1g -XX:+UseG1GC"
  }
}
  • • JVM 配置:2GB 最大堆内存,1GB 初始堆内存,使用 G1 垃圾收集器
  • • 测试轮数:每个性能测试执行 3 轮,确保结果稳定性

2.4.2 写入性能分析

顺序写入性能:

  • • 1,000 条记录:~20,000 ops/sec
  • • 5,000 条记录:~97,000 ops/sec
  • • 10,000 条记录:~91,000 ops/sec
  • • 20,000 条记录:~109,000 ops/sec

随机写入性能:

  • • 1,000 条记录:~167,000 ops/sec
  • • 5,000 条记录:~165,000 ops/sec
  • • 10,000 条记录:~162,000 ops/sec
  • • 20,000 条记录:~190,000 ops/sec

关键观察:

  • • 随机写入性能优于顺序写入,这符合 LSM-Tree 的设计特点
  • • 随着数据量增加,性能趋于稳定,显示良好的扩展性
  • • 小批量写入存在启动开销,大批量写入效率更高

2.4.3 读取性能分析

读取性能指标:

  • • 1,000 次读取:~2,000 ops/sec,命中率 100%
  • • 5,000 次读取:~2,500 ops/sec,命中率 100%
  • • 10,000 次读取:~3,000 ops/sec,命中率 100%

性能特征:

  • • 读取性能相对写入较低,这是 LSM-Tree 的典型特征
  • • 100%命中率表明测试数据完全可读取
  • • 随着读取量增加,吞吐量有所提升(缓存预热效应)

2.4.4 混合工作负载分析

测试配置:70%读操作 + 30%写操作

  • • 总操作数:15,000
  • • 读操作:10,559 次
  • • 写操作:4,441 次
  • • 整体吞吐量:~4,200 ops/sec

系统状态:

LSMTreeStats{
  activeMemTable=4441,
  immutableMemTables=0,
  ssTables=1
}

2.4.5 延迟分布分析

写入延迟统计(微秒):

  • • 最小值:2.5μs
  • • 最大值:30-108μs
  • • 平均值:3.1μs
  • • 中位数:3.0μs
  • • P95:3.7μs
  • • P99:6.8μs

延迟特征:

  • • 极低的平均延迟(3.1 微秒)
  • • 良好的延迟一致性(P95 和 P99 差距较小)
  • • 偶发的高延迟可能与 GC 或系统调度相关

2.4.6 MemTable 刷盘影响分析

频繁刷盘测试:

  • • 数据量:2,000 条记录
  • • 吞吐量:~147,000 ops/sec
  • • 结果状态:20 个 SSTable 文件

关键发现:

  • • 频繁刷盘对写入性能影响相对较小
  • • 系统能够有效处理 MemTable 到 SSTable 的转换
  • • 多个 SSTable 的存在验证了分层存储机制

2.5 内存测试报告解读

2.5.1 内存使用监控

  • • 内存泄漏检测:PASS
  • • 内存使用效率:良好,无异常内存增长
  • • 内存使用模式:符合 LSM-Tree 的内存管理预期

2.5.2 内存优化建议

基于测试结果的内存优化方向:

  • • MemTable 大小调优
  • • 缓存策略优化
  • • 压缩策略调整

2.6 压力测试报告解读

2.6.1 并发测试结果

  • • 多线程并发:PASS
  • • 数据一致性:在并发环境下保持数据完整性
  • • 系统稳定性:长时间运行无崩溃

2.6.2 大数据量稳定性

  • • 大批量数据处理:系统能够处理大量数据而不出现性能急剧下降
  • • 资源管理:内存和文件句柄管理良好

3. 总结

第一天的学习目标已经完全达成:

3.1 技术理解深度

  1. 1. ✅ 构建系统:完整的 Maven 构建环境,支持多种构建选项
  2. 2. ✅ 测试套件系统:全面的测试框架,包含功能、性能、内存、压力测试,以及智能会话管理
  3. 3. ✅ 项目验证:所有测试通过,构建成功,系统运行正常
  4. 4. ✅ 性能基线:建立了完整的性能基线和测试报告解读体系

系统特色:

  • • 模块化设计,易于维护和扩展
  • • 智能会话管理,支持测试复用和历史追踪
  • • 全面的测试覆盖,从功能到性能到内存分析
  • • 详细的 HTML 报告生成和可视化
  • • 深度的性能分析和基线建立

测试报告价值:

  • • 提供了 LSM-Tree 实现的性能基线
  • • 建立了完整的性能监控体系
  • • 为后续优化提供了数据支撑
  • • 验证了系统的稳定性和可靠性

下一步计划:

  • • 深入分析 LSM-Tree 的核心算法实现
  • • 基于性能报告识别和优化性能瓶颈
  • • 扩展更多测试场景和性能指标
  • • 建立持续性能监控机制