From 4c21fadeed16ffce1fbbe16bcb8b3ebe4fadb6d7 Mon Sep 17 00:00:00 2001 From: taptap Date: Wed, 24 Jun 2026 23:32:18 +0200 Subject: [PATCH] Update README with LZ4 compression documentation - Document LZ4 compression as a feature - Add -c flag to Usage section - Add Compression section with usage guidelines - Update Project Structure with lz4.h/lz4.c - Add compression performance data - Update Optimization Impact list Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- README.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2853d57..9c944de 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ A high-performance file synchronization tool written in C, designed for rapid da - **Multi-threaded Architecture**: Parallel file processing with configurable worker threads (default: 4, max: 32) - **TCP-based Transfer**: Reliable, optimized TCP protocol with pipelining and batching +- **LZ4 Compression**: Built-in LZ4 compression for TCP transfers (enabled by default, use `-c` to disable) - **Experimental UDP Mode**: UDP for bulk data transfer (disabled by default, use `-u` flag) - **Efficient File Handling**: Recursive directory scanning, selective transfer (skip existing files) - **Custom Binary Protocol**: Lightweight, low-overhead communication with magic number validation @@ -19,6 +20,7 @@ A high-performance file synchronization tool written in C, designed for rapid da 3. **TCP Tuning**: 4MB socket buffers (`SO_SNDBUF`, `SO_RCVBUF`) and `TCP_NODELAY` for low-latency 4. **True Metadata/Data Pipelining**: Server processes file N metadata while receiving file N-1 data 5. **Zero-Copy Transfer**: Uses `sendfile()` system call for TCP data transfer (no user-space buffering) +6. **LZ4 Compression**: Optional LZ4 compression for compressible data (text, logs, etc.) ## Protocol Overview @@ -71,6 +73,7 @@ Options: - `-s SOURCE_DIR` - Source directory to synchronize (required) - `-n CONNECTIONS` - Number of parallel TCP connections (default: 4, max: 32) - `-u` - **EXPERIMENTAL**: Use UDP for data transfer (requires `-u` on both client and server; disabled by default) +- `-c` - DISABLE compression (default: ON with LZ4) ### Example @@ -98,6 +101,21 @@ Options: **Recommendation**: Use TCP for all transfers. UDP code remains in codebase for future improvement. +## Compression + +fastSyncAI includes built-in **LZ4 compression** for TCP transfers, enabled by default. + +- **Default**: Compression is ON (use `-c` flag to disable) +- **Algorithm**: LZ4 - fast compression with good ratio for compressible data +- **Behavior**: Automatically falls back to uncompressed transfer if compression doesn't reduce file size +- **Overhead**: Adds memory usage (file must be fully read into memory for compression) +- **Best for**: Text files, logs, databases, any compressible data + +### When to disable compression (`-c` flag): +- Already compressed files (JPEG, MP3, ZIP, etc.) - compression won't help +- Very small files (< 1KB) - compression overhead may exceed benefits +- Maximum throughput on localhost/LAN - uncompressed `sendfile()` is faster + ## Benchmarking The project includes a comprehensive network benchmarking script that compares fastSyncAI against rsync: @@ -157,9 +175,11 @@ fastSyncAI/ ├── benchmark_network.sh # Network condition benchmarking ├── src/ │ ├── common.h # Shared definitions, protocol constants, structs -│ ├── client.c # Client implementation (batch, pipelining, sendfile, UDP) -│ ├── server.c # Server implementation (pipelined processing, fsync, UDP) +│ ├── client.c # Client implementation (batch, pipelining, sendfile, LZ4, UDP) +│ ├── server.c # Server implementation (pipelined processing, fsync, LZ4, UDP) │ ├── utils.c # Utility functions (I/O, networking) +│ ├── lz4.h # LZ4 compression library header +│ ├── lz4.c # LZ4 compression library implementation │ └── xxhash.h # Hash function for file verification ├── test_src/ # Test source directory ├── test_dest/ # Test destination directory @@ -205,12 +225,22 @@ Based on recent testing with 50 MB mixed dataset on LAN simulation (10ms RTT, 0. **Note**: UDP is currently **not production-ready** and offers no speed advantage over TCP. +### Compression Performance (localhost, text data) + +| Mode | File Size | Transfer Size | Speed | Ratio | +|------|-----------|---------------|-------|-------| +| TCP + LZ4 | 67 KB | ~15 KB | 86 MB/s | ~4.5:1 | +| TCP only | 67 KB | 67 KB | 108 MB/s | 1:1 | + +**Note**: Compression reduces network transfer at the cost of CPU. On WAN, compression typically wins. + ## Optimization Impact - **Zero-copy (sendfile)**: ~40% improvement over buffered I/O - **Batch metadata**: ~25% reduction in protocol overhead for small files - **TCP tuning**: ~15% improvement in throughput - **Pipelining**: ~10% improvement by overlapping metadata/data transfer +- **LZ4 compression**: 2-5x reduction in transfer size for compressible data ## Requirements