내 시스템에서 디스크에 대한 원자 쓰기 크기는 얼마입니까?


10

설명서에서 지침 의의 nginx 설명서를 말한다access_log

버퍼 크기는 디스크 파일에 대한 원자 쓰기 크기를 초과해서는 안됩니다.

시스템에서이 크기가 무엇인지 어떻게 알 수 있습니까?


@mdpc 링크 된 문서에서 섹터 크기에 관한 것이 아니라는 것이 분명합니다. 80 년대 후반부터 지금까지 대부분의 미디어에서 512 바이트였습니다. 새로운 드라이브에서 4K 섹터 크기로 이동하고 있습니다.
kasperd

이 사양은 관련이있을 수 있습니다. pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd

답변:


3

안하는 것보다 늦게하는 것이 낫다 :)

빠른 대답은 "커널 버전이 3.14 이상인 경우 2,147,479,552 바이트"입니다.

자세한 답변 :

내가 이해하는 한 syscall 쓰기에 관한 것입니다.

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

1) 모든 POSIX 시스템 (linux, bsd, all unix)은 최대 MAX_SSIZE 바이트 를 쓸 수 있습니다.

POSIX.1에 따르면 count가 SSIZE_MAX보다 크면 결과는 구현 정의됩니다. Linux 상한에 대한 참고 사항을 참조하십시오.

# getconf SSIZE_MAX
32767

2) 리눅스는 최대 1.99GiB의 쓰기를 보장합니다. (리눅스 커널 버전 3.14 이상에서는 원자 작동입니다)

Linux에서 write () 및 이와 유사한 시스템 호출은 최대 0x7ffff000 (2,147,479,552) 바이트를 전송하여 실제로 전송 된 바이트 수를 반환합니다. 이것은 32 비트 및 64 비트 시스템 모두에 해당됩니다.

그러나 그것은 리눅스 커널 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.