Cuộc khủng hoảng băng thông lúc 2 giờ sáng
Lúc đó là 2 giờ sáng thứ Ba, các cảnh báo giám sát mạng bắt đầu kêu inh ỏi. Đường truyền WAN của tôi bị chiếm dụng 100%, và độ trễ trên Discord vọt từ 20ms êm ái lên tới 400ms đầy giật lag.
Tôi kiểm tra router: ba chiếc máy tính khác nhau trong nhà đang tranh giành băng thông để tải bản cập nhật Call of Duty nặng tới 120GB. Gói cước 100Mbps từ nhà mạng (ISP) hoàn toàn không có cơ hội. Đây là nút thắt cổ chai kinh điển mà bất kỳ ai đam mê HomeLab cuối cùng cũng sẽ gặp phải—khoảng cách gây ức chế giữa tốc độ mạng LAN 1Gbps (hoặc 10Gbps) và đường ống hạn hẹp ra thế giới bên ngoài.
Từ kinh nghiệm thực tế của tôi, đây là một trong những kỹ năng thiết yếu cần làm chủ. Nếu bạn đang chạy nhiều PC, console hoặc máy ảo, việc tải cùng một file ISO Ubuntu 5GB hoặc game Steam 100GB nhiều lần là một sự lãng phí thời gian và tiền bạc. LanCache giải quyết vấn đề này bằng cách hoạt động như một proxy lưu trữ (caching proxy) trong suốt. Lần đầu tiên một file được yêu cầu, nó sẽ được tải từ internet và lưu trên server của bạn. Mọi yêu cầu tiếp theo từ bất kỳ máy nào trong mạng sẽ được phục vụ với tốc độ của phần cứng nội bộ.
Bối cảnh & Lý do: Tại sao HomeLab của bạn cần một Cache
Việc chơi game và quản lý hệ điều hành hiện đại ngày càng trở nên “khó thở” với internet tốc độ chậm. Giữa Steam, Epic Games, Windows Update và các bản phân phối Linux, một tuần thông thường có thể dễ dàng chứng kiến nửa terabyte dữ liệu dư thừa đi qua gateway của bạn. LanCache (cụ thể là dự án lancachenet/monolithic) nhắm vào lưu lượng CDN cụ thể—như Valve, Microsoft và Apple—để cache các phân đoạn dữ liệu mà họ cung cấp qua HTTP.
Tại sao không sử dụng một Squid proxy thông thường? Bởi vì nhiều dịch vụ này sử dụng các yêu cầu dải (range requests) phức tạp và các header đặc thù mà một proxy tiêu chuẩn có thể bỏ qua. LanCache được cấu hình sẵn để xử lý các đặc điểm riêng biệt của các trình khởi chạy game (launchers) và cập nhật hệ thống ngay khi cài đặt. Bằng cách chuyển hướng các truy vấn DNS đến container LanCache, các máy khách (clients) thậm chí không biết họ đang giao tiếp với một server nội bộ; họ chỉ thấy thanh tốc độ tải nhảy vọt lên mức 110MB/s.
Cài đặt: Triển khai LanCache qua Docker
Tôi ưu tiên sử dụng Docker Compose cho việc này vì nó cho phép quản lý các dịch vụ DNS và Cache như một khối thống nhất. Bạn sẽ cần một máy tính có dung lượng lưu trữ ổn—tôi khuyên dùng ít nhất 1TB nếu bạn dự định cache nhiều hơn hai hoặc ba tựa game AAA.
1. Chuẩn bị lưu trữ
Đảm bảo thư mục cache của bạn có quyền hạn chính xác. Tôi thường mount một ổ SSD chuyên dụng hoặc một mảng HDD tốc độ cao vào /mnt/cache.
sudo mkdir -p /mnt/cache/data /mnt/cache/logs
sudo chown -R 1000:1000 /mnt/cache
2. File Docker Compose
Tạo một thư mục cho cấu hình của bạn và tạo file docker-compose.yml này. Thay thế LANCACHE_IP bằng IP tĩnh của server HomeLab của bạn.
version: '2'
services:
dns:
image: lancachenet/lancache-dns:latest
env_file: .env
restart: always
ports:
- ${LANCACHE_IP}:53:53/udp
- ${LANCACHE_IP}:53:53/tcp
sniproxy:
image: lancachenet/sniproxy:latest
env_file: .env
restart: always
ports:
- ${LANCACHE_IP}:443:443/tcp
monolithic:
image: lancachenet/monolithic:latest
env_file: .env
restart: always
ports:
- ${LANCACHE_IP}:80:80/tcp
volumes:
- /mnt/cache/data:/data/cache
- /mnt/cache/logs:/data/logs
Cấu hình: Tinh chỉnh môi trường
Điều kỳ diệu nằm ở file .env. Đây là nơi chúng ta xác định những gì cần cache và phân bổ bao nhiêu dung lượng. Nếu bạn cấu hình sai UPSTREAM_DNS, cả nhà bạn sẽ mất mạng, vì vậy hãy cẩn thận ở đây.
# Cấu hình file .env
LANCACHE_IP=192.168.1.50
DNS_BIND_IP=192.168.1.50
UPSTREAM_DNS=1.1.1.1
# Tinh chỉnh Cache
CACHE_DISK_SIZE=1000g
CACHE_INDEX_SIZE=500m
CACHE_MAX_AGE=3650d
# Tùy chọn: Các dịch vụ cụ thể cần cache
USE_GENERIC_CACHE=true
Tôi đặt CACHE_DISK_SIZE thấp hơn một chút so với dung lượng thực tế của ổ đĩa để tránh hệ điều hành bị nghẽn nếu ổ đầy. Khi đạt đến giới hạn, LanCache sử dụng thuật toán LRU (Least Recently Used) để xóa dữ liệu cũ. Điều này rất quan trọng—tôi đã thấy nhiều hệ thống bị sập vì không tính đến phần dung lượng dự phòng của hệ thống tệp (filesystem overhead).
Tích hợp mạng
Để hệ thống hoạt động, các máy khách cần sử dụng server LanCache làm nhà cung cấp DNS. Bạn có hai lựa chọn:
- Thủ công: Thay đổi cài đặt DNS trên PC chơi game của bạn thành
192.168.1.50. - Tự động: Cập nhật cài đặt DHCP trong router của bạn (pfSense, OPNsense, hoặc router mặc định của ISP) để cấp phát IP của LanCache làm server DNS chính.
Kiểm chứng & Giám sát: Nó có thực sự hoạt động không?
Sau khi khởi động các container bằng lệnh docker-compose up -d, tôi luôn kiểm tra log. Không có gì tệ hơn việc nghĩ rằng mình đang cache file nhưng thực tế mọi thứ đều bỏ qua server do sai lệch DNS.
1. Kiểm tra phân giải DNS
Từ một máy khách, hãy chạy lệnh nslookup đối với một CDN game đã biết:
nslookup steamcontent.com
Nếu kết quả trả về **IP LanCache nội bộ** của bạn (192.168.1.50) thay vì IP công khai của Valve, việc chuyển hướng đang hoạt động hoàn hảo.
2. Theo dõi Log của Cache
Đây là lúc bạn cảm thấy thỏa mãn. Hãy mở terminal và theo dõi (tail) log truy cập trong khi bạn bắt đầu tải xuống trên Steam:
docker logs -f monolithic
Hãy tìm các dòng TCP_HIT hoặc TCP_MISS. Một dòng TCP_MISS nghĩa là nó đang lấy dữ liệu từ internet (lần đầu tiên). Một dòng TCP_HIT nghĩa là nó đang phục vụ dữ liệu từ ổ đĩa nội bộ của bạn. Khi bạn thấy TCP_HIT và tốc độ tải Steam vọt lên trên 900Mbps, bạn sẽ thấy công sức xử lý sự cố lúc 2 giờ sáng là hoàn toàn xứng đáng.
3. Giám sát băng thông
Nếu bạn có một dashboard như Grafana (thứ mà tôi đã sử dụng trong các dự án HomeLab khác), bạn có thể giám sát giao diện mạng của container LanCache. Trong một lần cache hit, bạn sẽ thấy lưu lượng gửi đi từ container rất cao trong khi lưu lượng tải về từ WAN gần như bằng không. Thật tuyệt vời khi thấy ba chiếc PC cập nhật ở tốc độ tối đa trong khi internet bên ngoài hoàn toàn rảnh rỗi, để lại dư dả băng thông cho mọi người khác xem phim 4K hoặc chơi game mà không bị lag.
Việc thiết lập này đã biến HomeLab của tôi từ một server lưu trữ file đơn thuần thành một tài sản mạng hiệu suất cao. Không còn cảnh phải lên lịch tải xuống vào giữa đêm—chỉ cần nhấn ‘Update’ và để bộ nhớ cục bộ thực hiện phần việc nặng nhọc.

