之前的solution是POSIX based filesystem: 一些NAS(Network attached storage) 设备mount 到NFS上
主要问题:per file metadata 导致过多的disk operation because of metadata lookup。
读取一个文件一般至少3个步骤
1)一次或者多次disk operation 访问到directory 的metadata, 从文件名得到文件的的inode
2) 把文件的inode从磁盘读入,得到文件的metadata/file handle(物理地址信息,size等)
3)读文件本身
实际情况:读一个文件可能涉及10次disk operation
一个简单的优化:不要让一个目录装太多文件,100来个比较好,这样一页可以装下目录的metadata,使得访问目录metadata只需要一次IO,这样访问一个文件只需要3次IO
Haystack的主要设计目标就是使得读一个照片只需要一次disk operation,就是读文件本身的IO,所有metadata都在memory里。
要把所有metadata都放到memory里,需要reduce整体metadata的大小,方法就改变per file metadata的结构,多个照片文件放到一个大文件里,维护一个in-memory的 mapping: photo id -> {file, offset, size},这样物理file的个数(同时inode的数目)大大减少了。