Thứ Hai, 7 tháng 5, 2012

Điều chỉnh Network Stack của Linux (Buffers Size) để tăng hiệu suất mạng


Vấn đề

Tôi có 2 server được đặt ở 2 data center khác nhau. Cả 2 server đều có một lượng lớn các file truyền đồng thời. Nhưng hiệu suất mạng rất kém đối với các file lớn và hiệu suất bị giảm sút đối với các file lớn. Làm thế nào để điều chỉnh TCP trên Linux để giải quyết vấn đề này?

Giải pháp

Mặc định network stack của Linux không được cấu hình để có được tốc độ truyền tải cao với các file lớn qua kết nối WAN. Điều này là để tiết kiệm tài nguyên bộ nhớ. Bạn có thể dễ dàng điều chỉnh network stack bằng cách tăng network buffers size để tăng tốc mạng kết nối đến hệ thống server để xử lý nhiều network packet hơn.
Giá trị mặc định lớn nhất của Linux TCP buffer size thường là nhỏ. TCP memory được tính toán tự động dựa trên memory của hệ thống; bạn có thể tìm giá trị thực bằng cách gõ lệnh sau:
$ cat /proc/sys/net/ipv4/tcp_mem
Giá trị mặc định và giá trị tối đa của socket memory nhận:
$ cat /proc/sys/net/core/rmem_default
$ cat /proc/sys/net/core/rmem_max
Giá trị mặc định và giá trị tối đa của socket memory gửi:
$ cat /proc/sys/net/core/wmem_default
$ cat /proc/sys/net/core/wmem_max
Giá trị tối đa của tùy chọn bộ nhớ đệm:
$ cat /proc/sys/net/core/optmem_max

Điều chỉnh các giá trị

Thiết lập giá trị tối đa của send buffer size (wmem) và receice buffer size (rmem) thành 12 MB cho hàng đợi trên tất cả các giao thức. Nói cách khác là thiết lập lượng bộ nhớ để phân bổ cho mỗi TCP socket khi nó được mở hoặc được tạo ra khi truyền file:
WARNING! Giá trị mặc định của rmem_max và wmem_max là 128 KB trong hầu hết các bản phân phối Linux, giá trị này có thể đu cho môi trường mạng thông thường có độ trễ thấp hoặc cho các ứng dụng như DNS / Web server. Tuy nhiên, nếu độ trễ lớn, kích thước mặc định có thể là nhỏ. Chú ý rằng các thiết lập sau để tăng bộ nhớ sử dụng trên server.
# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf
# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
Bạn cũng cần thiết lập giá trị nhỏ nhất, giá trị khởi tạo, và giá trị lớn nhất trong bytes:
# echo 'net.ipv4.tcp_rmem= 10240 87380 12582912' >> /etc/sysctl.conf
# echo 'net.ipv4.tcp_wmem= 10240 87380 12582912' >> /etc/sysctl.conf
Bật window scaling có thể là một lựa chọn để mở rộng transfer window:
# echo 'net.ipv4.tcp_window_scaling = 1' >> /etc/sysctl.conf
Kích hoạt nhãn thời gian theo định nghĩa trong RFC1323:
# echo 'net.ipv4.tcp_timestamps = 1' >> /etc/sysctl.conf
Kích hoạt báo nhận ack:
# echo 'net.ipv4.tcp_sack = 1' >> /etc/sysctl.conf
Mặc định, TCP lưu lại rất nhiều số liệu kết nối trong bộ nhớ đệm định tuyến khi các kết nối đóng lại, bởi vậy các kết nối được thiết lập trong tương lai gần có thể sử dụng chúng để thiết lập điều kiện ban đầu.
Thông thường, điều này tăng hiệu năng tổng thể, nhưng có thể đôi khi là nguyên nhân giảm hiệu năng. Nếu thiết lập, TCP sẽ không cache dữ liệu khi đóng các kết nối.
# echo 'net.ipv4.tcp_no_metrics_save = 1' >> /etc/sysctl.conf
Thiết lập lượng packets tối đa, hàng đợi phía INPUT, khi interface nhận gói nhanh hơn kernel thì có thể thực hiện chúng.
# echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
Thực hiện reload để cập nhật các thay đổi:
# sysctl -p
Sử dụng tcpdump để xem các thay đổi với eth0:
# tcpdump -ni eth0

Không có nhận xét nào:

Đăng nhận xét