설명서에서 지침 의의 nginx 설명서를 말한다access_log
버퍼 크기는 디스크 파일에 대한 원자 쓰기 크기를 초과해서는 안됩니다.
시스템에서이 크기가 무엇인지 어떻게 알 수 있습니까?
설명서에서 지침 의의 nginx 설명서를 말한다access_log
버퍼 크기는 디스크 파일에 대한 원자 쓰기 크기를 초과해서는 안됩니다.
시스템에서이 크기가 무엇인지 어떻게 알 수 있습니까?
답변:
안하는 것보다 늦게하는 것이 낫다 :)
빠른 대답은 "커널 버전이 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에서 수정되었습니다.
이 수퍼 유저 답변은 원자 쓰기 크기가 무엇인지 잘 정의했습니다.
이것은 최소한 읽기 / 쓰기 크기 인 하드웨어 섹터의 크기만큼 큽니다.