W dokumentacji tej access_logdyrektywy , dokumentacja nginx mówi
Rozmiar bufora nie może przekraczać rozmiaru zapisu atomowego do pliku dyskowego.
Jak mogę ustalić, jaki rozmiar jest w moim systemie?
W dokumentacji tej access_logdyrektywy , dokumentacja nginx mówi
Rozmiar bufora nie może przekraczać rozmiaru zapisu atomowego do pliku dyskowego.
Jak mogę ustalić, jaki rozmiar jest w moim systemie?
Odpowiedzi:
lepiej późno niż wcale :)
szybka odpowiedź brzmi: „2147479552 bajtów, jeśli wersja jądra to 3.14 lub nowsza”
szczegółowa odpowiedź:
O ile rozumiem, chodzi o napisanie syscall:
http://man7.org/linux/man-pages/man2/write.2.html
1) gwarantujemy, że wszystkie systemy POSIX (linux, bsd, wszystkie uniksowe) będą mogły zapisać do MAX_SSIZE bajtów
Zgodnie z POSIX.1, jeśli liczba jest większa niż SSIZE_MAX, wynik jest zdefiniowany w implementacji; patrz UWAGI na górny limit w systemie Linux.
# getconf SSIZE_MAX
32767
2) Linux gwarantuje, że będzie mógł napisać do 1,99 GiB (i jest to działanie atomowe dla jądra Linuksa w wersji 3.14 i nowszych)
W systemie Linux write () (i podobne wywołania systemowe) przesyła maksymalnie 0x7ffff000 (2 147 479 552) bajtów, zwracając liczbę faktycznie przesłanych bajtów. (Dotyczy to zarówno systemów 32-bitowych, jak i 64-bitowych.)
Ale to uczciwa operacja atomowa tylko z jądra Linuksa 3.14
Zgodnie z POSIX.1-2008 / SUSv4 sekcja XSI 2.9.7 („Interakcje wątku z normalnymi operacjami na plikach”):
Wszystkie następujące funkcje są atomowe względem siebie w efektach określonych w POSIX.1-2008, gdy działają na zwykłych plikach lub dowiązaniach symbolicznych: ...
Wśród wymienionych poniżej API znajdują się write () i writev (2). A wśród efektów, które powinny być atomowe w wątkach (i procesach), są aktualizacje przesunięcia pliku. Jednak w systemie Linux przed wersją 3.14 tak nie było: jeśli dwa procesy, które współużytkują opis otwartego pliku (patrz open (2)) wykonują jednocześnie write () (lub writev (2)), wówczas I Operacje / O nie były atomowe w odniesieniu do aktualizacji przesunięcia pliku, w wyniku czego bloki danych wyjściowych z dwóch procesów mogą (niepoprawnie) nakładać się. Ten problem został rozwiązany w Linuksie 3.14.
Ta odpowiedź Superuser miała dobrą definicję wielkości zapisu atomowego.
Jest to co najmniej tak duży, jak rozmiar sektora sprzętowego, który jest atomowym rozmiarem do odczytu / zapisu.