summaryrefslogtreecommitdiff
path: root/doc/turboboost_optimization.md
blob: f13943fbbe0b55dd270e544817107eb0674cdc0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# DTail Turbo Boost Optimization

## Overview

This document describes the turbo boost optimization feature that provides significant performance improvements for DTail operations by using channel-less processing and optimized I/O.

## Problem Statement

The original dgrep implementation used multiple channels in a pipeline:
- `rawLines chan *bytes.Buffer` (buffer: 100) - Raw lines read from file
- `lines chan *line.Line` (buffer: 100) - Filtered lines to send to client

This created several performance issues:
1. Fixed channel buffer sizes causing blocking under high throughput
2. Context switching overhead between goroutines
3. Channel synchronization overhead
4. Memory allocations for channel operations

## Solution

The channel-less implementation replaces the channel pipeline with direct function calls using a `LineProcessor` interface.

### Key Components

1. **LineProcessor Interface** (`internal/io/line/processor.go`)
   - Defines methods for processing lines without channels
   - `ProcessLine()` - Handle a single line
   - `Flush()` - Ensure buffered data is written
   - `Close()` - Clean up resources

2. **GrepLineProcessor** (`internal/server/handlers/lineprocessor.go`)
   - Implements LineProcessor for grep operations
   - Writes directly to the network connection
   - Uses internal buffering for efficiency (64KB buffer)
   - Thread-safe with mutex protection

3. **Modified File Reading** (`internal/io/fs/readfile_processor.go`)
   - `StartWithProcessor()` - Channel-less file reading
   - Direct callbacks instead of channel sends
   - Inline regex filtering without goroutines

4. **Optimized File Reading** (`internal/io/fs/readfile_processor_optimized.go`)
   - Uses buffered line reading instead of byte-by-byte
   - Custom scanner with 256KB buffer
   - Efficient handling of long lines
   - Special optimization for tail mode

### Feature Flags

The implementation can be controlled via environment variables:
- `DTAIL_CHANNELLESS_GREP=yes` - Enable channel-less grep implementation
- `DTAIL_OPTIMIZED_READER=yes` - Use optimized buffered reader

### Benefits

1. **Reduced Latency**: No channel queuing delays
2. **Lower Memory Usage**: No channel buffers
3. **Better CPU Efficiency**: Fewer context switches
4. **Simpler Code Flow**: Direct processing without goroutine coordination
5. **Predictable Performance**: No channel blocking

### Backward Compatibility

- Original channel-based implementation remains available
- Same command-line interface
- Protocol compatibility maintained
- All integration tests pass unchanged

### Performance Testing

Use the provided script to compare performance:

```bash
./test_channelless_performance.sh
```

This will test:
1. Original channel-based implementation
2. Channel-less implementation
3. Optimized channel-less implementation

### Usage

To use the channel-less implementation:

```bash
# Enable channel-less grep
export DTAIL_CHANNELLESS_GREP=yes

# Also enable optimized reader
export DTAIL_OPTIMIZED_READER=yes

# Run dgrep normally
dgrep -regex "pattern" file.log
```

### Future Improvements

1. Extend channel-less approach to other commands (dcat, dtail)
2. Add configurable buffer sizes
3. Implement zero-copy optimizations
4. Add performance metrics collection
5. Consider using io_uring on Linux for async I/O

## Usage

To enable turbo boost optimizations:

```bash
export DTAIL_TURBOBOOST_ENABLE=yes
```

This enables:
- Channel-less implementation for grep and cat operations
- Optimized buffered I/O reader (256KB buffer)
- Buffer pooling to reduce memory allocations

The turbo boost mode is designed to be extended to other DTail commands in the future.