 Curve文件系统空间分配方案1 of 11 Curve文件系统空间分配方案(基于块的方案,已实现)© XXX Page 2 of 11 背景 本地文件系统空间分配相关特性 局部性 延迟分配/Allocate-on-flush Inline file/data 空间分配 整体设计 空间分配流程 特殊情况 空间回收 小文件处理 并发问题 文件系统扩容 接口设计 RPC接口 空间分配器接口 背景 根据 ,文件系 ,文件系统基于当前的块进行实现,所以需要设计基于块的空间分配器,用于分配并存储文件数据。 CurveFS方案设计(总体设计,只实现了部分) 本地文件系统空间分配相关特性 局部性 尽量分配连续的磁盘空间,存储文件的数据。这一特性主要是针对HDD进行的优化,降低磁盘寻道时间。 延迟分配/Allocate-on-flush 在sync/flush之前,尽可能多的积累更多的文件数据块才进行空间分配,一方面可以提高局部性,另一方面可以降低磁盘碎片。 几百字节的小文件不单独分配磁盘空间,直接把数据存放到文件的元数据中。 针对上述的本地文件系统特性,Curve文件系统分配需要着重考虑 。 局部性 虽然Curve是一个分布式文件系统,但是单个文件系统的容量可能会比较大,如果在空间分配时,不考虑局部性,inode中记录的extent数量很多,导致文件系统元数据量很大。© XXX Page 3 of 11 假如文件系统大小为1PiB,空间分配粒度为1Mi0 码力 | 11 页 | 159.17 KB | 6 月前3 Curve文件系统空间分配方案1 of 11 Curve文件系统空间分配方案(基于块的方案,已实现)© XXX Page 2 of 11 背景 本地文件系统空间分配相关特性 局部性 延迟分配/Allocate-on-flush Inline file/data 空间分配 整体设计 空间分配流程 特殊情况 空间回收 小文件处理 并发问题 文件系统扩容 接口设计 RPC接口 空间分配器接口 背景 根据 ,文件系 ,文件系统基于当前的块进行实现,所以需要设计基于块的空间分配器,用于分配并存储文件数据。 CurveFS方案设计(总体设计,只实现了部分) 本地文件系统空间分配相关特性 局部性 尽量分配连续的磁盘空间,存储文件的数据。这一特性主要是针对HDD进行的优化,降低磁盘寻道时间。 延迟分配/Allocate-on-flush 在sync/flush之前,尽可能多的积累更多的文件数据块才进行空间分配,一方面可以提高局部性,另一方面可以降低磁盘碎片。 几百字节的小文件不单独分配磁盘空间,直接把数据存放到文件的元数据中。 针对上述的本地文件系统特性,Curve文件系统分配需要着重考虑 。 局部性 虽然Curve是一个分布式文件系统,但是单个文件系统的容量可能会比较大,如果在空间分配时,不考虑局部性,inode中记录的extent数量很多,导致文件系统元数据量很大。© XXX Page 3 of 11 假如文件系统大小为1PiB,空间分配粒度为1Mi0 码力 | 11 页 | 159.17 KB | 6 月前3
 古月《ROS入门21讲》9.创建工作空间与功能包.pdf9.创建工作空间与功能包 主 讲 人 : 古 月 工作空间 • • • • 创建工作空间 创建功能包 创建功能包 创建功能包 感谢观看 怕什么真理无穷,进一寸有一寸的欢喜 更多精彩,欢迎关注 ?0 码力 | 7 页 | 1.02 MB | 1 年前3 古月《ROS入门21讲》9.创建工作空间与功能包.pdf9.创建工作空间与功能包 主 讲 人 : 古 月 工作空间 • • • • 创建工作空间 创建功能包 创建功能包 创建功能包 感谢观看 怕什么真理无穷,进一寸有一寸的欢喜 更多精彩,欢迎关注 ?0 码力 | 7 页 | 1.02 MB | 1 年前3
 Curve文件系统元数据管理inode+dentry方式?当前curve块存储的kv方式? 是否有单独的元数据管理服务器? 2、其他文件系统的调研总结 fs 中心化元数据 内存namespace元数据 内存空间分配元数据 元数据持久化 元数据扩展 小文件优化 空间管理单位 数据持久化 其他© XXX Page 3 of 24 moosefs(mfs) 有元数据服务器 全内存 fsnode → hashtable(inode id) offset) etcd 差 块设备,最小10GB segment + chunk raft 块设备的元数据管理 cephfs 3、各内存结构体 时间复杂度 空间复杂度 特点 可用实现 Btree 一个节点上保存多条数据,减少树的层次(4~5层),方便从盘上读取数据,减少去盘上读取次数。适合在盘上和内存组织目录树。 google,https://github astcommon/tr ,(LGPL) ee/master/src hash table O(1)~O(n) O(n) + table 需要占用额外空间,性能和hash表的大小有关,最理想可以达到O(1)复杂度,最差O(n)复杂度。 c++ stl unordered_map moose,使用c实现 4、curve文件系统的元数据内存组织 curv0 码力 | 24 页 | 204.67 KB | 6 月前3 Curve文件系统元数据管理inode+dentry方式?当前curve块存储的kv方式? 是否有单独的元数据管理服务器? 2、其他文件系统的调研总结 fs 中心化元数据 内存namespace元数据 内存空间分配元数据 元数据持久化 元数据扩展 小文件优化 空间管理单位 数据持久化 其他© XXX Page 3 of 24 moosefs(mfs) 有元数据服务器 全内存 fsnode → hashtable(inode id) offset) etcd 差 块设备,最小10GB segment + chunk raft 块设备的元数据管理 cephfs 3、各内存结构体 时间复杂度 空间复杂度 特点 可用实现 Btree 一个节点上保存多条数据,减少树的层次(4~5层),方便从盘上读取数据,减少去盘上读取次数。适合在盘上和内存组织目录树。 google,https://github astcommon/tr ,(LGPL) ee/master/src hash table O(1)~O(n) O(n) + table 需要占用额外空间,性能和hash表的大小有关,最理想可以达到O(1)复杂度,最差O(n)复杂度。 c++ stl unordered_map moose,使用c实现 4、curve文件系统的元数据内存组织 curv0 码力 | 24 页 | 204.67 KB | 6 月前3
 FIT2CLOUD CloudExplorer 产品白皮书 v1.7减少资源浪费降低成本、IT 投入可视化.......................................................9 1.3.5 简化异构基础架构及工具带来的服务管理运维复杂度............................... 10 1.4 能够带来哪些改变................................................... 7 帮助企业在云时代加速数字化转型,一方面充分利用云和通过 IT 服务模式转型解放生 产力,另一方面,减少化解采纳云平台等基础架构后,并在运维工具保持独立分散的环境下, 所带来的服务和管理上的复杂度副作用影响。 1.3 能够解决的问题和价值 1.3.1 大幅减少获取应用运行环境资源排期及总体等待时间 传统 IT 服务模式为“柜台式”,如图 2 所示。在项目的开发测试及投产阶段,应用开发 10%的资源浪费。 如图 4 所示。 图 4: 资源精细化运营管理回收优化 杭州飞致云信息科技有限公司 软件用起来才有价值,才有改进的机会 10 1.3.5 简化异构基础架构及工具带来的服务管理运维复杂度 在大多数企业信息技术部门,基本靠人工维护资源目录,做生命周期管理,由于缺乏分 组分类管理,以及生命周期管理,集中统一管理以及自动化运维支持,导致靠人工非常难以 快速地提供服务、高效管理,难以0 码力 | 60 页 | 0 Bytes | 1 年前3 FIT2CLOUD CloudExplorer 产品白皮书 v1.7减少资源浪费降低成本、IT 投入可视化.......................................................9 1.3.5 简化异构基础架构及工具带来的服务管理运维复杂度............................... 10 1.4 能够带来哪些改变................................................... 7 帮助企业在云时代加速数字化转型,一方面充分利用云和通过 IT 服务模式转型解放生 产力,另一方面,减少化解采纳云平台等基础架构后,并在运维工具保持独立分散的环境下, 所带来的服务和管理上的复杂度副作用影响。 1.3 能够解决的问题和价值 1.3.1 大幅减少获取应用运行环境资源排期及总体等待时间 传统 IT 服务模式为“柜台式”,如图 2 所示。在项目的开发测试及投产阶段,应用开发 10%的资源浪费。 如图 4 所示。 图 4: 资源精细化运营管理回收优化 杭州飞致云信息科技有限公司 软件用起来才有价值,才有改进的机会 10 1.3.5 简化异构基础架构及工具带来的服务管理运维复杂度 在大多数企业信息技术部门,基本靠人工维护资源目录,做生命周期管理,由于缺乏分 组分类管理,以及生命周期管理,集中统一管理以及自动化运维支持,导致靠人工非常难以 快速地提供服务、高效管理,难以0 码力 | 60 页 | 0 Bytes | 1 年前3
 openEuler 23.09 技术白皮书qemu 6.2.0-79.oe2309 libvirt 6.2.0-59.oe2309 virt-manager 4.1.0.2-oe2309 qemu 8.1.0 虚拟机 部件名称 最小虚拟化空间要求 架构 ARM64、x86_64 CPU 2 个 CPU 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20GB 场景创新 09 openEuler BandWidth Memory)严重不足,现有的手动 swap 方案性能损耗大且 通用性差。 • 搜推、大数据场景存在大量无效数据搬移,缺少高效内存池化方案。 Linux 现有的 HMM 框架,编程复杂度高且依赖人工调优,性能和可移植性差,引发 OS 社区反弹,最终导致 HMM 方 案搁浅。异构加速器领域亟需高效的统一内存管理机制。 异构通用内存管理框架 GMEM (Generalized Memory Management),提供了异构内存互联的中心化管理机制,且 GMEM API 与 Linux 原生内存管理 API 保持统一,易用性强,性能与可移植性好。 加速器使用 GMEM API 将内存接入统一地址空间后,可自动获得 GMEM 面向异构内存编程优化的能力。与此同时,加 速器驱动无需重复实现内存管理框架,大幅降低开发维护带来的成本。 开发者使用一套统一申请、释放的 API,即可完成异构内存编程,无需处理内存搬移等细节。在加速器0 码力 | 52 页 | 5.25 MB | 1 年前3 openEuler 23.09 技术白皮书qemu 6.2.0-79.oe2309 libvirt 6.2.0-59.oe2309 virt-manager 4.1.0.2-oe2309 qemu 8.1.0 虚拟机 部件名称 最小虚拟化空间要求 架构 ARM64、x86_64 CPU 2 个 CPU 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20GB 场景创新 09 openEuler BandWidth Memory)严重不足,现有的手动 swap 方案性能损耗大且 通用性差。 • 搜推、大数据场景存在大量无效数据搬移,缺少高效内存池化方案。 Linux 现有的 HMM 框架,编程复杂度高且依赖人工调优,性能和可移植性差,引发 OS 社区反弹,最终导致 HMM 方 案搁浅。异构加速器领域亟需高效的统一内存管理机制。 异构通用内存管理框架 GMEM (Generalized Memory Management),提供了异构内存互联的中心化管理机制,且 GMEM API 与 Linux 原生内存管理 API 保持统一,易用性强,性能与可移植性好。 加速器使用 GMEM API 将内存接入统一地址空间后,可自动获得 GMEM 面向异构内存编程优化的能力。与此同时,加 速器驱动无需重复实现内存管理框架,大幅降低开发维护带来的成本。 开发者使用一套统一申请、释放的 API,即可完成异构内存编程,无需处理内存搬移等细节。在加速器0 码力 | 52 页 | 5.25 MB | 1 年前3
 2.2.1通过Golang+eBPF实现无侵入应用可观测com/p/507388164 微服务可观测的挑战 第三部分 微服务可观测的挑战 应用:微服务架构、多语言、多协议 挑战1:微服务、多语言、多协议环境下,端到端观测 复杂度上升,埋点成本居高不下 Kubernetes 容器 网络、操作系统、硬件 基础设施层复杂度日益增加 如何关联? 挑战3:数据散落,工具多, 缺少上下文,排查效率低下 业务应用 应用框架 容器虚拟化 系统调用 内核 应用性能监控(APM) core 编程  bcc 依靠运行时汇编,将整个大型LLVM/Clang 库带入并嵌入其中  编译过程中资源用量大,对Cpu、Mem有要求  依赖内核的头包  bpf 程序跟其他的用户空间的程序没有太大区别  编译成二进制文件,可以适应不同运行环境  libbpf 扮演bpf程序装载机角色  开发人员只需要关注bpf程序的正确性和性能,不 需要关注其他依赖关系 通过Golang加载eBPF程序0 码力 | 29 页 | 3.83 MB | 1 年前3 2.2.1通过Golang+eBPF实现无侵入应用可观测com/p/507388164 微服务可观测的挑战 第三部分 微服务可观测的挑战 应用:微服务架构、多语言、多协议 挑战1:微服务、多语言、多协议环境下,端到端观测 复杂度上升,埋点成本居高不下 Kubernetes 容器 网络、操作系统、硬件 基础设施层复杂度日益增加 如何关联? 挑战3:数据散落,工具多, 缺少上下文,排查效率低下 业务应用 应用框架 容器虚拟化 系统调用 内核 应用性能监控(APM) core 编程  bcc 依靠运行时汇编,将整个大型LLVM/Clang 库带入并嵌入其中  编译过程中资源用量大,对Cpu、Mem有要求  依赖内核的头包  bpf 程序跟其他的用户空间的程序没有太大区别  编译成二进制文件,可以适应不同运行环境  libbpf 扮演bpf程序装载机角色  开发人员只需要关注bpf程序的正确性和性能,不 需要关注其他依赖关系 通过Golang加载eBPF程序0 码力 | 29 页 | 3.83 MB | 1 年前3
 openEuler 21.09 技术白皮书并发刷新支持:本地 TLB 和远端 TLB 刷新 并行,优化TLB shootdown流程加速TLB刷新, 提升业务性能。 大页 vmalloc 性能优化:对于超过 huge page 的 最小 size 的空间进行 vmalloc() 分配时,将会尝试 使用 huge page 而不是 base page 来映射内存, 改善 TLB 的利用,降低 TLB miss。 OOM 内存回收算法:在发生 OOM 采用哈希表来管理目录项,提高线性查找效率,减少伪共享。 2. 统一的分配器:数据结构使用统一的分配器,这样可以打破不同数据结构之间的界限,使得内存管理更加地简单 与灵活。 3. 采用软更新技术,简化了实现复杂度:软更新 (Soft Update) 是一种轻量级的保证文件系统一致性的技术。 4. 基于指针的目录双视图计数机制,减少元数据同步开销,有效提升文件系统读写性能。 5. 依赖跟踪:目录项的新 矢量化优化,进行 reduction chains group 的分析以及矢量化,提升程序运行的性能。 6. 支持内存布局优化,通过重新排布结构体成员的位置,使得频繁访问的结构体成员放置于连续的内存空间上,提升 Cache 的命中率,提升程序运行的性能。 7. 支持 fp-model 精度控制选项,精细化控制浮点数计算精度。 应用场景 在高性能计算领域的测试中,运行 WRF、NEMO0 码力 | 35 页 | 3.72 MB | 1 年前3 openEuler 21.09 技术白皮书并发刷新支持:本地 TLB 和远端 TLB 刷新 并行,优化TLB shootdown流程加速TLB刷新, 提升业务性能。 大页 vmalloc 性能优化:对于超过 huge page 的 最小 size 的空间进行 vmalloc() 分配时,将会尝试 使用 huge page 而不是 base page 来映射内存, 改善 TLB 的利用,降低 TLB miss。 OOM 内存回收算法:在发生 OOM 采用哈希表来管理目录项,提高线性查找效率,减少伪共享。 2. 统一的分配器:数据结构使用统一的分配器,这样可以打破不同数据结构之间的界限,使得内存管理更加地简单 与灵活。 3. 采用软更新技术,简化了实现复杂度:软更新 (Soft Update) 是一种轻量级的保证文件系统一致性的技术。 4. 基于指针的目录双视图计数机制,减少元数据同步开销,有效提升文件系统读写性能。 5. 依赖跟踪:目录项的新 矢量化优化,进行 reduction chains group 的分析以及矢量化,提升程序运行的性能。 6. 支持内存布局优化,通过重新排布结构体成员的位置,使得频繁访问的结构体成员放置于连续的内存空间上,提升 Cache 的命中率,提升程序运行的性能。 7. 支持 fp-model 精度控制选项,精细化控制浮点数计算精度。 应用场景 在高性能计算领域的测试中,运行 WRF、NEMO0 码力 | 35 页 | 3.72 MB | 1 年前3
 openEuler 21.03 技术白皮书0-2.fc3 部件名称 最小硬件要求 架构 AArch64、x86_64 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20 GB 部件名称 最小虚拟化空间要求 架构 AArch64、x86_64 CPU 2 个 CPU 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20 GB 10 11 openEuler 支持新的循环优化,启用此选项,可以有效减少冗余的循环,并且合理的拆分、合并多个循环,提升程序运行的性能。 • 支持结构体优化,通过重新排布结构体成员的位置,使得频繁访问的结构体成员放置于连续的内存空间上,提升 Cache 的命中率,能够大幅度提升程序运行的性能。 应用场景 应用场景 1:高性能计算领域 在高性能计算领域的测试中, 运行 WRF 应用,相比于上游社区的 GCC 9.3 版本能够获得 访问,外部攻击者除非攻破安全区软件,否则无法访问到安全区里的内容。 secGear 是基于硬件机密计算技术为开发者提供的一个应用开发框架,开发者基于 secGear 框架可以简化编写安全应 用的复杂度,提升开发效率。 secGear 支持 x86、Arm 等多种芯片架构,不同的体系架构下硬件机密计算技术的实现和编程接口是不一样的,通过 secGear 开发框架可以让开发者用在编写代码时获得一致的编程体验。0 码力 | 18 页 | 1.30 MB | 1 年前3 openEuler 21.03 技术白皮书0-2.fc3 部件名称 最小硬件要求 架构 AArch64、x86_64 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20 GB 部件名称 最小虚拟化空间要求 架构 AArch64、x86_64 CPU 2 个 CPU 内存 为了获得更好的体验,建议不小于 4GB 硬盘 为了获得更好的体验,建议不小于 20 GB 10 11 openEuler 支持新的循环优化,启用此选项,可以有效减少冗余的循环,并且合理的拆分、合并多个循环,提升程序运行的性能。 • 支持结构体优化,通过重新排布结构体成员的位置,使得频繁访问的结构体成员放置于连续的内存空间上,提升 Cache 的命中率,能够大幅度提升程序运行的性能。 应用场景 应用场景 1:高性能计算领域 在高性能计算领域的测试中, 运行 WRF 应用,相比于上游社区的 GCC 9.3 版本能够获得 访问,外部攻击者除非攻破安全区软件,否则无法访问到安全区里的内容。 secGear 是基于硬件机密计算技术为开发者提供的一个应用开发框架,开发者基于 secGear 框架可以简化编写安全应 用的复杂度,提升开发效率。 secGear 支持 x86、Arm 等多种芯片架构,不同的体系架构下硬件机密计算技术的实现和编程接口是不一样的,通过 secGear 开发框架可以让开发者用在编写代码时获得一致的编程体验。0 码力 | 18 页 | 1.30 MB | 1 年前3
 Linux就该这么学 第2版图 1-22 设置虚拟磁盘类型 将虚拟机系统的“最大磁盘大小”设置为 20.0GB(默认值),这是限定系统能够使用的最 大磁盘容量,并不是立即占满这部分空间。如果想让磁盘拥有更好的性能,这里可以选中“立 即分配所有磁盘空间”复选框。另外,如果同学们后续要经常移动这台虚拟机的话,可以选中 “将虚拟磁盘拆分成多个文件”单选按钮;如果不确定今后是否要经常移动的话,不妨也将虚拟 磁盘进行 能够帮助用户查询软件之间的依赖关系,但问题还是要运维人员自己来 解决,而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件依然很繁琐。 Yum 软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安 装到系统。Yum 软件仓库的技术拓图扑如图 1-49 所示。 图 1-49 据块来复制文件的内容。当然,如果愿意的话,还可以在复制过程中转换其中的数据。Linux 系统中有一个名为/dev/zero 的设备文件,每次在课堂上解释它时都充满哲学理论的色彩。因 为这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据,因此常常使用它作为 dd 命令的输入文件,来生成一个指定大小的文件。dd 命令的参数及其作用如表 2-20 所示。 表 2-20 dd 命令中的参数及其作用0 码力 | 552 页 | 22.25 MB | 1 年前3 Linux就该这么学 第2版图 1-22 设置虚拟磁盘类型 将虚拟机系统的“最大磁盘大小”设置为 20.0GB(默认值),这是限定系统能够使用的最 大磁盘容量,并不是立即占满这部分空间。如果想让磁盘拥有更好的性能,这里可以选中“立 即分配所有磁盘空间”复选框。另外,如果同学们后续要经常移动这台虚拟机的话,可以选中 “将虚拟磁盘拆分成多个文件”单选按钮;如果不确定今后是否要经常移动的话,不妨也将虚拟 磁盘进行 能够帮助用户查询软件之间的依赖关系,但问题还是要运维人员自己来 解决,而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件依然很繁琐。 Yum 软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安 装到系统。Yum 软件仓库的技术拓图扑如图 1-49 所示。 图 1-49 据块来复制文件的内容。当然,如果愿意的话,还可以在复制过程中转换其中的数据。Linux 系统中有一个名为/dev/zero 的设备文件,每次在课堂上解释它时都充满哲学理论的色彩。因 为这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据,因此常常使用它作为 dd 命令的输入文件,来生成一个指定大小的文件。dd 命令的参数及其作用如表 2-20 所示。 表 2-20 dd 命令中的参数及其作用0 码力 | 552 页 | 22.25 MB | 1 年前3
 Debian 新维护者手册生成多个二进制包,arch = any + all (包含 ELF 二进制可执行程序 + 文档) – 既不是 tar.gz 也不是 tar.bz2 格式的上游源代码包 – 包含不可分发的内容物的源码包 • 高复杂度软件包 – 被其他软件包使用的解释器模块包 – 被其他软件包使用的 ELF 库文件包 – 生成多个二进制包,其中包含括 ELF 库文件 – 有多个上游的源码包 – 内核模块包 – 内核补丁包 以上的软件包包名都少于 24 个字符。 Debian 新维护者手册 11 / 57 如果上游代码在它的名称中使用了一些通用术语比如 test-suite,那么你应当将其重命名,显式地说明其内容并避 免污染命名空间。12 你应该让 upstream version(上游版本号)只包含字母和数字 (0-9A-Za-z), 以及加号 (+), 波浪号 (~), 还有点号 (.)。 它必须以数字开头 (0-9)。130 码力 | 63 页 | 493.28 KB | 1 年前3 Debian 新维护者手册生成多个二进制包,arch = any + all (包含 ELF 二进制可执行程序 + 文档) – 既不是 tar.gz 也不是 tar.bz2 格式的上游源代码包 – 包含不可分发的内容物的源码包 • 高复杂度软件包 – 被其他软件包使用的解释器模块包 – 被其他软件包使用的 ELF 库文件包 – 生成多个二进制包,其中包含括 ELF 库文件 – 有多个上游的源码包 – 内核模块包 – 内核补丁包 以上的软件包包名都少于 24 个字符。 Debian 新维护者手册 11 / 57 如果上游代码在它的名称中使用了一些通用术语比如 test-suite,那么你应当将其重命名,显式地说明其内容并避 免污染命名空间。12 你应该让 upstream version(上游版本号)只包含字母和数字 (0-9A-Za-z), 以及加号 (+), 波浪号 (~), 还有点号 (.)。 它必须以数字开头 (0-9)。130 码力 | 63 页 | 493.28 KB | 1 年前3
共 93 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10














