Устойчиво ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ API Π·Π° Linux Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

Аз, изслСдвайки стабилността Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ систСми, Ρ€Π΅ΡˆΠΈΡ… Π΄Π° сС тСствам, Π·Π° Π΄Π° сС увСря, Ρ‡Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌ основнитС Π½Π΅Ρ‰Π°. Π°Π· Π·Π°ΠΏΠΎΡ‡Π½Π° с Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° спСцификацията Π½Π° NVMe Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΈ Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° устойчивостта Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ (Ρ‚.Π΅. Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π½Π°Π»ΠΈΡ‡Π½ΠΈ слСд ΠΏΠΎΠ²Ρ€Π΅Π΄Π° Π½Π° систСмата), Π½ΠΈ Π΄Π°Π²Π°Ρ‚ NMVe дисковС. Направих слСднитС основни Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: трябва Π΄Π° считатС Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° ΠΏΠΎΠ²Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π΄Π°Π΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ са записани Π½Π° носитСля Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅. Π’ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΎΠ±Π°Ρ‡Π΅ систСмнитС повиквания сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ доста бСзопасно Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ.

Π’ Ρ‚Π°Π·ΠΈ статия изслСдвам ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈΡ‚Π΅ Π·Π° постоянство, осигурСни ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ API Π½Π° Linux. ИзглСТда, Ρ‡Π΅ Ρ‚ΡƒΠΊ всичко трябва Π΄Π° Π΅ просто: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° write(), ΠΈ слСд ΠΊΠ°Ρ‚ΠΎ опСрацията Π½Π° Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ, Π΄Π°Π½Π½ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ сигурно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ Π½Π° диска. Но write() ΠΊΠΎΠΏΠΈΡ€Π° само Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² кСша Π½Π° ядрото, Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² RAM. Π—Π° Π΄Π° сС ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈ систСмата Π΄Π° записва Π΄Π°Π½Π½ΠΈ Π½Π° диск, трябва Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ някои Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ.

Устойчиво ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ API Π·Π° Linux Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

ΠšΠ°Ρ‚ΠΎ цяло Ρ‚ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π±Π΅Π»Π΅ΠΆΠΊΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ съм Π½Π°ΡƒΡ‡ΠΈΠ» ΠΏΠΎ Ρ‚Π΅ΠΌΠ°, която ΠΌΠ΅ интСрСсува. Ако Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ, сС ΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Π·Π° Π΄Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ устойчиво ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° fdatasync() ΠΈΠ»ΠΈ отваряйтС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с Ρ„Π»Π°Π³ O_DSYNC. Ако сС интСрСсуватС Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ сС случва с Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΡŠΡ‚Ρ ΠΎΡ‚ ΠΊΠΎΠ΄Π° към диска, Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ²Π° статия.

Π₯арактСристики Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° функцията write().

БистСмно ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ write() ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π² стандарта IEEE POSIX ΠΊΠ°Ρ‚ΠΎ ΠΎΠΏΠΈΡ‚ Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ във Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор. Π‘Π»Π΅Π΄ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° write() ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ трябва Π΄Π° Π²Ρ€ΡŠΡ‰Π°Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅Ρ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ са Π±ΠΈΠ»ΠΈ записани ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ правят Ρ‚ΠΎΠ²Π° Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ процСси ΠΈΠ»ΠΈ нишки (Ρ‚ΡƒΠΊ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ€Π°Π·Π΄Π΅Π» Π½Π° стандарта POSIX). Π’ΡƒΠΊ, Π² Ρ€Π°Π·Π΄Π΅Π»Π° Π·Π° взаимодСйствиСто Π½Π° нишки с Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ° Π±Π΅Π»Π΅ΠΆΠΊΠ°, която ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Π°ΠΊΠΎ Π΄Π²Π΅ нишки ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‚ Ρ‚Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° всяко ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ трябва ΠΈΠ»ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈ всички посочСни послСдствия, Π΄ΠΎ ΠΊΠΎΠΈΡ‚ΠΎ Π²ΠΎΠ΄ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ послСдствия. Π’ΠΎΠ²Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‡Π΅ всички Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ I/O ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ трябва Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° рСсурса, Π²ΡŠΡ€Ρ…Ρƒ ΠΊΠΎΠΉΡ‚ΠΎ сС Ρ€Π°Π±ΠΎΡ‚ΠΈ.

