Files
v-hono/usockets/README.md
T

219 lines
5.2 KiB
Markdown

# uSockets Backend for V-Hono
High-performance server backend using [uSockets](https://github.com/uNetworking/uSockets) library.
## High Concurrency Performance
The included `libusockets_full.a` has been optimized with **backlog=16384** to support high concurrency:
| Concurrent | RPS | Success Rate |
|------------|-----|--------------|
| 4,000 | 112,614 | 100% |
| 6,000 | 56,728 | 100% |
| 8,000 | 33,255 | 100% |
| 10,000 | 25,964 | 100% |
### System Requirements
For 10,000+ concurrent connections:
```bash
# macOS
sudo sysctl -w kern.ipc.somaxconn=8192
ulimit -n 65535
# Linux
sudo sysctl -w net.core.somaxconn=8192
ulimit -n 65535
```
## Performance
Based on benchmark tests (200 connections, 100K requests):
| Backend | RPS | Avg Latency | P95 | P99 |
|---------|-----|-------------|-----|-----|
| uSockets | ~22,000 | 8.75ms | 16.66ms | 25.73ms |
| picoev | ~15,000 | 13.36ms | 18.89ms | 31.66ms |
**uSockets provides ~50% higher throughput under high concurrency.**
## Usage
```v
import meiseayoung.hono
fn main() {
mut app := hono.Hono.new()
app.get('/', fn (mut c hono.Context) http.Response {
return c.text('Hello from uSockets!')
})
// Use uSockets backend
app.listen_usockets(3000)
}
```
## Build Command
```bash
# macOS / Linux
v -enable-globals -prod -o app your_app.v
./app
# Windows (must use gcc, tcc does not support .a static library format)
v -enable-globals -cc gcc -ldflags "-ldbghelp" -o app.exe your_app.v
.\app.exe
```
**Required flags:**
- `-enable-globals` - Required for uSockets global state
- `-cc gcc` - Use GCC compiler (MinGW-w64 on Windows, required because V's default compiler tcc does not support MinGW `.a` static library format)
- `-ldflags "-ldbghelp"` - Required on Windows for libuv linking
## Pre-compiled Libraries
The uSockets library and libuv are pre-compiled and included in the `lib/{platform}/` directory:
- `lib/windows/` - Windows x64
- `lib/linux/` - Linux x64
- `lib/macos-arm64/` - macOS Apple Silicon
- `lib/macos-x64/` - macOS Intel
## Directory Structure
```
usockets/
├── include/ # Header files
│ ├── libusockets.h # uSockets API
│ ├── uv.h # libuv API
│ └── uv/ # libuv headers
├── lib/ # Pre-compiled libraries
│ ├── windows/ # Windows x64
│ ├── linux/ # Linux x64
│ ├── macos-arm64/ # macOS Apple Silicon
│ └── macos-x64/ # macOS Intel
├── src/ # Modified source files
│ └── bsd.c # Modified with backlog=16384
├── build.sh # Build script
├── usockets.v # V bindings
└── README.md # This file
```
## Configuration
```v
// Custom configuration
app.listen_usockets_with_config(meiseayoung.hono.UsocketsConfig{
port: 8080
host: '0.0.0.0'
keepalive_timeout: 30
max_keepalive_req: 10000
})
```
## Building uSockets Library from Source
If you need to rebuild the uSockets library (e.g., for a different platform or custom modifications), use the provided build script.
### Build Prerequisites
- **Git** - For cloning source repositories
- **GCC** - C compiler
- **CMake** - For building libuv
- **ar** - Archive tool (included with GCC)
#### Installing Prerequisites
**macOS:**
```bash
xcode-select --install
brew install cmake
```
**Linux (Ubuntu/Debian):**
```bash
sudo apt update
sudo apt install build-essential cmake git
```
**Linux (CentOS/RHEL):**
```bash
sudo yum groupinstall "Development Tools"
sudo yum install cmake git
```
**Windows (Git Bash/MSYS2):**
```powershell
# Install via Scoop
scoop install mingw cmake git
# Or via Chocolatey
choco install mingw cmake git
```
### Running the Build Script
```bash
cd usockets
chmod +x build.sh
./build.sh
```
The script will:
1. Clone uSockets and libuv repositories to `/tmp/`
2. Apply the backlog=16384 modification for high concurrency
3. Compile libuv as a static library
4. Compile uSockets with libuv support
5. Merge both libraries into `libusockets_full.a`
6. Output to the appropriate `lib/{platform}/` directory
### Build Script Details
The build script (`build.sh`) automatically:
- Detects your operating system (Windows/macOS/Linux)
- Detects CPU architecture (x64/arm64 on macOS)
- Applies the backlog modification from `src/bsd.c`
- Compiles with optimizations (`-O3`)
- Creates a merged static library containing both uSockets and libuv
### Custom Modifications
To customize the build:
1. **Change backlog size**: Edit `src/bsd.c` and modify the `listen()` call
2. **Enable SSL**: Remove `-DLIBUS_NO_SSL` from the build script and link OpenSSL
3. **Use different event loop**: Modify `-DLIBUS_USE_LIBUV` flag
### Troubleshooting Build Issues
**CMake not found:**
```bash
# macOS
brew install cmake
# Linux
sudo apt install cmake # or sudo yum install cmake
# Windows
scoop install cmake
```
**GCC not found (Windows):**
```powershell
scoop install mingw
# Make sure MinGW bin directory is in PATH
```
**Permission denied:**
```bash
chmod +x build.sh
```
## Notes
- On Windows, uSockets and picoev have similar performance
- On Linux, uSockets may have greater advantages due to epoll optimization
- uSockets excels under high concurrency (200+ connections)