U současných pevných disků to ne neexistuje ujištění, že soubor je skutečně zapsán na disk, i když disk hlásí operačnímu systému zápis jako dokončený! To je způsobeno vestavěnou mezipamětí v jednotce.
Na freeBSD to můžete zakázat nastavením kern.cam.ada.write_cache
sysctl na 0. Tím se degraduje zapisovat výkon významně . Naposledy jsem to změřil (pevný disk WDC WD5001ABYS-01YNA0 na čipové sadě ICH-7, FreeBSD 8.1 AMD64), výkon nepřetržitého zápisu (měřeno s dd if=/dev/zero of=/tmp/foo bs=10M count=1000
) klesla ze 75 000 000 bajtů/s na 12 900 000 bajtů/s.
Pokud chcete mít naprostou jistotu, že jsou vaše soubory zapsány;
- Zakažte ukládání do mezipaměti pomocí
sysctl kern.cam.ada.write_cache=0
následujecamcontrol reset <bus>:<target>:<lun>
. - Otevřete soubor pomocí
O_SYNC
možnost.
Poznámka:
- Váš výkon při zápisu (na HDD) bude nyní naprosto na hovno.
- Nepřipojujte oddíl s
sync
volba; to způsobí vše I/O (včetně čtení) se mají provádět synchronně. - Nepoužívejte
O_DIRECT
. Pokusí se vyrovnávací paměť úplně obejít. To pravděpodobně ovlivní i čtení.
O_DIRECT
v podstatě existuje pouze pro Oracle, aby obešel vrstvu mezipaměti jádra a prováděl vlastní mezipaměť. Má špatně definovanou sémantiku, svévolná omezení velikosti a zarovnání čtení, která můžete provádět, a obecně by se neměl používat. O_SYNC
má vám poskytnout požadované efekty, ale bez základního souborového systému, který je odolný proti výpadku napájení nebo pádům, stále nemusí být pro vaše potřeby dostačující.