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


10

在该文件access_log指令,Nginx的文件说,

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

如何确定系统上的此大小?


@mdpc从链接文档中可以很明显地看出,这与扇区大小无关,顺便说一句。自80年代末至今,大多数媒体上的字节数一直为512字节。新驱动器正在朝着4K扇区大小发展。
卡巴斯德(Kasperd),2014年

该规范可能是相关的。尽管它似乎并未给出该问题的确切答案:pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd 2015年

Answers:


3

迟到总比不到好 :)

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

详细答案:

据我了解,这是关于写syscall的:

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

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

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

# getconf SSIZE_MAX
32767

2)保证Linux最多可以写入1.99 GiB(这是3.14和更高版本的Linux内核的原子操作)

在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)。在线程(和进程)之间应该是原子性的影响包括文件偏移量的更新。但是,在版本3.14之前的Linux上不是这样:如果两个共享一个打开文件描述的进程(请参阅open(2))同时执行一次write()(或writev(2)),则I / O操作不是更新文件偏移量的原子操作,其结果是两个进程输出的数据块可能(不正确)重叠。此问题已在Linux 3.14中修复。


1

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

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


1
好的,那么我如何确定磁盘扇区有多大?
bdesham

9
Nginx文档和超级用户答案不是在谈论存储堆栈中的同一层。Nginx文档讨论了文件系统层上最大的原子写入,这取决于OS和FS。超级用户的答案是在块级别上讨论最大的原子写操作,这取决于硬件。
卡巴斯德(Kasperd)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.