Số lượng kết nối tối đa bị ảnh hưởng bởi các giới hạn nhất định ở cả hai phía máy khách và máy chủ, mặc dù có một chút khác biệt.
Về phía khách hàng:
Tăng phạm vi cổng ephermal và giảmtcp_fin_timeout
Để tìm ra các giá trị mặc định:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
Phạm vi cổng ephermal xác định số lượng ổ cắm ngoài tối đa mà máy chủ có thể tạo từ một địa chỉ IP cụ thể. Việc fin_timeout
xác định thời gian tối thiểu các ổ cắm này sẽ ở TIME_WAIT
trạng thái (không sử dụng được sau khi được sử dụng một lần). Mặc định hệ thống thông thường là:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Điều này về cơ bản có nghĩa là hệ thống của bạn không thể đảm bảo nhất quán nhiều hơn (61000 - 32768) / 60 = 470
ổ cắm mỗi giây. Nếu bạn không hài lòng với điều đó, bạn có thể bắt đầu với việc tăng port_range
. Thiết lập phạm vi 15000 61000
là khá phổ biến những ngày này. Bạn có thể tăng thêm tính khả dụng bằng cách giảm fin_timeout
. Giả sử bạn làm cả hai, bạn sẽ thấy hơn 1500 kết nối ra ngoài mỗi giây, dễ dàng hơn.
Để thay đổi các giá trị :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
Trên đây không nên được hiểu là các yếu tố ảnh hưởng đến khả năng hệ thống để thực hiện các kết nối ra ngoài mỗi giây. Nhưng thay vào đó, các yếu tố này ảnh hưởng đến khả năng xử lý các kết nối đồng thời của hệ thống một cách bền vững trong các "hoạt động" lớn.
Giá trị Sysctl mặc định trên hộp Linux điển hình cho tcp_tw_recycle
& tcp_tw_reuse
sẽ là
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Những thứ này không cho phép kết nối từ ổ cắm "đã sử dụng" (ở trạng thái chờ) và buộc các ổ cắm phải kéo dài time_wait
chu kỳ hoàn chỉnh . Tôi khuyên bạn nên cài đặt:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
Điều này cho phép đạp xe nhanh chóng trong time_wait
trạng thái và sử dụng lại chúng. Nhưng trước khi bạn thực hiện thay đổi này, hãy đảm bảo rằng điều này không xung đột với các giao thức mà bạn sẽ sử dụng cho ứng dụng cần các ổ cắm này. Đảm bảo đọc bài "Đối phó với TCP TIME-WAIT" từ Vincent Bernat để hiểu ý nghĩa này. Các net.ipv4.tcp_tw_recycle
tùy chọn là khá nhiều vấn đề cho các máy chủ dạng công khai vì nó sẽ không xử lý các kết nối từ hai máy tính khác nhau đằng sau thiết bị NAT cùng , mà là một vấn đề khó khăn để phát hiện và chờ đợi để cắn bạn. Lưu ý rằng net.ipv4.tcp_tw_recycle
đã bị xóa khỏi Linux 4.12.
Trên Server Side:
Các net.core.somaxconn
giá trị có vai trò quan trọng. Nó giới hạn số lượng yêu cầu tối đa được xếp hàng vào một ổ cắm nghe. Nếu bạn chắc chắn về khả năng của ứng dụng máy chủ của mình, hãy nâng nó từ 128 mặc định lên 128 đến 1024. Bây giờ bạn có thể tận dụng mức tăng này bằng cách sửa đổi biến nghe tồn đọng trong cuộc gọi nghe của ứng dụng, thành số nguyên bằng hoặc cao hơn.
sysctl net.core.somaxconn=1024
txqueuelen
tham số của thẻ ethernet của bạn cũng có vai trò. Giá trị mặc định là 1000, vì vậy hãy nâng chúng lên tới 5000 hoặc thậm chí nhiều hơn nếu hệ thống của bạn có thể xử lý nó.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Tương tự tăng giá trị cho net.core.netdev_max_backlog
và net.ipv4.tcp_max_syn_backlog
. Giá trị mặc định của chúng lần lượt là 1000 và 1024.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
Bây giờ hãy nhớ bắt đầu cả ứng dụng phía máy khách và máy chủ của bạn bằng cách tăng các ulimts FD, trong shell.
Bên cạnh một kỹ thuật phổ biến hơn được các lập trình viên sử dụng là giảm số lượng cuộc gọi ghi tcp . Sở thích của tôi là sử dụng bộ đệm trong đó tôi đẩy dữ liệu tôi muốn gửi cho khách hàng, và sau đó tại các điểm thích hợp tôi ghi dữ liệu được đệm vào ổ cắm thực tế. Kỹ thuật này cho phép tôi sử dụng các gói dữ liệu lớn, giảm phân mảnh, giảm mức sử dụng CPU của tôi cả ở vùng đất người dùng và ở cấp độ kernel.