我的系统上磁盘的原子写入大小是多少?

我的系统上磁盘的原子写入大小是多少?

在文档中指令access_log,nginx 文档说

缓冲区大小不得超过对磁盘文件的原子写入的大小。

我如何确定我的系统上这个尺寸是多少?

答案1

迟到总比不到好 :)

快速回答是:“2,147,479,552 字节,如果内核版本是 3.14 或更新版本”

详细答案:

据我了解,它是关于写入系统调用的:

http://man7.org/linux/man-pages/man2/write.2.html

1)任何 POSIX 系统(linux、bsd、所有 unix)都保证能够写入最多 MAX_SSIZE 字节

根据 POSIX.1,如果 count 大于 SSIZE_MAX,则结果由实现定义;有关 Linux 上的上限,请参阅 NOTES。

# getconf SSIZE_MAX
32767

2)Linux 保证能够写入最多 1.99 GiB(对于 Linux 内核版本 3.14 及更新版本,这是原子操作)

在 Linux 上,write()(和类似的系统调用)最多传输 0x7ffff000(2,147,479,552)个字节,并返回实际传输的字节数。(这在 32 位和 64 位系统上都是如此。)

但从 Linux 内核 3.14 开始,它才是公平的原子操作

根据 POSIX.1-2008/SUSv4 第 XSI 2.9.7 节(“线程与常规文件操作的交互”):

当以下所有函数对常规文件或符号链接进行操作时,它们在 POSIX.1-2008 中指定的效果中应彼此具有原子性:...

随后列出的 API 包括 write() 和 writev(2)。在线程(和进程)之间应具有原子性的效果包括文件偏移量的更新。然而,在 Linux 3.14 之前的版本中,情况并非如此:如果两个共享打开文件描述的进程(参见 open(2))同时执行 write()(或 writev(2)),则 I/O 操作在更新文件偏移量方面不是原子性的,结果两个进程输出的数据块可能会(错误地)重叠。此问题已在 Linux 3.14 中得到修复。

答案2

超级用户的答案对原子写入大小有一个很好的定义。

这至少与硬件扇区的大小(即原子读/写大小)一样大。

相关内容