Кіріспе
Unix командасы ядролық файл жүйесіндегі барлық деректерді ұшпаушы емес сақтау буферлеріне жіберу синхрондау - Unix операциялық жүйесіндегі стандартты жүйелік шақыру, ол ядролық файл жүйесінің буферлеріндегі барлық деректерді ұшпаушы емес сақтауға жібереді, яғни төменгі деңгейдегі I / O жүйелік шақырулар арқылы жазуға жоспарланған деректер. Stdio сияқты жоғары деңгейлі I/O қабаттары өздерінің бөлек буферлерін сақтай алады. C-дегі функция ретінде синхрондау шақыруы әдетте <unistd-де void sync ((void) деп жарияланады. h> . Жүйелік шақыру сонымен қатар синхрондау деп аталатын командалық жолдың пайдалы қызметі арқылы қол жетімді және Perl және Node сияқты басқа тілдерде ұқсас функциялар бар. js (fs модульінде). fsync жүйелік шақыру тек файл дескрипторына қатысты буферлі деректерді ғана жазады. fdatasync файлдағы деректерге енгізілген өзгерістерді жазу үшін де қол жетімді, бірақ файлдың байланысты метадеректері міндетті емес. Кейбір Unix жүйелері синхрондау функциясын үнемі шақыратын флеш немесе жаңарту демонын орындайды. Кейбір жүйелерде cron демоны осыны жасайды, ал Linux-та оны pdflush демоны басқарады, ол жаңа іске асырумен ауыстырылды және ақыры 2012 жылы Linux ядросынан алынып тасталды. Буферлер файл жүйелері тек оқу үшін ғана монтаждалған немесе қайта монтаждалған кезде, мысалы, жүйе тоқтайтын алдында да тазаланады. Кейбір қолданбалар, мысалы LibreOffice, қалпына келтіру ақпаратын интервалға сақтау үшін синхрондау функциясын шақырады.
sync is a standard system call in the Unix operating system, which commits all data from the kernel filesystem buffers to non volatile storage, i. e., data which has been scheduled for writing via low level I/O system calls. Higher level I/O layers such as stdio may maintain separate buffers of their own. As a function in C, the sync call is typically declared as void sync(void) in <unistd. h>. The system call is also available via a command line utility also called sync, and similarly named functions in other languages such as Perl and Node. js (in the fs module). The related system call fsync commits just the buffered data relating to a specified file descriptor. fdatasync is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata. Some Unix systems run a kind of flush or update daemon, which calls the sync function on a regular basis. On some systems, the cron daemon does this, and on Linux it was handled by the pdflush daemon which was replaced by a new implementation and finally removed from the Linux kernel in 2012. Buffers are also flushed when filesystems are unmounted or remounted read only, for example prior to system shutdown. Some applications, such as LibreOffice, are also call sync function to save recovery information in an interval.
Деректер базасын пайдалану
Қажетті беріктік үшін деректер қорлары, егер қуат тапшылығы болса, жоғалатын жад-кешіне негізделген жазу кэшінде сақталудың орнына, жазылатын ақпараттың ұшпаған сақтау орнына жеткеніне көз жеткізу үшін синхрондаудың қандай да бір түрін пайдалану керек. PostgreSQL мысалы, әр түрлі синхрондау шақыруларын қолдана алады, оның ішінде fsync және fdatasync , коммит тұрақты болу үшін. Өкінішке орай, бір клиенттің бір ретті жазуы үшін айналмалы қатты диск айналымда бір рет қана жүктей алады, бұл ең жақсы жағдайда секундына бірнеше жүздеген осындай жүктеуді құрайды. fsync талапты өшіру, сондықтан, коммит өнімділігін айтарлықтай жақсарта алады, бірақ апаттан кейін деректер қорының бүлінуіне әкелуі мүмкін. Деректер қорларында соңғы өзгерістер туралы ақпарат бар транзакция журналы файлдары (әдетте негізгі дерек файлдарынан әлдеқайда кіші) қолданылады, сондықтан өзгерістер апат кезінде сенімді түрде қайта жасалуы мүмкін; содан кейін негізгі дерек файлдары сирек синхрондалуы мүмкін.
Қате туралы хабарлау және тексеру
Деректер жоғалуының алдын алу үшін fsync-тің қайтарылған мәндерін тексеру керек, өйткені кітапхана немесе ядро буфердеген I/O операцияларды орындау кезінде қателер жазу жүйелік шақыруды немесе fflush шақыруын пайдалану кезінде хабарланбауы мүмкін, өйткені деректер ұшпаған сақтау жүйесіне жазылмауы мүмкін, бірақ тек жады бетінің кэшке жазылуы мүмкін. Жазудан шыққан қателер fsync, msync немесе close жүйелік шақырулары кезінде жиі хабарланады. 2018 жылға дейін Linux-тың fsync мінез-құлқы белгілі бір жағдайларда қате туралы хабарлауға сәтсіз болды, мінез-құлқы өзгертілді.
Орындау туралы даулар
Қатты дискілер жазуларды буферлеу үшін өздерінің ұшпа жазу кэшін пайдалану үшін әдеттегідей болуы мүмкін, бұл өнімділікті айтарлықтай жақсартады, сонымен бірге жоғалған жазулар үшін әлеуетті енгізеді. hdparm F сияқты құралдар HDD контроллеріне дискке жазу кэш буферін тазалауды тапсырады. Кэштиргішті өшірудің өнімділікке әсері соншалықты үлкен, тіпті әдеттегі консервативті FreeBSD қауымдастығы FreeBSD 4.3 бағдарламасында әдетті түрде жазу кэштиргішіне рұқсат бермеуді қабылдамады. SCSI және SATA-да Native Command Queuing (бірақ жай ATA-да емес, тіпті TCQ-да) хост деректердің дисктің табақтарына немесе дисктің буферіне (бордағы кэшке) жеткенде аяқталғаны туралы хабардар етілуін қалайтынын көрсете алады. Дұрыс аппараттық іске асыруды болжамдай отырып, бұл мүмкіндік fsync сияқты жүйелік шақырулар үшін дұрыс семантиканы кепілдендіре отырып, дискідегі кэшке пайдалануға мүмкіндік береді. Бұл аппараттық мүмкіндік Force Unit Access (FUA) деп аталады және ол ATA (немесе SATA non NCQ) дискілерінде істелгендей, бүкіл кэшті тазартудан гөрі аз үстемдікке мүмкіндік береді. Linux NCQ-ны 2007 жылы іске қосқанмен, ол SATA / NCQ FUA-ны 2012 жылға дейін іске қосқан жоқ, себебі алғашқы дисктерде қолдаудың жоқтығын келтірді. 2008 жылы шыққан Firefox 3.0 fsync жүйелік шақыруларын енгізді, бұл оның жұмысын төмендетеді; шақыру кіріктірілген SQLite деректер қорының тұтастығына кепілдік беру үшін енгізілді. Linux Foundation-тің бас техникалық қызметкері Теодор Цо "fsync-тен қорықпаудың қажеті жоқ" деп мәлімдейді және Firefox 3 баяулауының нақты себебі fsync-ті шамадан тыс пайдалану болып табылады. Ол сонымен қатар (Майк Шеверді келтіре отырып) кейбір жалпы Linux конфигурацияларында, әсіресе ext3 файл жүйесін "data=ordered" режимінде пайдаланғанда, fsync-ті шақыру тек файл үшін деректерді ғана емес, сонымен қатар осы файл жүйесінің барлық буферленген деректерін тазартады.
On some rather common Linux configurations, especially using the ext3 filesystem in the "data=ordered" mode, calling fsync doesn't just flush out the data for the file it's called on, but rather on all the buffered data for that filesystem.