From: Simone Piccardi Date: Sat, 2 Jan 2010 15:43:58 +0000 (+0000) Subject: Finita fallocate X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=cf6a76554e5241851e4b87f0e70f2ac530591990;p=gapil.git Finita fallocate --- diff --git a/fileadv.tex b/fileadv.tex index 5a6a3c2..98111fe 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -3927,7 +3927,7 @@ dell'ulteriore argomento il comportamento delle funzioni precedenti \func{readv} e \func{writev}. Con l'uso di queste funzioni si possono evitare eventuali -\itindex{race~condition} \textit{race conditions} quando si deve eseguire la +\itindex{race~condition} \textit{race condition} quando si deve eseguire la una operazione di lettura e scrittura vettorizzata a partire da una certa posizione su un file, mentre al contempo si possono avere in concorrenza processi che utilizzano lo stesso file descriptor (si ricordi quanto visto in @@ -4687,40 +4687,52 @@ almeno 600, } \end{functions} -La funzione si assicura che venga allocato sufficiente spazio disco perché sia +La funzione assicura che venga allocato sufficiente spazio disco perché sia possibile scrivere sul file indicato dall'argomento \param{fd} nella regione che inizia dalla posizione \param{offset} e si estende per \param{len} byte; -se questa si estende oltre la fine del file le dimensioni di quest'ultimo -saranno incrementate di conseguenza. Dopo aver eseguito con successo la -funzione è garantito che una scrittura nella regione indicata non fallirà per -mancanza di spazio disco. - -Ci si può chiedere a cosa serva una funzione come \func{posix\_fallocate} dato -che è sempre possibile ottenere l'effetto voluto eseguendo manualmente sul -file la scrittura\footnote{usando \funcd{pwrite} per evitare spostamenti della - posizione corrente sul file.} di una serie di zeri per l'estensione di -spazio necessaria. In realtà questa è la modalità con cui la funzione veniva -realizzata nella prima versione fornita dalle \acr{glibc}, e si trattava nel -caso soltanto di una standardizzazione delle modalità di - -% TODO controllare la trattazione della nuova funzionalità di preallocazione - -% TODO documentare \func{posix\_fadvise} -% vedi http://insights.oetiker.ch/linux/fadvise.html -% questo tread? http://www.ussg.iu.edu/hypermail/linux/kernel/0703.1/0032.html - -% TODO documentare \func{fallocate}, introdotta con il 2.6.23 -% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/ -% http://kernelnewbies.org/Linux_2_6_23 -% \func{fallocate} con il 2.6.25 supporta pure XFS - -Infine a partire dal kernel 2.6.23 è stata introdotta la nuova system call -\funcd{fallocate}, che consente di realizzare direttamente all'interno del -kernel le funzionalità di \func{posix\_fallocate}. Trattandosi di una funzione -di servizio questa non è stata definita come funzione di libreria e pertanto -può essere invocata indirettamente con l'ausilio di \func{syscall} (vedi -sez.~\ref{sec:intro_syscall}; il suo prototipo è: - +se questa regione si estende oltre la fine del file le dimensioni di +quest'ultimo saranno incrementate di conseguenza. Dopo aver eseguito con +successo la funzione è garantito che una successiva scrittura nella regione +indicata non fallirà per mancanza di spazio disco. La funzione non ha nessun +effetto né sul contenuto, né sulla posizione corrente del file. + +Ci si può chiedere a cosa possa servire una funzione come +\func{posix\_fallocate} dato che è sempre possibile ottenere l'effetto voluto +eseguendo esplicitamente sul file la scrittura\footnote{usando \funcd{pwrite} + per evitare spostamenti della posizione corrente sul file.} di una serie di +zeri per l'estensione di spazio necessaria qualora il \itindex{sparse~file} +file debba essere esteso o abbia dei \index{file!\textit{hole}} +buchi.\footnote{si ricordi che occorre scrivere per avere l'allocazione e che + l'uso di \func{truncate} per estendere un file creerebbe soltanto uno + \itindex{sparse~file} \textit{sparse file} (vedi sez.~\ref{sec:file_lseek}) + senza una effettiva allocazione dello spazio disco.} In realtà questa è la +modalità con cui la funzione veniva realizzata nella prima versione fornita +dalle \acr{glibc}, per cui la funzione costituiva in sostanza soltanto una +standardizzazione delle modalità di esecuzione di questo tipo di allocazioni. + +Questo metodo, anche se funzionante, comporta però l'effettiva esecuzione una +scrittura su tutto lo spazio disco necessario, da fare al momento della +richiesta di allocazione, pagandone il conseguente prezzo in termini di +prestazioni; il tutto quando in realtà servirebbe solo poter riservare lo +spazio per poi andarci a scrivere, una sola volta, quando il contenuto finale +diventa effettivamente disponibile. + +Per poter fare tutto questo è però necessario il supporto da parte del kernel, +e questo è divenuto disponibile solo a partire dal kernel 2.6.23 in cui è +stata introdotta la nuova \textit{system call} \func{fallocate},\footnote{non + è detto che la funzione sia disponibile per tutti i filesystem, ad esempio + per XFS il supporto è stato introdotto solo a partire dal kernel 2.6.25.} +che consente di realizzare direttamente all'interno del kernel l'allocazione +dello spazio disco così da poter realizzare una versione di +\func{posix\_fallocate} con prestazioni molto più elevate.\footnote{nelle + \acr{glibc} la nuova \textit{system call} viene sfruttata per la + realizzazione di \func{posix\_fallocate} a partire dalla versione 2.10.} + +Trattandosi di una funzione di servizio, ed ovviamente disponibile +esclusivamente su Linux, \funcd{fallocate} non è stata definita come funzione +di libreria e pertanto può essere invocata da un programma soltanto in maniera +indiretta con l'ausilio di \func{syscall} (vedi sez.~\ref{sec:intro_syscall}); +il suo prototipo è: \begin{functions} \headdecl{linux/falloc.h} \funcdecl{long fallocate(int fd, int mode, loff\_t offset, loff\_t len)} @@ -4748,6 +4760,29 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo } \end{functions} +La funzione prende gli stessi argomenti di \func{posix\_fallocate} con lo +stesso significato, a cui si aggiunge l'argomento \param{mode} che indica le +modalità di allocazione; al momento quest'ultimo può soltanto essere nullo o +assumere il valore \const{FALLOC\_FL\_KEEP\_SIZE} che richiede che la +dimensione del file\footnote{quella ottenuta nel campo \var{st\_size} di una + struttura \struct{stat} dopo una chiamata a \texttt{fstat}.} non venga +modificata anche quando la somma di \param{offset} e \param{len} eccede la +dimensione corrente. + +Se \param{mode} è nullo invece la dimensione totale del file in caso di +estensione dello stesso viene aggiornata, come richiesto per +\func{posix\_fallocate}, ed invocata in questo modo si può considerare +\func{fallocate} come l'implementazione ottimale di \func{posix\_fallocate} a +livello di kernel. + + +% TODO documentare \func{fallocate}, introdotta con il 2.6.23 +% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/ +% http://kernelnewbies.org/Linux_2_6_23 +% \func{fallocate} con il 2.6.25 supporta pure XFS + + + %\subsection{L'utilizzo delle porte di I/O} @@ -4787,7 +4822,7 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo % LocalWords: only ETXTBSY DENYWRITE ENODEV filesystem EPERM EXEC noexec table % LocalWords: ENFILE lenght segment violation SIGSEGV FIXED msync munmap copy % LocalWords: DoS Denial Service EXECUTABLE NORESERVE LOCKED swapping stack fs -% LocalWords: GROWSDOWN ANON GiB POPULATE prefaulting SIGBUS fifo VME fork old +% LocalWords: GROWSDOWN ANON POPULATE prefaulting SIGBUS fifo VME fork old % LocalWords: exec atime ctime mtime mprotect addr EACCESS mremap address new % LocalWords: long MAYMOVE realloc VMA virtual Ingo Molnar remap pages pgoff % LocalWords: dall' fault cache linker prelink advisory discrectionary lock fl @@ -4809,8 +4844,8 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo % LocalWords: nwrite segs patch readahead posix fadvise TC advice FADV NORMAL % LocalWords: SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG % LocalWords: POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE tmpfs -% LocalWords: DONTFORK DOFORK shmfs preadv pwritev syscall linux loff head -% LocalWords: MERGEABLE EOVERFLOW conditions prealloca +% LocalWords: DONTFORK DOFORK shmfs preadv pwritev syscall linux loff head XFS +% LocalWords: MERGEABLE EOVERFLOW prealloca hole FALLOC KEEP stat fstat %%% Local Variables: