Re: Απορία sync
Giorgos Keramidas
keramida at ceid.upatras.gr
Sun Mar 13 13:37:34 EET 2011
2011/3/12 Antonis Christofides <anthony at itia.ntua.gr>:
> On 2011-03-12 09:30, d.a.glynos wrote:
>> Αντώνη έχεις κάποιο παράδειγμα abusive συμπεριφοράς σχετικής
>> με sync to disk ?
>
> Δεν έχω, η απορία μου είναι καθαρά εγκυκλοπαιδική. Μου γεννήθηκε γιατί
> τελευταία χρησιμοποιώ συχνά τη sync στο laptop μου, πριν από κάθε
> shutdown, γιατί κάτι έχει πάθει και δεν καταφέρνει πάντα να shutdown
> σωστά και μετά ο thunderbird ξεχνάει τα χιλιάδες κασαρισμένα headers
> των email μου.
>
> Απλώς διαισθητικά μου φαίνεται παράξενο, σε ένα σύστημα που έχει
> filesystems με τεράστια caches, delayed allocation, και δε
> συμμαζεύεται, να μπορεί ο χρήστης να αποφασίσει το πότε θα γίνει sync.
> Αυτή η αρμοδιότητα μου φαίνεται ότι θα έπρεπε να είναι του διαχειριστή
> και μόνο.
Υπάρχουν πολλοί τρόποι να βλάψεις ένα UNIX μέσω «κατάχρησης» της
εμπιστοσύνης που υπάρχει για τον default user:
- fork bomb από ένα process που τυπώνει "hello, σε χάκεψα"
- να γεμίσεις το δίσκο, π.χ. κατεβάζοντας 8388608 CD με τσόντες
- να γεμίσεις το /tmp ακόμα κι αν είναι memory-backed filesystem
Αυτό με το sync δεν είναι «ιδιαίτερα» κακό και τα μοντέρνα UNIX kernels
ξέρουν ήδη ότι μπορούν να το αγνοήσουν. Επίσης, έχει υπόψη ότι το
'fsync' operation σε πολλά συστήματα είναι filesystem-specific, και
μπορεί να έχει διαφορετική συμπεριφορά για msdosfs, vfat, ufs, ext3,
reiserfs, xfs, κλπ.
Ακόμα πιο σημαντικό είναι ότι τα filesystems που έχουν δικά τους
constraints να τηρήσουν, όπως metadata ordering, journaling,
κοκ. συνήθως έχουν διάφορα κόλπα για να γλιτώσουν χρόνο όταν κάνουν
fsync(), να κάνουν την ελάχιστη δυνατή δουλειά, όσο πιο γρήγορα γίνεται
και όσο πιο καλά γίνεται, χωρίς να φορτώσουν το σύστημα υπερβολικά ή να
μπλοκάρουν το σύμπαν.
Για παράδειγμα, η υλοποίηση του FreeBSD fsync() για UFS filesystems
φαίνεται εδώ:
http://fxr.watson.org/fxr/source/ufs/ffs/ffs_vfsops.c?im=3#L1296
Αν προσέξεις ο κώδικας της fsync() προσπαθεί να αποφύγει ακόμα και ένα
function call per vnode που θα συγχρονίσει με το δίσκο. Το θεωρεί
"υπερβολικά αργό" και το αποφεύγει.
Κάτι που είναι επίσης σημαντικό είναι ότι το sync σήμερα πλέον ΔΕΝ είναι
blocking. Απλώς προγραμματίζει I/O operations για τα dirty buffers.
Κυρίως για να αποφεύγονται τα φαινόμενα "sync ; sync ; sync" από κόσμο
που διάβασε πως κάποτε έτσι έκανε πριν από κάθε reboot ο Ken Thompson
και το γράφει πλέον σαν τυφλοσούρτη :-P
More information about the Linux-greek-users
mailing list