Solaris 上的预读设置

Solaris 上的预读设置

如何获取 Solaris 上当前的预读设置?

在 Linux 上可以这样检索:

# echo $(($(blockdev --getra /dev/sda)*512/1024))

(假设 blockdev 总是以 512 字节为单位返回读头值。)

(通常 Linux 上的预读为 128K。)

答案1

Solaris 可能会或多或少地进行预读。与 Linux 不同,Solaris 的内核是完全动态的,并根据约束和可用内核内存决定要做什么。

还有一个由文件系统控制的预读,如果您使用 ZFS,则可能会有与历史缓存不同的缓存。

为了获得更好的答案,重要的是您是否真的喜欢读取看起来不合理的缓冲设备,并且了解为什么您想了解有关实现细节的信息也很重要。

通常,在 Solaris 上,对缓冲后台存储的 read() 调用会转换为来自瞬态内核映射映射区域的副本。在 32 位内核 IIRC 上,该瞬时映射区域为 2 MB,在 64 位内核上则更大。预读操作是通过相关段驱动程序(虚拟前台内存和后台存储之间的驱动程序)设置的手动触发的故障调用来实现的。 AFAIK,唯一可用的描述是在我的 WOFS 文凭论文中。由于这个原因,Sun 员工使用了它。

为了更好地理解事情,了解一下历史背景可能会有所帮助:

28 年前,SunOS-4.0 发布,带有新的虚拟内存子系统。所有现代操作系统都至少复制了 SunOS-4.0 中的 mmap() 思想。然而,SunOS-4.0 的功能更多,因为它实现了面向对象的 VM 子系统。

有虚拟前台内存、段驱动程序、HAL 层(MMU)和后台存储。

根据前台内存对象类型和后台对象类型,有一个特殊的段驱动程序。

如果您有一个文件系统作为前台对象,磁盘存储作为后台内存,则段驱动程序称为seg_vn。如果您有到设备的映射,sev_dev则使用。

要了解预读是特定于对象的,您可能需要检查ufs_vnops.c并查找ufs_getpage_ra()

相关内容