核心功能: - ✅ 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)
7.2 KiB
7.2 KiB
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%(测试结果)
- 无法利用多核 CPU(M4 有 8-10 核心)
- 理论吞吐量上限: ~3500 MB/s(单线程)
改进建议:
// 多线程 FUSE(libfuse3 支持)
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
限制:
- ⚠️ 最大文件: 2GB(32-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/s(NFSv4)
- 当前实测: 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(立即改进)
- 增加缓存大小 → CACHE_SIZE 5000, PATH_CACHE_SIZE 10000
- 修复文件大小限制 → 使用
long long file_size - 动态数据库路径 → 从参数读取
Phase 2(中期改进)
- 多线程 FUSE → 使用
fuse_session_loop_mt() - 路径索引 → 创建数据库索引
- 完整 POSIX 操作 → 实现 write/rename/unlink
Phase 3(长期优化)
- 动态内存管理 → 根据系统内存调整
- FSKit Backend → macOS 26+ 支持
- 分布式缓存 → 支持 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 backend(TCP/IP overhead)
- ⚠️ libfuse3 单线程设计(需使用 mt 版本)
- ⚠️ SQLite 数据库(非分布式)
🎬 结论
当前设计:
- ✅ 简单、稳定、易维护
- ✅ 性能优秀(3300 MB/s)
- ⚠️ 有明确的改进空间
推荐策略:
- 短期: 修复硬编码和文件大小限制
- 中期: 增加缓存和多线程支持
- 长期: 完整 POSIX 操作和 FSKit backend
文档版本: 1.0 日期: 2026-05-28 分析基于: markbase_v15_balanced.c (477 lines)