Giới hạn băng thông VPS OpenVZ

Ở bài viết này, VinaHost hướng dẫn bạn cách giới hạn băng thông VPS OpenVZ.
1. Giới thiệu về TC
TC là một công cụ quản lý băng thông mạnh trên nền tảng Linux, tất cả các hệ điều hành Linux nói chung sử dụng kernel 2.2 trở lên đều được tích hợp sẵn công cụ này.
Trên mỗi thiết bị có một cơ chế hàng đợi, cơ chế hàng đợi quyết định cách xử lý gói tin, nó sử dụng bộ lọc để phân gói tin vào các lớp, các gói tin trong một lớp có thể được phân vào các lớp nhỏ hơn là con của lớp này. Một lớp không có lớp con là lớp lá, mỗi lớp lá dùng một cơ chế hàng đợi để quản lý các gói tin được phân vào nó. Các gói tin trong một lớp sẽ được cơ chế hàng đợi đối xử như nhau và các gói tin thuộc các lớp khác nhau sẽ được đối xử khác nhau tùy vào mức ưu tiên của chúng, đây là cơ chế hoạt động của TC.
TC bao gồm các thành phần sau: qdiscs, filter, class và policy.
  • Qdiscs: Cơ chế hàng đợi quyết định cách xử lý, điều khiển gói tin. Các loại cơ chế hàng đợi được hỗ trợ trong Linux: Class Based Queue (CBQ). Token Bucket Flow (TBF). First in First out (FIFO). Asynchronous Transfer Mode (ATM). Random Early Detection (RED). Generalized RED (GRED). DiffServ Marked (DS_MARK).
  • Filter: Dùng cơ chế hàng đợi để gán các gói tin nhận được tới lớp của nó. Bộ lọc sử dụng đặc tính khác nhau của gói tin như địa chỉ nguồn, địa chỉ đích, port và byte ToS trong phần đầu của IP header để phân lớp ví dụ như sử dụng module u32 của iptables dựa trên trường header của gói tin để đánh dấu gói tin.
  • Class: Sử dụng cơ chế hàng đợi để lưu trữ gói tin, mỗi loại gói tin sau khi được filter sẽ phân vào một class được định nghĩa trước. Thông thường mỗi class có một hàng đợi và xử lý riêng, 1 hàng đợi có thể được chia sẽ cho nhiều lớp. Có 2 dạng class là qdiscs classful và qdiscs classless, qdiscs classful cho phép tạo nhiều qdiscs trong class còn classless thì không.
  • Policy: Thiết lập các chính sách cho từng class, đảm bảo chắc chắn lưu lượng không vượt quá giới hạn được thiết lập.
2. Giới hạn băng thông trên VPS OpenVZ
Dựa vào đường đi traffic của VPS OpenVZ, bạn có thể xác định tên device cần áp dụng quy tắc cấu hình:
                                     venet0:0               venet0          eth0
Chiều Out                 CT >------------->-------------> Node >--------->--------> Internet
                                      venet0:0              venet0           eth0
Chiều In                   CT <-------------<-------------< Node <---------<--------< Internet
+ Đứng trên Node băng thông chiều Out sẽ áp lên eth0 và chiều in sẽ là venet0.
Giới hạn băng thông chiều in sử dụng HTB (Hierarchical Token Bucket http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm)
+ HTB rất uyển chuyển trong việc giới hạn băng thông, có thể fix cứng băng thông cho từng class:
+ Cấu hình trên Node:
Tạo file bash shell limit_bandwidth với nội dung sau:
# IP của các VPS bị giới hạn băng thông
CT_IP1=$1
CT_IP2=$2
#tên device sử dụng
DEV=venet0
# xóa toàn bộ cấu hình qdiscs tồn tại card venet0
tc qdisc del dev $DEV root
# set venet0 là root và tên của root là 1: và class mặc định là 1:10
tc qdisc add dev $DEV root handle 1: htb default 10
# tạo class con 1:1 là con của class 1:1 và giới hạn tốc độ không quá 1Gb/s (cấu hình cho node line 1Gb/s)
tc class add dev $DEV parent 1: classid 1:1 htb rate 100mbit burst 15k
# tạo các class con giới hạn từng mức băng thông 100M, 200M 
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 100mbit ceil 100mbit burst 15k
tc class add dev $DEV parent 1:1 classid 1:20 htb rate 200mbit ceil 200mbit burst 15k
# sử dụng sfq với cơ chế round-robin để điều khiển các luồng traffic, được tác giả của HTB là ông Martin Devera khuyến khích dùng
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
# Phân loại traffic của từng VPS dùng module u32 dựa vào IP đích cho vào từng class tưng ứng
if [ ! -z $CT_IP1 ]; then
tc filter add dev $DEV protocol ip parent 1:1 prio 1 u32 match ip dst "$CT_IP1" flowid 1:10 
fi
if [ ! -z $CT_IP2 ]; then
tc filter add dev $DEV protocol ip parent 1:1 prio 1 u32 match ip dst "$CT_IP2" flowid 1:20 
fi
#
echo;echo "tc configuration for $DEV:"
tc qdisc show dev $DEV
tc class show dev $DEV
tc filter show dev $DEV
Giới hạn băng thông chiều out sử dụng HTB
+ Cấu hình tương tự, khác nhau về device và filter dựa vào source IP VPS.
+ Cấu hình:
# IP của các VPS bị giới hạn băng thông
CT_IP1=$1
CT_IP2=$2
#tên device sử dụng
DEV=eth0
# xóa toàn bộ cấu hình qdiscs tồn tại card eth0
tc qdisc del dev $DEV root
# set eth00 là root và tên của root là 1: và class mặc định là 1:10
tc qdisc add dev $DEV root handle 1: htb default 10
# tạo class con 1:1 là con của class 1:1 và giới hạn tốc độ không quá 1Gb/s (cấu hình cho node line 1Gb/s)
tc class add dev $DEV parent 1: classid 1:1 htb rate 100mbit burst 15k
# tạo các class con giới hạn từng mức băng thông 100M, 200M 
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 100mbit ceil 100mbit burst 15k
tc class add dev $DEV parent 1:1 classid 1:20 htb rate 200mbit ceil 200mbit burst 15k
# sử dụng sfq với cơ chế round-robin để điều khiển các luồng traffic
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
# Phân loại traffic của từng VPS dùng module u32 dựa vào IP đích cho vào từng class tưng ứng
if [ ! -z $CT_IP1 ]; then
tc filter add dev $DEV protocol ip parent 1:1 prio 1 u32 match ip dst "$CT_IP1" flowid 1:10 
fi
if [ ! -z $CT_IP2 ]; then
tc filter add dev $DEV protocol ip parent 1:1 prio 1 u32 match ip dst "$CT_IP2" flowid 1:20 
fi
#
echo;echo "tc configuration for $DEV:"
tc qdisc show dev $DEV
tc class show dev $DEV
tc filter show dev $DEV 
Chúc bạn thành công!

Powered by WHMCompleteSolution