bdesham Asked: 2014-05-30 08:57:21 +0800 CST2014-05-30 08:57:21 +0800 CST 2014-05-30 08:57:21 +0800 CST 在我的系统上对磁盘进行原子写入的大小是多少? 772 在指令的文档中access_log,nginx 文档说 缓冲区大小不得超过对磁盘文件的原子写入大小。 如何确定我的系统上的这个大小? linux 2 个回答 Voted Best Answer Oleg Korchagin 2019-01-07T05:36:30+08:002019-01-07T05:36:30+08:00 迟到总比不到好 :) 快速回答是:“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 的上限,请参见注释。 # 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 Section XSI 2.9.7(“线程与常规文件操作的交互”): 以下所有函数在对常规文件或符号链接进行操作时,在 POSIX.1-2008 中指定的效果中相互之间应是原子的: ... 随后列出的 API 包括 write() 和 writev(2)。跨线程(和进程)应该是原子的影响之一是文件偏移量的更新。但是,在 3.14 之前的 Linux 上,情况并非如此:如果共享打开文件描述(参见 open(2))的两个进程同时执行 write()(或 writev(2)),则 I /O 操作在更新文件偏移方面不是原子的,因此两个进程输出的数据块可能(不正确地)重叠。此问题已在 Linux 3.14 中修复。 mlw4428 2014-05-30T09:12:44+08:002014-05-30T09:12:44+08:00 这个超级用户的回答很好地定义了原子写入大小。 这至少与硬件扇区的大小一样大,即原子读/写大小。
迟到总比不到好 :)
快速回答是:“2,147,479,552 字节,如果内核版本是 3.14 或更高版本”
详细回答:
据我了解,这是关于编写系统调用:
http://man7.org/linux/man-pages/man2/write.2.html
1) 任何 POSIX 系统(linux、bsd、所有 unix)都保证能够写入最多 MAX_SSIZE 个字节
2) linux 保证能够写入高达 1.99 GiB (它是 linux 内核版本 3.14 和更新版本的原子操作)
但它只是来自 linux 内核 3.14 的公平原子操作
这个超级用户的回答很好地定义了原子写入大小。