Na documentação da access_log
diretiva , a documentação nginx diz
O tamanho do buffer não deve exceder o tamanho de uma gravação atômica em um arquivo de disco.
Como posso determinar qual é esse tamanho no meu sistema?
Na documentação da access_log
diretiva , a documentação nginx diz
O tamanho do buffer não deve exceder o tamanho de uma gravação atômica em um arquivo de disco.
Como posso determinar qual é esse tamanho no meu sistema?
Respostas:
Antes tarde do que nunca :)
A resposta rápida é: "2.147.479.552 bytes, se a versão do kernel for 3.14 ou mais recente"
resposta detalhada:
Tanto quanto eu entendo, trata-se de escrever syscall:
http://man7.org/linux/man-pages/man2/write.2.html
1) todos os sistemas POSIX (linux, bsd, todos unix) têm a garantia de poder gravar MAX_SSIZE bytes
De acordo com o POSIX.1, se a contagem for maior que SSIZE_MAX, o resultado será definido pela implementação; veja NOTAS para o limite superior no Linux.
# getconf SSIZE_MAX
32767
2) linux garantido para poder gravar até 1,99 GiB (e é operação atômica para o kernel do linux versão 3.14 e mais recente)
No Linux, write () (e chamadas de sistema similares) transferem no máximo 0x7ffff000 (2.147.479.552) bytes, retornando o número de bytes realmente transferidos. (Isso é verdade nos sistemas de 32 e 64 bits.)
Mas é uma operação atômica justa apenas do kernel 3.14 do linux
De acordo com a Seção XSI 2.9.7 do POSIX.1-2008 / SUSv4 ("Interações de encadeamento com operações regulares de arquivos"):
Todas as funções a seguir devem ser atômicas entre si nos efeitos especificados no POSIX.1-2008 quando operarem em arquivos regulares ou links simbólicos: ...
Entre as APIs listadas posteriormente estão write () e writev (2). E entre os efeitos que devem ser atômicos entre threads (e processos) estão as atualizações do deslocamento do arquivo. No entanto, no Linux anterior à versão 3.14, esse não era o caso: se dois processos que compartilham uma descrição de arquivo aberto (consulte open (2)) executam uma gravação () (ou writev (2)) ao mesmo tempo, I As operações de / O não eram atômicas com relação à atualização do deslocamento do arquivo, com o resultado de que os blocos de dados gerados pelos dois processos podem (incorretamente) se sobrepor. Este problema foi corrigido no Linux 3.14.
Essa resposta do superusuário tinha uma boa definição do tamanho da gravação atômica.
Isso é pelo menos tão grande quanto o tamanho do setor de hardware, que é o tamanho atômico de leitura / gravação.