ΠžΠ·Π½Π°Ρ‡Π°Π²Π° Π»ΠΈ Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ опСрацията write() Π΅ Π°Ρ‚ΠΎΠΌΠ΅Π½? ΠžΡ‚ тСхничСска Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π΄Π°. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ трябва Π΄Π° Π²ΡŠΡ€Π½Π°Ρ‚ ΠΈΠ»ΠΈ всичко, ΠΈΠ»ΠΈ Π½ΠΈΡ‰ΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, с ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ записано write(). Но опСрацията write(), Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ със стандарта, Π½Π΅ трябва Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°, слСд ΠΊΠ°Ρ‚ΠΎ Π΅ записала всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ ΠΏΠΎΠΌΠΎΠ»Π΅Π½ΠΎ Π΄Π° запишС. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΅ записванСто само Π½Π° част ΠΎΡ‚ Π΄Π°Π½Π½ΠΈΡ‚Π΅. НапримСр, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, всСки ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ добавя 1024 Π±Π°ΠΉΡ‚Π° към Ρ„Π°ΠΉΠ», описан ΠΎΡ‚ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° стандарта, Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Ρ‰Π΅ бъдС ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ², ΠΊΠΎΠ³Π°Ρ‚ΠΎ всяка ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° запис ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈ само Π΅Π΄ΠΈΠ½ Π±Π°ΠΉΡ‚ към Ρ„Π°ΠΉΠ»Π°. Π’Π΅Π·ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‰Π΅ останат Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΈ, Π½ΠΎ слСд ΠΊΠ°Ρ‚ΠΎ Π·Π°Π²ΡŠΡ€ΡˆΠ°Ρ‚, Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ записват във Ρ„Π°ΠΉΠ»Π°, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π±ΡŠΡ€ΠΊΠ°Π½ΠΈ. Ρ‚ΡƒΠΊ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсна дискусия ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° Π² Stack Overflow.

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fsync() ΠΈ fdatasync().

Най-лСсният Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π° диска Π΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°Ρ‚Π΅ функцията fsync(). Π’Π°Π·ΠΈ функция иска ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма Π΄Π° прСмСсти всички ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ кСша Π½Π° диска. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° всички ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ Π½Π° Ρ„Π°ΠΉΠ»Π° (Π²Ρ€Π΅ΠΌΠ΅ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ, Π²Ρ€Π΅ΠΌΠ΅ Π·Π° модификация Π½Π° Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‚.Π½.). Вярвам, Ρ‡Π΅ Ρ‚Π΅Π·ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ са рядко Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π°ΠΊΠΎ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Π΅ Π½Π΅ са Π²Π°ΠΆΠ½ΠΈ Π·Π° вас, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ функцията fdatasync(). Π’ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π½Π° fdatasync() Ρ‚Π°ΠΌ сС ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ‚Π°Π·ΠΈ функция Π½Π° диска сС записва Ρ‚Π°ΠΊΠΎΠ²Π° количСство ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ β€žΠ½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ изпълнСниС Π½Π° слСдващитС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈβ€œ. И Ρ‚ΠΎΠ²Π° Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ интСрСсува ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ прилоТСния.

Π•Π΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° възникнС Ρ‚ΡƒΠΊ, Π΅, Ρ‡Π΅ Ρ‚Π΅Π·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Ρ‚, Ρ‡Π΅ Ρ„Π°ΠΉΠ»ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ слСд Π΅Π²Π΅Π½Ρ‚ΡƒΠ°Π»Π½Π° ΠΏΠΎΠ²Ρ€Π΅Π΄Π°. По-спСциално, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС създава Π½ΠΎΠ² Ρ„Π°ΠΉΠ», трябва Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° fsync() Π·Π° дирСкторията, която Π³ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай слСд срив ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠΊΠ°ΠΆΠ΅, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° Ρ‚ΠΎΠ²Π° Π΅, Ρ‡Π΅ ΠΏΠΎΠ΄ UNIX, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π²ΡŠΡ€Π΄ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ, Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π² мноТСство Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΎΠ±Π°Π΄ΠΈΡ‚Π΅ fsync() няма Π½Π°Ρ‡ΠΈΠ½ Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π΄Π° Π·Π½Π°Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ коя дирСктория ΡΡŠΡ‰ΠΎ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΈ Π½Π° диска (Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π°). ИзглСТда, Ρ‡Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма ext4 Π΅ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° кандидатстватС fsync() към Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π½ΠΎ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ Ρ‚Π°ΠΊΠ° с Π΄Ρ€ΡƒΠ³ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ систСми.

