Hiểm họa trong môi trường đa người dùng: Hiện tượng noisy neighbor và cạn kiệt nhân
Trong hạ tầng truy cập từ xa của doanh nghiệp, các nút biên đám mây và cổng tập trung đường hầm mạng viễn thông, việc triển khai nhiều khối lượng công việc của các tổ chức khác nhau trên cùng một máy chủ vật lý là giải pháp vận hành kinh tế và phổ biến. Một máy chủ duy nhất thường điều phối hàng trăm đường hầm kết nối của khách hàng, các dịch vụ proxy phân tách vi mô và các tiến trình cổng mã hóa hoạt động đồng thời.
Tuy nhiên, việc vận hành các kiến trúc VPN đa người dùng (multi-tenant) nếu thiếu đi cơ chế cô lập tài nguyên cấp thấp và chặt chẽ sẽ dẫn đến những rủi ro nghiêm trọng cho toàn bộ hệ thống:
- Cạn kiệt bộ nhớ socket trong nhân hệ điều hành: Các socket mạng cấp phát bộ nhớ nhân thông qua trình phân bổ slab allocator (
skbuff_head_cache). Một phân vùng khách hàng bị lỗi lặp gói tin nội bộ hoặc hứng chịu đợt tấn công từ chối dịch vụ (DDoS) có thể ngốn hàng gigabyte bộ nhớ đệm nhân không thể hoán vị (sk_rmem_alloc). Khi không có sự giới hạn, tình trạng này sẽ kích hoạt cơ chế Out-Of-Memory (OOM) toàn cục, đánh sập toàn bộ các đường hầm của những khách hàng khác trên máy chủ. - Nghẽn CPU do thuật toán giải mã chiếm dụng tài nguyên: Các quy trình giải mã đối xứng (như ChaCha20-Poly1305 hay AES-256-GCM) tiêu tốn rất nhiều chu kỳ xử lý của CPU. Khi một khách hàng phát sinh lượng truy cập ồ ạt và chiếm dụng mọi luồng CPU khả dụng để xử lý bắt tay mật mã, việc chuyển tiếp gói tin của các bên thuê lân cận sẽ bị tắc nghẽn, gây ra độ trễ đột biến lên tới hàng chục mili-giây.
- Tranh chấp hàng đợi gói tin trên card mạng: Nhiều socket cùng cạnh tranh hàng đợi phần cứng trên card mạng (NIC) có thể làm tràn bộ đệm truyền phát, dẫn đến hiện tượng rớt gói tin ngẫu nhiên trên toàn bộ giao diện máy chủ.
Mặc dù hệ thống cgroups v1 trước đây đã cung cấp một số cơ chế kiểm soát sơ khai, nhưng thiết kế đa cây phân mảnh của nó gặp trở ngại lớn về việc quy trách nhiệm tài nguyên, không theo dõi được bộ nhớ nhân và gây độ trễ đồng bộ hóa cao. Ngược lại, kiến trúc phân cấp hợp nhất Control Groups v2 (cgroups v2) hiện đại trên Linux mang lại khả năng cô lập tất định và bảo vệ tài nguyên toàn diện.
Khám phá cgroups v2: Kiến trúc phân cấp hợp nhất
Được hoàn thiện từ các phiên bản nhân Linux 4.5 đến 6.x, cgroups v2 thay thế hoàn toàn cấu trúc cây phân tán của phiên bản v1 bằng một hệ thống phân cấp tiến trình thống nhất duy nhất có gốc tại /sys/fs/cgroup.
+-------------------------------------------------------------------------+
| Gốc phân cấp hợp nhất cgroups v2 (/sys/fs/cgroup) |
+-------------------------------------------------------------------------+
|
+-----------------------------+-----------------------------+
| cgroup.subtree_control = "+cpu +memory +io" |
v v
+-------------------------------+ +-------------------------------+
| Phân vùng: Khách hàng Alpha | | Phân vùng: Khách hàng Beta |
| /sys/fs/cgroup/vpn/tenant_a | | /sys/fs/cgroup/vpn/tenant_b |
+-------------------------------+ +-------------------------------+
| - cpu.max = 200000 100000 | | - cpu.max = 100000 100000 |
| (Giới hạn tối đa: 2 lõi CPU)| | (Giới hạn tối đa: 1 lõi CPU)|
| - memory.high = 2G | | - memory.high = 1G |
| - memory.max = 3G | | - memory.max = 1.5G |
| - eBPF cgroup_skb ingress | | - eBPF cgroup_skb ingress |
| - eBPF cgroup_skb egress | | - eBPF cgroup_skb egress |
+-------------------------------+ +-------------------------------+
| |
v Các tiến trình gán vào v Các tiến trình gán vào
+-------------------------------+ +-------------------------------+
| tun_worker_a (PID 14210) | | tun_worker_b (PID 14502) |
| crypto_a (PID 14211) | | crypto_b (PID 14503) |
+-------------------------------+ +-------------------------------+
Nguyên tắc "Không chứa tiến trình nội bộ"
Điểm cải tiến mang tính nền tảng của cgroups v2 là quy tắc nghiêm ngặt: các nhóm điều khiển không phải nút lá thì không được phép đồng thời chứa tiến trình thành viên và các nhóm con. Chỉ các nhóm nút lá mới có thể chứa các ID tiến trình hoạt động (cgroup.procs). Quy tắc này xóa bỏ tình trạng phân bổ tài nguyên mập mờ và đảm bảo việc lập lịch phân cấp diễn ra nhất quán.
Để kích hoạt bộ điều khiển tài nguyên cho các phân vùng con, tiến trình quản trị ghi danh sách bộ điều khiển vào tệp cgroup.subtree_control:
# Kích hoạt bộ điều khiển CPU, bộ nhớ và I/O cho các phân vùng VPN
echo "+cpu +memory +io" > /sys/fs/cgroup/vpn/cgroup.subtree_control
Kế toán bộ nhớ socket và cơ chế thu hồi trang nhớ
Một bước tiến đột phá của cgroups v2 nằm ở việc tích hợp giám sát bộ nhớ nhân hoàn chỉnh. Ở cgroups v1, các vùng đệm socket mạng (struct sock và struct sk_buff) hoàn toàn vô hình trước các giới hạn bộ nhớ nếu không áp dụng các bản vá nhân phức tạp. Trong cgroups v2, mọi khoản phân bổ vùng đệm socket khởi tạo bởi tiến trình bên trong cgroup đều được tính trực tiếp vào tổng mức sử dụng bộ nhớ của nhóm đó.
Phòng vệ nhiều lớp qua memory.high và memory.max
Bộ điều khiển bộ nhớ cung cấp chiến lược phòng vệ đa tầng nhằm ngăn chặn việc sử dụng bộ nhớ mất kiểm soát:
memory.min(Bảo đảm cứng): Bộ nhớ nằm dưới ngưỡng này sẽ không bao giờ bị thu hồi khi hệ thống gặp áp lực bộ nhớ toàn cục.memory.low(Bảo đảm ưu tiên): Bộ nhớ dưới ngưỡng này được bảo vệ tối đa khỏi việc thu hồi, trừ khi không còn nguồn thu hồi nào khác.memory.high(Ngưỡng điều tiết): Khi tổng bộ nhớ của một phân vùng khách hàng (bao gồm toàn bộ vùng đệm hầm UDP/TCP) vượt quámemory.high, nhân không hề gọi trình tiêu diệt tiến trình OOM sát phạt. Thay vào đó, nhân sẽ làm chậm tiến trình đó mỗi khi trả về từ lời gọi hệ thống và kích hoạt quy trình thu hồi trang nhớ bất đồng bộ một cách quyết liệt.memory.max(Giới hạn trần tuyệt đối): Nếu bộ nhớ chạm đến mức trần tuyệt đối này và việc thu hồi thất bại, chỉ duy nhất các tiến trình bên trong phân vùng vi phạm mới bị OOM killer xử lý, giữ sự an toàn và ổn định cho các phân vùng khách hàng khác trên gateway.
# Thiết lập các ngưỡng phòng thủ cho phân vùng VPN 2 GB
mkdir -p /sys/fs/cgroup/vpn/tenant_alpha
echo "512M" > /sys/fs/cgroup/vpn/tenant_alpha/memory.min
echo "2G" > /sys/fs/cgroup/vpn/tenant_alpha/memory.high
echo "3G" > /sys/fs/cgroup/vpn/tenant_alpha/memory.max
Điều tiết lưu lượng mạng bằng chương trình eBPF cgroup_skb
Trên các hệ thống truyền thống, việc định hình lưu lượng mạng giữa các dịch vụ dùng chung máy chủ đòi hỏi cấu hình các hàng đợi phức tạp của Traffic Control (tc) gắn vào các giao diện cầu nối phần mềm. Trong môi trường Linux hiện đại, cgroups v2 kết nối trực tiếp với eBPF thông qua loại chương trình BPF_PROG_TYPE_CGROUP_SKB.
Người quản trị có thể gắn các bộ lọc eBPF trực tiếp vào bất kỳ thư mục cgroup nào bằng các điểm móc BPF_CGROUP_INET_INGRESS và BPF_CGROUP_INET_EGRESS. Mọi socket do tiến trình trong cgroup đó tạo ra đều tự động thừa hưởng bộ lọc gói tin, bất kể socket giao tiếp qua giao diện mạng hay không gian tên nào.
// Ví dụ chương trình eBPF cgroup_skb điều tiết tốc độ lưu lượng đi
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__type(key, __u32);
__type(value, __u64); // Lưu trữ số lượng thẻ token
__uint(max_entries, 1);
} token_bucket SEC(".maps");
SEC("cgroup_skb/egress")
int throttle_tenant_egress(struct __sk_buff *skb)
{
__u32 key = 0;
__u64 *tokens = bpf_map_lookup_elem(&token_bucket, &key);
if (!tokens)
return 1; // Cho phép gói đi nếu không tìm thấy bản đồ
// So sánh độ dài gói tin với số lượng token khả dụng
if (skb->len > *tokens) {
// Vượt quá hạn mức băng thông cho phép; hủy bỏ gói tin
return 0;
}
*tokens -= skb->len;
return 1; // Cho phép truyền gói tin
}
char _license[] SEC("license") = "GPL";
Việc gắn chương trình này vào nút cgroup của khách hàng giúp thực thi việc giới hạn băng thông ở tốc độ truyền tải cao ngay trong nhân mà không phát sinh độ trễ chuyển đổi ngữ cảnh ra không gian người dùng.
Tối ưu hóa bảo vệ phân vùng đa người dùng trên RiceGuard
Trong cơ sở hạ tầng gateway phân tán viễn thông của VPNRice, động cơ chuyên dụng RiceGuard khai thác cgroups v2 để thực thi phân vùng mạng biệt lập và công bằng cho nhiều khách hàng trên các cụm máy chủ doanh nghiệp.
Tài nguyên máy chủ vật lý (64 lõi CPU, 256 GB RAM, 2 cổng 100GbE)
|
v
+-------------------------------------------------------------------+
| Bộ quản lý phân vùng RiceGuard cgroups v2 |
+-------------------------------------------------------------------+
| |
v Phân vùng Alpha (Hạng Vàng) v Phân vùng Beta (Hạng Bạc)
+-----------------------------+ +-----------------------------+
| - cpu.weight: 200 | | - cpu.weight: 50 |
| - cpu.max: 800000 100000 | | - cpu.max: 200000 100000 |
| - memory.min: 4G | | - memory.min: 1G |
| - memory.high: 16G | | - memory.high: 4G |
| - eBPF Tốc độ vào: 10Gbps | | - eBPF Tốc độ vào: 2Gbps |
+-----------------------------+ +-----------------------------+
| |
v v
Không tràn tài nguyên lân cận Không tràn tài nguyên lân cận
1. Lập lịch phân bổ CPU hoàn toàn biệt lập
RiceGuard điều phối công việc của các đối tượng khách hàng bằng cách kết hợp cpu.weight (tỷ trọng chia sẻ công bằng khi CPU bận) với cpu.max (hạn mức băng thông cứng theo bộ lập lịch CFS). Các phân vùng khách hàng doanh nghiệp ưu tiên cao nhận được trọng số lớn hơn, đảm bảo các luồng xử lý mã hóa luôn có đủ tài nguyên CPU ngay cả trong những đợt bùng nổ lưu lượng trên toàn hệ thống.
2. Giám sát áp lực bộ nhớ không dùng khóa
Thay vì dựa vào các tiến trình giám sát định kỳ ở không gian người dùng gây tốn kém tài nguyên, RiceGuard tích hợp trực tiếp với cơ chế Pressure Stall Information (PSI) của Linux trong từng cgroup (/sys/fs/cgroup/vpn/<tenant>/memory.pressure). Khi thông số áp lực bộ nhớ báo hiệu nguy cơ quá tải hàng đợi, hệ thống sẽ tự động gửi tín hiệu điều tiết cửa sổ UDP của máy khách, triệt tiêu nguy cơ ứ đọng gói tin trước khi hiện tượng rớt gói xảy ra.
3. Kết hợp cách ly không gian tên mạng
RiceGuard kết hợp chặt chẽ việc quản lý tài nguyên của cgroups v2 với các không gian tên mạng Linux network namespace chuyên biệt. Mọi socket mạng do các tiến trình thuê tạo ra đều bị giới hạn trong bảng định tuyến riêng biệt của từng khách hàng. Đi kèm với bộ lọc eBPF cgroup, kiến trúc này ngăn chặn tuyệt đối việc rò rỉ gói tin chưa mã hóa ra bên ngoài ranh giới được chỉ định, đảm bảo quyền riêng tư tuyệt đối, chất lượng dịch vụ cam kết và độ ổn định bền vững dưới tải trọng cao.



