Кіріспе

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, қалпына келтіру ақпаратын интервалға сақтау үшін синхрондау функциясын шақырады.

Деректер базасын пайдалану

Қажетті беріктік үшін деректер қорлары, егер қуат тапшылығы болса, жоғалатын жад-кешіне негізделген жазу кэшінде сақталудың орнына, жазылатын ақпараттың ұшпаған сақтау орнына жеткеніне көз жеткізу үшін синхрондаудың қандай да бір түрін пайдалану керек. 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-ті шақыру тек файл үшін деректерді ғана емес, сонымен қатар осы файл жүйесінің барлық буферленген деректерін тазартады.