Π’ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ систСми. ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… blktrace Π·Π° Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΈ дискови ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ във Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ систСми ext4 ΠΈ XFS. И Π΄Π²Π΅Ρ‚Π΅ ΠΈΠ·Π΄Π°Π²Π°Ρ‚ ΠΎΠ±ΠΈΡ‡Π°ΠΉΠ½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° запис Π½Π° диск ΠΊΠ°ΠΊΡ‚ΠΎ Π·Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅, Ρ‚Π°ΠΊΠ° ΠΈ Π·Π° Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма, изчистват кСша ΠΈ ΠΈΠ·Π»ΠΈΠ·Π°Ρ‚ Ρ‡Ρ€Π΅Π· ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° FUA (Force Unit Access, запис Π½Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° диска, заобикаляйки кСша) запис Π² Π΄Π½Π΅Π²Π½ΠΈΠΊΠ°. Π’Π΅ вСроятно правят Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΡΡ‚ Ρ„Π°ΠΊΡ‚Π° Π½Π° транзакцията. На устройства, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ FUA, Ρ‚ΠΎΠ²Π° причинява Π΄Π²Π΅ промивания Π½Π° кСша. ΠœΠΎΠΈΡ‚Π΅ СкспСримСнти Π³ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ…Π° fdatasync() ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ fsync(). полСзност blktrace ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ fdatasync() ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ записва ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ Π½Π° диск (Π² ext4 fsync() пишС 20 KiB ΠΈ fdatasync() - 16 KiB). ОсвСн Ρ‚ΠΎΠ²Π° ΠΎΡ‚ΠΊΡ€ΠΈΡ…, Ρ‡Π΅ XFS Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π±ΡŠΡ€Π· ΠΎΡ‚ ext4. И Ρ‚ΡƒΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° blktrace успя Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ Ρ‚ΠΎΠ²Π° fdatasync() ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Ρ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ Π½Π° диск (4 KiB Π² XFS).

ДвусмислСни ситуации ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° fsync()

Мога Π΄Π° сС сСтя Π·Π° Ρ‚Ρ€ΠΈ двусмислСни ситуации относно fsync()с ΠΊΠΎΠΈΡ‚ΠΎ съм сС сблъсквал Π² ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ‚Π°.

ΠŸΡŠΡ€Π²ΠΈΡΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ сС случи ΠΏΡ€Π΅Π· 2008 Π³. По Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡŠΡ‚ Π½Π° Firefox 3 β€žΠ·Π°ΠΌΡ€ΡŠΠ·Π²Π°ΡˆΠ΅β€œ, Π°ΠΊΠΎ голям Π±Ρ€ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС записваха Π½Π° диск. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ бСшС, Ρ‡Π΅ рСализацията Π½Π° интСрфСйса ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ SQLite Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° информация Π·Π° Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅. Π‘Π»Π΅Π΄ всяка промяна, Π½Π°ΡΡ‚ΡŠΠΏΠΈΠ»Π° Π² интСрфСйса, функцията сС извиквашС fsync(), ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π°Π΄Π΅ Π΄ΠΎΠ±Ρ€ΠΈ Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ Π·Π° стабилно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ. Π’ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π°Ρ‚Π° Ρ‚ΠΎΠ³Π°Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма ext3 функцията fsync() ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Ρ Π½Π° диска всички "ΠΌΡ€ΡŠΡΠ½ΠΈ" страници Π² систСмата, Π° Π½Π΅ само Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ със ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ„Π°ΠΉΠ». Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°ΡˆΠ΅, Ρ‡Π΅ Ρ‰Ρ€Π°ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π²ΡŠΡ€Ρ…Ρƒ Π±ΡƒΡ‚ΠΎΠ½ във Firefox ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ записванС Π½Π° ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΌΠ°Π³Π½ΠΈΡ‚Π΅Π½ диск, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ‚Π½Π΅ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ сСкунди. Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Ρ€Π°Π·Π±Ρ€Π°Ρ… ΠΎΡ‚ Ρ‚ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», бСшС Π΄Π° сС прСмСсти Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ към асинхронни Ρ„ΠΎΠ½ΠΎΠ²ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Firefox ΠΏΡ€ΠΈΠ»Π°Π³Π°ΡˆΠ΅ ΠΏΠΎ-строги изисквания Π·Π° устойчивост Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ бСшС наистина Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма ext3 само изостриха Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Вторият ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ сС случи ΠΏΡ€Π΅Π· 2009 Π³. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, слСд систСмСн срив, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π½ΠΎΠ²Π°Ρ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма ext4 установиха, Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΎ новосъздадСни Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ са с Π½ΡƒΠ»Π΅Π²Π° дълТина, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ сС случи с ΠΏΠΎ-старата Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма ext3. Π’ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ… Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ext3 ΠΈΠ·Ρ…Π²ΡŠΡ€Π»ΠΈ Ρ‚Π²ΡŠΡ€Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ Π½Π° диска, ΠΊΠΎΠ΅Ρ‚ΠΎ Π·Π°Π±Π°Π²ΠΈ Π½Π΅Ρ‰Π°Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎ. fsync(). Π—Π° Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ ситуацията, ext4 ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π° само Ρ‚Π΅Π·ΠΈ "ΠΌΡ€ΡŠΡΠ½ΠΈ" страници, ΠΊΠΎΠΈΡ‚ΠΎ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ Ρ„Π°ΠΉΠ». И Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ остават Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-дълго Π²Ρ€Π΅ΠΌΠ΅, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΡ€ΠΈ ext3. Π’ΠΎΠ²Π° бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ производитСлността (ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ остават Π² Ρ‚ΠΎΠ²Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π·Π° 30 сСкунди, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Ρ‚ΠΎΠ²Π° Ρ‡Ρ€Π΅Π· dirty_expire_centisecs; Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° Ρ‚ΠΎΠ²Π°). Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ голямо количСство Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π±Π΅Π·Π²ΡŠΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ Π·Π°Π³ΡƒΠ±Π΅Π½ΠΎ слСд срив. Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° fsync() Π² прилоТСния, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° осигурят стабилно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ защитят възмоТно Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ послСдствията ΠΎΡ‚ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈ. функция fsync() Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ с ext4 ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ с ext3. ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊΡŠΡ‚ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅, Ρ‡Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΠΈ, забавя някои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ инсталиранС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. Π’ΠΈΠΆΡ‚Π΅ подробности Π·Π° Ρ‚ΠΎΠ²Π° Ρ‚ΡƒΠΊ ΠΈ Ρ‚ΡƒΠΊ.

