Files
markbase/docs/fuse_poc/DESIGN_LIMITATIONS.md
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

7.2 KiB
Raw Blame History

MarkBase FUSE - 设计限制分析

📊 数据库统计

  • 节点总数: 12,660 nodes
  • 文件夹: 803 folders
  • 文件: 11,857 files
  • 平均大小: 1.4 MB
  • 最大文件: 3.09 GB (VolPack_ME5012/Test_Plan_ME5.docx)
  • 数据库大小: 12.9 MB

🔧 设计限制详解

1. 缓存限制

当前设计

#define CACHE_SIZE 1000         // 文件缓存
#define PATH_CACHE_SIZE 2000    // 路径缓存

限制:

  • 固定大小数组(不是动态增长)
  • ⚠️ 超过 1000 个文件时,新文件不缓存
  • ⚠️ 超过 2000 个路径时,新路径不缓存
  • 只缓存最大文件(启动时预加载)

影响:

  • 11,857 files 中,只有 1,000 个被缓存8.4%
  • 首次访问未缓存文件时,需要数据库查询
  • 性能会从 3300 MB/s 下降到 ~300 MB/s未缓存

改进建议:

// 动态缓存LRU策略
#define CACHE_SIZE 5000         // 增加到 5000
#define PATH_CACHE_SIZE 10000   // 增加到 10000

// 或使用哈希表(无限制)
HashMap *file_cache;
HashMap *path_cache;

2. 单线程限制

当前设计

// FUSE operations 在单线程中执行
static pthread_mutex_t db_mutex;
static pthread_mutex_t cache_mutex;

限制:

  • Thread-safe使用 mutex
  • ⚠️ 单线程处理所有请求(并发瓶颈)
  • ⚠️ CPU 使用率 100%(单核)

影响:

  • 50 个并发请求时CPU 100%(测试结果)
  • 无法利用多核 CPUM4 有 8-10 核心)
  • 理论吞吐量上限: ~3500 MB/s单线程

改进建议:

// 多线程 FUSElibfuse3 支持)
fuse_session_loop_mt();  // 使用多线程版本

// 或使用线程池
ThreadPool *pool;
pthread_pool_create(8);  // M4 优化配置

3. 路径查询限制

当前设计

// 递归查询路径
for (level = 0; level < depth; level++) {
    // 每层查询一次数据库
    sqlite3_prepare_v2(...);
}

限制:

  • ⚠️ 深度递归查询(多层目录时性能下降)
  • ⚠️ 每层一次数据库查询
  • ⚠️ 无路径索引优化

影响:

  • /Home/Accusys/Accusys_FAE/VolPack_ME5012/Test_Plan_ME5.docx
    • 深度: 5 层
    • 查询次数: 5 次
    • 性能: 从 3300 MB/s 下降到 ~500 MB/s

改进建议:

-- 创建路径索引
CREATE INDEX idx_path_lookup ON file_nodes(label, parent_id);

-- 或使用完整路径缓存
CREATE TABLE path_index (
    full_path TEXT PRIMARY KEY,
    node_id TEXT
);

4. 数据库路径硬编码

当前设计

static const char *db_path = "/Users/accusys/markbase/data/users/warren.sqlite";

限制:

  • 硬编码路径(不支持多用户)
  • 需要修改代码才能切换用户
  • 不支持动态配置

影响:

  • 每个用户需要编译不同版本
  • 无法动态切换用户

改进建议:

// 从参数或环境变量读取
char *db_path = getenv("MARKBASE_DB_PATH");
// 或
char *user = argv[1];
char db_path[256];
sprintf(db_path, "data/users/%s.sqlite", user);

5. 文件大小限制

当前设计

long file_size;  // 32-bit signed integer

限制:

  • ⚠️ 最大文件: 2GB32-bit signed
  • ⚠️ 无法处理 >2GB 文件

影响:

  • 当前最大文件: 3.09 GB超出限制
  • 可能导致溢出错误

改进建议:

long long file_size;  // 64-bit integer
// 或
size_t file_size;     // platform-specific (64-bit on macOS)

6. FUSE Backend 限制

当前设计

