这个主题已经在这里讨论过了:了解块大小 但是对于我的用例,我还有一些内容需要添加。
通常,大多数database systems
使用默认值block size
,8 KB
但有些允许修改。另一方面,现代operating systems
通常使用4 KB
块大小file systems
。这种差异可能导致多个physical I/O
请求填充单个database page
。
较小的文件系统块大小有random reads
以下好处index lookups
: ,而较大的块大小有利于sequential scans
和heap fetches
。考虑到这些观点,我有几个问题:
- 对于 OLTP,是否有一种常见的做法是将数据库块大小与文件系统块大小保持一致?
- 在具有一个主节点和一个或多个辅助节点的
clustered system
(例如SQL Server Availability Groups
或PostgreSQL streaming replication
)中,是否可以拥有不同的文件系统块大小,或者这是应该始终避免的事情? - 对于
analytical databases
或columnar tables
,使用更大的块大小是否有益?
不是的。最佳文件系统块大小将取决于太多其他因素,例如条带大小(或基于技术的类似大小)、位置(您可能实际上不知道远程存储在幕后使用什么)、驱动程序、文件系统,然后是环境的实际工作负载,这是最重要的部分。
例如,如果数据库系统的 8k 分配单元采用 8k 块大小,而大多数/所有实际 IO 都以 256 KB 为单位进行,那么这样做毫无帮助。块大小与 IOP 的关系图通常成反比,这意味着随着块大小的增加,IOP 数量会减少,而整体吞吐量会提高。
理想情况下,所有内容都应是彼此的相同副本。您可以运行它而不完全相同,但根据您的操作系统/DBMS,这可能会导致无法预见的性能问题。例如,如果系统在块级别进行物理复制,但一个系统上的块是 512 字节,而另一个系统上的块是 16kb(请注意,这是在硬件级别)。使用不同的文件系统块大小通常可以工作,但有相同的注意事项。
这取决于使用这些功能创建的整体 IO 配置文件。不同的功能以不同的方式工作。您最好获取 DBMS 的 IO 配置文件的 ETW 跟踪,以了解它为该功能/工作负载偏好的 IO 大小和类型(同步/异步)。