ВрСтият ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ относно fsync(), възникнал ΠΏΡ€Π΅Π· 2018 Π³. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° PostgreSQL, бСшС установСно, Ρ‡Π΅ Π°ΠΊΠΎ функцията fsync() срСщнС Π³Ρ€Π΅ΡˆΠΊΠ°, ΠΌΠ°Ρ€ΠΊΠΈΡ€Π° "ΠΌΡ€ΡŠΡΠ½ΠΈΡ‚Π΅" страници ΠΊΠ°Ρ‚ΠΎ "чисти". Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π°, слСднитС Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈ fsync() Π½Π΅ ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π½ΠΈΡ‰ΠΎ с Ρ‚Π°ΠΊΠΈΠ²Π° страници. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ страници сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ сС записват Π½Π° диск. Π’ΠΎΠ²Π° Π΅ истинска катастрофа, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ мисли, Ρ‡Π΅ някои Π΄Π°Π½Π½ΠΈ са записани Π½Π° диска, Π½ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ няма Π΄Π° Π΅ Ρ‚Π°ΠΊΠ°. Π’Π°ΠΊΠΈΠ²Π° ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ fsync() са Ρ€Π΅Π΄ΠΊΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΈΠ²Π° ситуации Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‰ΠΎ Π·Π° справянС с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’Π΅Π·ΠΈ Π΄Π½ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° сС случи, PostgreSQL ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ прилоТСния сС сриват. Π’ΡƒΠΊ, Π² статията β€žΠœΠΎΠ³Π°Ρ‚ Π»ΠΈ прилоТСнията Π΄Π° сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΡ‚ ΠΎΡ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° fsync?β€œ, Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Direct I/O с Ρ„Π»Π°Π³Π° O_SYNC ΠΈΠ»ΠΈ със Π·Π½Π°ΠΌΠ΅ O_DSYNC. Π‘ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ систСмата Ρ‰Π΅ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° спСцифични ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ изисква ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄Π° управлява самото Π±ΡƒΡ„Π΅Ρ€ΠΈ. ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° Ρ‚ΡƒΠΊ ΠΈ Ρ‚ΡƒΠΊ.

ΠžΡ‚Π²Π°Ρ€ΡΠ½Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„Π»Π°Π³ΠΎΠ²Π΅Ρ‚Π΅ O_SYNC ΠΈ O_DSYNC

НСка сС Π²ΡŠΡ€Π½Π΅ΠΌ към ΠΎΠ±ΡΡŠΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈΡ‚Π΅ Π½Π° Linux, ΠΊΠΎΠΈΡ‚ΠΎ осигуряват постоянно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ O_SYNC ΠΈΠ»ΠΈ Π·Π½Π°ΠΌΠ΅ O_DSYNC ΠΏΡ€ΠΈ отварянС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Ρ‡Ρ€Π΅Π· систСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½(). Π‘ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ всяка опСрация Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ сС изпълнява сякаш слСд всяка ΠΊΠΎΠΌΠ°Π½Π΄Π° write() Π½Π° систСмата сС Π΄Π°Π²Π°Ρ‚ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ fsync() ΠΈ fdatasync(). Π’ POSIX спСцификации Ρ‚ΠΎΠ²Π° сС Π½Π°Ρ€ΠΈΡ‡Π° β€žΠ—Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ‚Π΅Ρ‚Π° Π½Π° синхронизирани I/O Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅β€œ ΠΈ β€žΠ—Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ‚Π΅Ρ‚Π° Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅β€œ. ΠžΡΠ½ΠΎΠ²Π½ΠΎΡ‚ΠΎ прСдимство Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅, Ρ‡Π΅ трябва Π΄Π° сС изпълни само Π΅Π΄Π½ΠΎ систСмно ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, Π·Π° Π΄Π° сС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° цСлостта Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, Π° Π½Π΅ Π΄Π²Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ βˆ’ write() ΠΈ fdatasync()). ΠžΡΠ½ΠΎΠ²Π½ΠΈΡΡ‚ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅, Ρ‡Π΅ всички ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° запис, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ синхронизирани, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° структуриранС Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

ИзползванС Π½Π° Direct I/O с Ρ„Π»Π°Π³Π° O_DIRECT

БистСмно ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ open() ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ O_DIRECT, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Π° заобикаля кСша Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма, Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° I / O ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, взаимодСйствайки Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ с диска. Π’ΠΎΠ²Π° Π² ΠΌΠ½ΠΎΠ³ΠΎ случаи ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π·Π° запис, ΠΈΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€Π΅Π²Π΅Π΄Π΅Π½ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, насочСни към Ρ€Π°Π±ΠΎΡ‚Π° с диска. Но ΠΊΠ°Ρ‚ΠΎ цяло Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π½Π΅ Π΅ замСститСл Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ fsync() ΠΈΠ»ΠΈ fdatasync(). Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ самият диск ΠΌΠΎΠΆΠ΅ забавянС ΠΈΠ»ΠΈ кСш подходящи ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ. И, ΠΎΡ‰Π΅ ΠΏΠΎ-лошо, Π² някои спСциални случаи I / O ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ„Π»Π°Π³Π° O_DIRECT, ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½Π΅ Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Най-лСсният Π½Π°Ρ‡ΠΈΠ½ Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ„Π»Π°Π³Π° Π·Π° отварянС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ O_DSYNC, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ всяка опСрация Π·Π° запис Ρ‰Π΅ бъдС послСдвана ΠΎΡ‚ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ fdatasync().