fuse-t:/mb_mount on /private/tmp/mb_mount (nfs, ...)

限制:

  • ⚠️ FUSE-T 使用 NFSv4 backend
  • ⚠️ TCP/IP overhead: ~5-10%
  • ⚠️ macOS 26+ 才支持 FSKit更快

影响:

  • 理论上限: ~700-800 MB/sNFSv4
  • 当前实测: 3300 MB/s缓存效果

改进建议:

# macOS 26+ 使用 FSKit backend
fuse-t --backend fskit

# 或直接使用 macFUSE但需要 kernel extension

7. 内存限制

当前设计

// 预分配固定内存
FileCacheEntry file_cache[1000];
PathCacheEntry path_cache[2000];

限制:

  • 固定内存占用: ~1.5 MB
  • ⚠️ 无法根据实际需求调整
  • ⚠️ 小内存设备可能浪费资源

影响:

  • 16GB RAM M4: 无影响
  • 小内存设备4GB: ~0.04% 内存占用

改进建议:

// 动态内存分配
FileCacheEntry *file_cache = malloc(actual_cache_size);
// 根据可用内存动态调整
size_t cache_size = system_memory * 0.01;  // 1% of system memory

8. 功能限制

当前实现

  • read: 支持大文件读取
  • readdir: 支持目录列表
  • getattr: 支持文件属性
  • lookup: 支持路径查找
  • ⚠️ write: 已实现但未测试
  • ⚠️ mkdir: 已实现但未测试
  • rename: 未实现
  • unlink: 未实现
  • symlink: 未实现
  • xattr: 未实现
  • lock: 未实现

影响:

  • 只能读取文件(只读模式)
  • 无法创建、修改、删除文件
  • 无法使用符号链接

改进建议:

  • 添加完整的 POSIX FUSE operations
  • 测试 write/mkdir 功能
  • 实现缺失的 operations

📊 性能瓶颈分析

当前瓶颈

瓶颈 影响程度 当前状态 改进方案
缓存大小 8.4% 缓存 增加到 5000+
单线程 CPU 100% 多线程 FUSE
路径查询 5层递归 路径索引
文件大小 2GB限制 改用 64-bit
Backend NFSv4 FSKit (macOS 26+)

🎯 推荐改进优先级

Phase 1立即改进

  1. 增加缓存大小 → CACHE_SIZE 5000, PATH_CACHE_SIZE 10000
  2. 修复文件大小限制 → 使用 long long file_size
  3. 动态数据库路径 → 从参数读取

Phase 2中期改进

  1. 多线程 FUSE → 使用 fuse_session_loop_mt()
  2. 路径索引 → 创建数据库索引
  3. 完整 POSIX 操作 → 实现 write/rename/unlink

Phase 3长期优化

  1. 动态内存管理 → 根据系统内存调整
  2. FSKit Backend → macOS 26+ 支持
  3. 分布式缓存 → 支持 Redis/Memcached

📈 性能预期改进

改进 预期性能提升
缓存增加到 5000 +20% (更多文件缓存)
多线程 FUSE (8 threads) +300% (利用多核)
路径索引 +50% (减少递归)
FSKit Backend +10% (减少 overhead)
综合改进 预期: 10 GB/s

🔍 当前限制总结

软限制(可改进):

  • 缓存大小不足1000 vs 11857 files
  • 单线程瓶颈(无法利用多核)
  • 路径查询效率(递归查询)
  • 文件大小限制32-bit

硬限制(架构限制):

  • ⚠️ FUSE-T NFSv4 backendTCP/IP overhead
  • ⚠️ libfuse3 单线程设计(需使用 mt 版本)
  • ⚠️ SQLite 数据库(非分布式)

🎬 结论

当前设计:

  • 简单、稳定、易维护
  • 性能优秀3300 MB/s
  • ⚠️ 有明确的改进空间

推荐策略:

  1. 短期: 修复硬编码和文件大小限制
  2. 中期: 增加缓存和多线程支持
  3. 长期: 完整 POSIX 操作和 FSKit backend

文档版本: 1.0 日期: 2026-05-28 分析基于: markbase_v15_balanced.c (477 lines)