When migrating our service from a VM to dedicated hardware (AMD Opteron 3250, 8GB RAM, software RAID), we encountered puzzling SQLite performance degradation - transactions taking 10-15x longer than our 2010 MacBook Pro. Benchmarking revealed the default ext3 mount options as the bottleneck:
# Original configuration
mount -t ext3 -o data=ordered,barrier=1 /dev/md0 /data
Through systematic testing, we identified the optimal performance configuration:
# Optimized configuration
mount -t ext3 -o data=writeback,barrier=0,noatime,nodiratime /dev/md0 /data
This combination delivered 8-12x improvement in SQLite transaction throughput for our workload pattern (60% inserts, 30% updates, 10% deletes).
The performance gains come with specific reliability implications:
- data=writeback: Metadata remains consistent, but recent file data might be lost during crashes
- barrier=0: Disables write barrier protection, risking filesystem corruption during power failures
For our production deployment, we implemented these safeguards:
# Database snapshot script with integrity verification
#!/bin/bash
sqlite3 /data/app.db ".backup /snapshots/backup_$(date +%s).db"
sqlite3 /snapshots/latest.db "pragma quick_check;" > /var/log/db_verify.log
For environments where absolute data integrity is paramount, consider:
# Balanced configuration (75% of max performance)
mount -t ext3 -o data=ordered,barrier=1,commit=60 /dev/md0 /data
For new deployments, we're evaluating these options:
- XFS with nobarrier for similar performance characteristics
- Btrfs with copy-on-write for better crash consistency
- Ext4 with journal checksumming (barrier=1 but better performance)
Our current implementation uses LVM snapshots combined with the verification script for point-in-time recovery while maintaining the performance benefits of our optimized ext3 configuration.
When migrating from virtualized to bare metal infrastructure, we encountered unexpected performance degradation in SQLite operations - with transactions running 10-15x slower than our development laptops. The culprit? Default ext3 mount options optimized for safety over speed.
The standard data=ordered,barrier=1
configuration provides strong consistency guarantees but creates significant I/O overhead:
# Default safe configuration
UUID=xxxx-xxxx / ext3 errors=remount-ro,data=ordered,barrier=1 0 1
Our testing revealed data=writeback,barrier=0
delivered optimal throughput:
# High-performance configuration
UUID=xxxx-xxxx / ext3 errors=remount-ro,data=writeback,barrier=0 0 1
While these settings improve performance, they introduce potential data integrity risks:
- Metadata remains consistent, but recent file contents may be lost during crashes
- Journal recovery becomes more complex after power failures
- SQLite WAL mode may interact unpredictably with writeback caching
Rather than disabling all safeguards, consider these balanced alternatives:
# Compromise configuration
UUID=xxxx-xxxx / ext3 errors=remount-ro,data=writeback,barrier=1,nobh 0 1
For production systems requiring both performance and reliability:
- Implement periodic SQLite checkpoints:
PRAGMA wal_checkpoint(FULL);
- Schedule filesystem sync every 5 minutes:
sync && echo 3 > /proc/sys/vm/drop_caches
- Consider using ext4 with
data=journal
for better performance characteristics