Оказа сС, Ρ‡Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма XFS наскоро Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° "Π±ΡŠΡ€Π· ΠΏΡŠΡ‚" Π·Π° O_DIRECT|O_DSYNC- записи Π½Π° Π΄Π°Π½Π½ΠΈ. Ако Π±Π»ΠΎΠΊΡŠΡ‚ Π΅ прСзаписан с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° O_DIRECT|O_DSYNC, Ρ‚ΠΎΠ³Π°Π²Π° XFS, вмСсто Π΄Π° изчисти кСша, Ρ‰Π΅ изпълни ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° запис FUA, Π°ΠΊΠΎ устройството я ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ… Ρ‚ΠΎΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° blktrace Π½Π° систСма Linux 5.4/Ubuntu 20.04. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ трябва Π΄Π° Π΅ ΠΏΠΎ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ записва ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ количСство Π΄Π°Π½Π½ΠΈ Π½Π° диска ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄Π½Π° опСрация, Π° Π½Π΅ Π΄Π²Π΅ (запис ΠΈ изчистванС Π½Π° кСша). НамСрих Π²Ρ€ΡŠΠ·ΠΊΠ° към ΠΊΡ€ΡŠΠΏΠΊΠ° 2018 ядро, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»Π°Π³Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ. Има някои дискусии относно ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ оптимизация към Π΄Ρ€ΡƒΠ³ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ систСми, Π½ΠΎ Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π·Π½Π°ΠΌ, XFS Π΅ СдинствСната Ρ„Π°ΠΉΠ»ΠΎΠ²Π° систСма, която Π³ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° досСга.

функция sync_file_range().

Linux ΠΈΠΌΠ° систСмно ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ sync_file_range(), ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅Ρ‚Π΅ само част ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° Π½Π° диска, Π° Π½Π΅ цСлия Ρ„Π°ΠΉΠ». Π’ΠΎΠ²Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€Π° асинхронСн Ρ„Π»ΡŠΡˆ ΠΈ Π½Π΅ Ρ‡Π°ΠΊΠ° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ. Но Π² ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠ°Ρ‚Π° към sync_file_range() Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° сС ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Π΅ "ΠΌΠ½ΠΎΠ³ΠΎ опасна". НС сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ. Π₯арактСристики ΠΈ опасности sync_file_range() ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Ρ€Π΅ описан Π² Ρ‚ΠΎΠ²Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π». По-спСциално, Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° RocksDB, Π·Π° Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° ΠΊΠΎΠ³Π° ядрото ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Ρ "ΠΌΡ€ΡŠΡΠ½ΠΈ" Π΄Π°Π½Π½ΠΈ Π½Π° диска. Но Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Ρ‚Π°ΠΌ, Π·Π° Π΄Π° сС осигури стабилно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Ρ‚ΠΎΠΉ ΡΡŠΡ‰ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° fdatasync(). Π’ ΠΊΠΎΠ΄ RocksDB ΠΈΠΌΠ° някои интСрСсни ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ°. НапримСр, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ sync_file_range() ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ZFS Π½Π΅ ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Ρ Π΄Π°Π½Π½ΠΈ Π½Π° диск. ΠžΠΏΠΈΡ‚ΡŠΡ‚ ΠΌΠΈ ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ рядко използваният ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π³Ρ€Π΅ΡˆΠΊΠΈ. Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ Π±ΠΈΡ… ΠΏΠΎΡΡŠΠ²Π΅Ρ‚Π²Π°Π» Π΄Π° Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ‚ΠΎΠ²Π° систСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, освСн Π°ΠΊΠΎ Π½Π΅ Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

БистСмни повиквания, Π·Π° Π΄Π° сС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° устойчивостта Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅

Π‘Ρ‚ΠΈΠ³Π½Π°Ρ… Π΄ΠΎ ΠΈΠ·Π²ΠΎΠ΄Π°, Ρ‡Π΅ ΠΈΠΌΠ° Ρ‚Ρ€ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° постоянни I/O ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Всички Ρ‚Π΅ изискват ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° функция fsync() Π·Π° дирСкторията, Π² която Π΅ създадСн Ρ„Π°ΠΉΠ»ΡŠΡ‚. Π’ΠΎΠ²Π° са ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚Π΅:

  1. ИзвикванС Π½Π° функция fdatasync() ΠΈΠ»ΠΈ fsync() слСд функция write() (ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° fdatasync()).
  2. Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор, ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ с Ρ„Π»Π°Π³ O_DSYNC ΠΈΠ»ΠΈ O_SYNC (ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ - със Π·Π½Π°ΠΌΠ΅ O_DSYNC).
  3. ИзползванС Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ pwritev2() със Π·Π½Π°ΠΌΠ΅ RWF_DSYNC ΠΈΠ»ΠΈ RWF_SYNC (Π·Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π½Π΅ със Π·Π½Π°ΠΌΠ΅ RWF_DSYNC).

Π‘Π΅Π»Π΅ΠΆΠΊΠΈ Π·Π° СфСктивността

НС ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ… Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ изслСдвах. Π Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ забСлязах Π² скоростта Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΈΠΌ са ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΌΠΎΠ³Π° Π΄Π° Π³Ρ€Π΅ΡˆΠ° ΠΈ Ρ‡Π΅ ΠΏΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ условия ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ. ΠŸΡŠΡ€Π²ΠΎ, Ρ‰Π΅ говоря Π·Π° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ влияС ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²ΡŠΡ€Ρ…Ρƒ производитСлността, Π° слСд Ρ‚ΠΎΠ²Π°, Π·Π° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ влияС ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ.

  1. ΠŸΡ€Π΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Π΅ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΎΡ‚ добавянСто Π½Π° Π΄Π°Π½Π½ΠΈ към Ρ„Π°ΠΉΠ» (ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° производитСлността ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС 2-100%). ΠŸΡ€ΠΈΠΊΠ°Ρ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ към Ρ„Π°ΠΉΠ» изисква Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° Ρ„Π°ΠΉΠ»Π°, Π΄ΠΎΡ€ΠΈ слСд систСмното ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ fallocate(), Π½ΠΎ стСпСнта Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ„Π΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π°Ρ€ΠΈΡ€Π°. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ, Π·Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΎ прСдставянС, Π΄Π° сС ΠΎΠ±Π°Π΄ΠΈΡ‚Π΅ fallocate() Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ разпрСдСлянС Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡ‚ΠΎ пространство. Π’ΠΎΠ³Π°Π²Π° Ρ‚ΠΎΠ²Π° пространство трябва ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ Π΄Π° сС попълни с Π½ΡƒΠ»ΠΈ ΠΈ Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° fsync(). Π’ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΠΊΠ°Ρ€Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ във Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ β€žΡ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈβ€œ вмСсто β€žΠ½Π΅Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈβ€œ. Π’ΠΎΠ²Π° Π΄Π°Π²Π° ΠΌΠ°Π»ΠΊΠΎ (ΠΎΠΊΠΎΠ»ΠΎ 2%) ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΠ΅ Π½Π° производитСлността. ОсвСн Ρ‚ΠΎΠ²Π° някои дисковС ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°Ρ‚ ΠΏΠΎ-Π±Π°Π²Π½Π° опСрация Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΏΡŠΡ€Π²ΠΈ Π±Π»ΠΎΠΊ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Π·Π°ΠΏΡŠΠ»Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° пространството с Π½ΡƒΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ (ΠΎΠΊΠΎΠ»ΠΎ 100%) ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΠ΅ Π½Π° производитСлността. По-спСциално Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС случи с дисковС. AWS EBS (Ρ‚ΠΎΠ²Π° са Π½Π΅ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ, Π½Π΅ ΠΌΠΎΠΆΠ°Ρ… Π΄Π° Π³ΠΈ ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Ρ). Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ Π²Π°ΠΆΠΈ ΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ. GCP постоянСн диск (ΠΈ Ρ‚ΠΎΠ²Π° Π²Π΅Ρ‡Π΅ Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° информация, ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Π½Π° ΠΎΡ‚ тСстовС). Π”Ρ€ΡƒΠ³ΠΈ СкспСрти са Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π΅Π½ΠΈΠ΅ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ дисковС.
  2. ΠšΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ систСмни повиквания, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-висока Π΅ производитСлността (ΠΏΠ΅Ρ‡Π°Π»Π±Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΎΠΊΠΎΠ»ΠΎ 5%). ΠŸΡ€ΠΈΠ»ΠΈΡ‡Π° Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ open() със Π·Π½Π°ΠΌΠ΅ O_DSYNC ΠΈΠ»ΠΈ сС ΠΎΠ±Π°Π΄Π΅Ρ‚Π΅ pwritev2() със Π·Π½Π°ΠΌΠ΅ RWF_SYNC ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ fdatasync(). ΠŸΠΎΠ΄ΠΎΠ·ΠΈΡ€Π°ΠΌ, Ρ‡Π΅ Π²ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Ρ‚ΡƒΠΊ Π΅, Ρ‡Π΅ ΠΏΡ€ΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ„Π°ΠΊΡ‚ΡŠΡ‚, Ρ‡Π΅ трябва Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ°Ρ‚ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ систСмни извиквания, Π·Π° Π΄Π° сС Ρ€Π΅ΡˆΠΈ Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° Π·Π°Π΄Π°Ρ‡Π° (Π΅Π΄Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ вмСсто Π΄Π²Π΅), ΠΈΠ³Ρ€Π°Π΅ роля. Но Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° Π² производитСлността Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠ°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ лСсно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° я ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Ρ‚Π΅ ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π½Π΅Ρ‰ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ услоТняванС Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ°.

Ако сС интСрСсуватС ΠΎΡ‚ Ρ‚Π΅ΠΌΠ°Ρ‚Π° Π·Π° устойчивото ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π΅Ρ‚ΠΎ някои ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈ:

  • I/O ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ β€” ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° основитС Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΎ-ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ.
  • Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½Π΅, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ достигат Π΄ΠΎ диска - история Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ сС случва с Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΡŠΡ‚Ρ ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄ΠΎ диска.
  • Кога трябва Π΄Π° fsync ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π°Ρ‚Π° дирСктория - ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚ Π½Π° Π²ΡŠΠΏΡ€ΠΎΡΠ° ΠΊΠΎΠ³Π° Π΄Π° сС кандидатства fsync() Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Накратко, ΠΎΠΊΠ°Π·Π²Π° сС, Ρ‡Π΅ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ Π½ΠΎΠ² Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° Ρ‚Π°Π·ΠΈ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ° Π΅, Ρ‡Π΅ Π² Linux ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠΈ към Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ Ρ„Π°ΠΉΠ».
  • SQL Server Π½Π° Linux: FUA Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ - Ρ‚ΡƒΠΊ Π΅ описаниС Π½Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ постоянното ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ Π² SQL Server Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Linux. Π’ΡƒΠΊ ΠΈΠΌΠ° някои интСрСсни сравнСния ΠΌΠ΅ΠΆΠ΄Ρƒ систСмнитС извиквания Π½Π° Windows ΠΈ Linux. ΠŸΠΎΡ‡Ρ‚ΠΈ съм сигурСн, Ρ‡Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π°ΡƒΡ‡ΠΈΡ… Π·Π° FUA оптимизацията Π½Π° XFS.

Π“ΡƒΠ±ΠΈΠ»ΠΈ Π»ΠΈ стС някога Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ смятатС, Ρ‡Π΅ са сигурно ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈ Π½Π° диск?

Устойчиво ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ API Π·Π° Linux Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

Устойчиво ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ API Π·Π° Linux Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com