Tôi có kiến trúc mạng đơn giản/phổ biến nhất.
Máy chủ web nằm phía sau bộ định tuyến trên mạng cục bộ. Bộ định tuyến này thực hiện iptables DNAT để chuyển tiếp cổng tới máy chủ web.
Do đó, tôi có thể tải tệp từ máy chủ 1 về máy tính của mình qua internet.
Những câu hỏi của tôi
Điều chỉnh kernel thích hợp để đảm bảo rằng bộ định tuyến đang sử dụng hầu hết tiềm năng của nó (cho khoảng 2000 kết nối và thông lượng cao nhất) là gì? Tôi gặp sự cố ở ORANGE
Các tham số hạt nhân có ổn trên Máy chủ 1 không?
Bạn có thể giải thích tại sao tôi chỉ nhận được 3mbps từ Máy chủ 1 trong khi CPU và RAM không bị quá tải không? Vì vậy, bạn có thể thấy các vấn đề khác ngoài nhân Linux, CPU và RAM không? Bạn có thể liệt kê những vấn đề có thể để khám phá? Giao diện mạng 1gbps, cổng, v.v? 2x1.5ghz ARM định tuyến chậm? phiên bản iptables?
Hệ điều hành và tài nguyên
Máy tính - Mac OS 8 nhân CPU x86, RAM trống 16G/32G
Bộ định tuyến - Linux DD-WRT 2 lõi CPU ARM, RAM trống 270M/512M
Máy chủ 1 - Linux Ubuntu 18.04 4 lõi CPU x86, RAM trống 240M/32G (500M đổi sang SSD)
Máy chủ 2 - Linux Raspbian 1 lõi CPU ARM, RAM trống 95M/512M
MTU
mọi nơi 1500
TXQUEUELEN
mọi nơi 1000
giao thức
Tốc độ UDP vẫn ổn
Tốc độ TCP bị ảnh hưởng, bất kỳ cổng nào
phiên bản iptables
Bộ định tuyến - 1.3.7
Máy chủ 1 - 1.8.4
Máy chủ 2 - 1.6.0
Phiên bản Linux
Bộ định tuyến - 4.9.207
Máy chủ 1 - 5.4.0-67-chung
Máy chủ 2 - 4.14.79+
Tốc độ liên kết lý thuyết
Từ máy tính của tôi đến bộ định tuyến - 30mbps / 3,75 MB/s
Từ bộ định tuyến đến máy chủ web 1 - 1gbps
Từ bộ định tuyến đến máy chủ web 2 - 1gbps
Tốc độ tải xuống từ máy chủ web (tệp được lưu trữ trong RAM)
KIỂM TRA 1: Máy chủ 2 -> Bộ định tuyến = 800mbps
KIỂM TRA 2: Máy chủ 2 -> Máy tính = 30mbps
KIỂM TRA 3: Máy chủ 1 -> Bộ định tuyến = 800mbps
KIỂM TRA 4: Máy chủ 1 -> Máy tính sử dụng 15 kết nối = 15mbps
KIỂM TRA 5: Máy chủ 1 -> Máy tính = 3mbps (sự cố!)
Việc sử dụng CPU ở mức khoảng vài phần trăm trên mọi thiết bị. Tải trung bình của CPU là 0,0 lần trên tất cả các thiết bị, nhưng Máy chủ 1 - nó có mức tải trung bình là 4,6. Máy chủ 1 cũng xử lý khoảng 500-1000 kết nối cho những thứ khác ngoài thử nghiệm, nhưng với tốc độ khoảng 1mbps, do đó, nó không ảnh hưởng đáng kể đến thông lượng thử nghiệm (trừ khi những kết nối này bằng cách nào đó gián tiếp làm cho mọi thứ trở nên tồi tệ hơn).
Bất kể tải cao hơn, THỬ NGHIỆM 3 hoạt động rất tốt. Vậy nên vẫn khó trách Server 1.
Không có vấn đề gì trong dmesg
trên mọi thiết bị.
Suy nghĩ của tôi
Sự cố chỉ xuất hiện khi DNAT'ing trên bộ định tuyến và chỉ với Máy chủ 1 có số lượng kết nối khác cao (nhưng các kết nối này gần như không hoạt động nên không ảnh hưởng xấu đến mọi thứ?).
Thử nghiệm thú vị nhất để mô tả trong những suy nghĩ cuối cùng
Khi tôi tải xuống web đa luồng (THỬ NGHIỆM 4) Máy chủ 1 hoạt động tốt hơn nhiều.
Vì vậy, nó có khả năng đạt tốc độ tải xuống cao hơn. Nhưng tại sao 1 kết nối không thể đạt được tốc độ như nhiều kết nối?
Các thông số mà tôi đã khám phá
Bạn có thể thấy điều gì đó không được tối ưu hóa tốt cho bộ định tuyến Linux không?
net.core.wmem_max
- kích thước bộ nhớ đệm gửi ổ cắm tcp tối đa (tính bằng byte). Tăng bộ đệm đọc/ghi TCP để cho phép mở rộng kích thước cửa sổ lớn hơn. Các cửa sổ lớn hơn sẽ tăng lượng dữ liệu được truyền trước khi cần có xác nhận (ACK). Điều này làm giảm độ trễ tổng thể và dẫn đến tăng thông lượng.
Cài đặt này thường được đặt thành giá trị rất thận trọng là 262.144 byte. Bạn nên đặt giá trị này ở mức lớn nhất mà hạt nhân cho phép. Giá trị được sử dụng ở đây là 4.136.960 byte. Tuy nhiên, các nhân 4.x chấp nhận các giá trị trên 16MB.
Bộ định tuyến - 180224
Máy chủ 1 - 212992
Máy chủ 2 - 163840
Nơi nào khác được sử dụng - 83886080
net.core.wmem_default
Bộ định tuyến - 180224
Máy chủ 1 - 212992
Máy chủ 2 - 163840
Nơi nào khác được sử dụng - 83886080
net.ipv4.rmem_max
- ổ cắm tcp tối đa nhận kích thước bộ nhớ đệm (tính bằng byte)
Bộ định tuyến - 180224
Máy chủ 1 - 212992
Máy chủ 2 - 163840
Một nơi khác được sử dụng - 335544320
net.core.rmem_default
Bộ định tuyến - 180224
Máy chủ 1 - 212992
Máy chủ 2 - 163840
Một nơi khác được sử dụng - 335544320
net.ipv4.tcp_rmem
- Chứa ba giá trị đại diện cho kích thước tối thiểu, mặc định và tối đa của bộ đệm nhận ổ cắm TCP. Khuyến nghị là sử dụng giá trị tối đa là 16M byte hoặc cao hơn (phụ thuộc vào cấp độ hạt nhân), đặc biệt đối với bộ điều hợp 10 Gigabit.
Bộ định tuyến - 4096 87380 3776288
Máy chủ 1 - 4096 131072 6291456
Máy chủ 2 - 4096 87380 3515840
Nơi nào khác được sử dụng - 4096 87380 4136960 (IBM)
net.ipv4.tcp_wmem
- Tương tự như net.ipv4.tcp_rmem tham số này gồm 3 giá trị là giá trị nhỏ nhất, giá trị mặc định và giá trị lớn nhất. Khuyến nghị là sử dụng giá trị tối đa là 16M byte hoặc cao hơn (phụ thuộc vào cấp độ hạt nhân), đặc biệt đối với bộ điều hợp 10 Gigabit.
Bộ định tuyến - 4096 16384 3776288
Máy chủ 1 - 4096 16384 4194304
Máy chủ 2 - 4096 16384 3515840
Nơi nào khác được sử dụng - 4096 87380 4136960 (IBM)
net.ipv4.tcp_tw_reuse
- Trong môi trường có lưu lượng truy cập cao, ổ cắm được tạo và hủy với tốc độ rất cao. Tham số này, khi được đặt, cho phép các ổ cắm không còn cần thiết và sắp bị phá hủy được sử dụng cho các kết nối mới. Khi được bật, tham số này có thể bỏ qua chi phí phân bổ và khởi tạo thường liên quan đến việc tạo ổ cắm giúp tiết kiệm chu kỳ CPU, tải hệ thống và thời gian.
Giá trị mặc định là 0 (tắt). Giá trị khuyến nghị là 1 (bật).
Bộ định tuyến - 0
Máy chủ 1 - 2
Máy chủ 2 - 0
Nơi nào khác được sử dụng - 1
net.ipv4.tcp_tw_reuse
Bộ định tuyến - 0
Máy chủ 1 - 2
Máy chủ 2 - 0
Nơi nào khác được sử dụng - 1
net.ipv4.tcp_max_tw_buckets
- Chỉ định số lượng ổ cắm tối đa ở trạng thái time-waitâ được phép tồn tại bất kỳ lúc nào. Nếu vượt quá giá trị tối đa, các ổ cắm ở trạng thái time-waitâ sẽ bị hủy ngay lập tức và cảnh báo sẽ hiển thị. Cài đặt này tồn tại để ngăn chặn một số loại tấn công Từ chối Dịch vụ. Cần thận trọng trước khi hạ thấp giá trị này. Khi được thay đổi, giá trị của nó sẽ được tăng lên, đặc biệt là khi hệ thống đã thêm nhiều bộ nhớ hơn hoặc khi nhu cầu mạng cao và môi trường ít tiếp xúc với các mối đe dọa từ bên ngoài.
Bộ định tuyến - 2048
Máy chủ 1 - 131072
Máy chủ 2 - 2048
Một số nơi khác được sử dụng - 65536, 262144 (IBM), 45000 (IBM)
net.ipv4.tcp_tw_reuse
Bộ định tuyến - 0
Máy chủ 1 - 2
Máy chủ 2 - 0
Nơi nào khác được sử dụng - 1
net.ipv4.tcp_fin_timeout
Bộ định tuyến - 60
Máy chủ 1 - 60
Máy chủ 2 - 60
Nơi nào khác được sử dụng - 15
net.ipv4.tcp_max_syn_backlog
Bộ định tuyến - 128
Máy chủ 1 - 2048
Máy chủ 2 - 128
Một nơi khác được sử dụng - 65536
net.ipv4.ip_local_port_range
- phạm vi cổng được sử dụng cho các kết nối TCP gửi đi (hữu ích để thay đổi nó nếu bạn có nhiều kết nối gửi đi từ máy chủ)
Bộ định tuyến - 32768 60999
Máy chủ 1 - 32768 60999
Máy chủ 2 - 32768 60999
Nơi nào khác được sử dụng - 1024 65535
net.core.netdev_max_backlog
- số lượng vị trí trong bộ đệm vòng của máy thu dành cho các gói đến (hạt nhân đặt các gói vào hàng đợi này nếu CPU không có sẵn để xử lý chúng, ví dụ như theo ứng dụng)
Bộ định tuyến - 120
Máy chủ 1 - 1000
Máy chủ 2 - 1000
Một số nơi khác được sử dụng - 100000, 1000 (IBM), 25000 (IBM)
net.ipv4.neigh.default.gc_thresh1
Bộ định tuyến - 1
Máy chủ 1 - 128
Máy chủ 2 - 128
Nơi nào khác được sử dụng - 128
net.ipv4.neigh.default.gc_thresh2
Bộ định tuyến - 512
Máy chủ 1 - 512
Máy chủ 2 - 512
Nơi nào khác được sử dụng - 512
net.ipv4.neigh.default.gc_thresh3
Bộ định tuyến - 1024
Máy chủ 1 - 1024
Máy chủ 2 - 1024
Nơi nào khác được sử dụng - 1024
net.ipv4.neigh.default.gc_thresh3
Bộ định tuyến - 1024
Máy chủ 1 - 1024
Máy chủ 2 - 1024
Nơi nào khác được sử dụng - 1024
net.core.somaxconn
- kích thước hàng đợi nghe tối đa cho ổ cắm (cài đặt hữu ích và thường bị bỏ qua cho bộ cân bằng tải, máy chủ web và máy chủ ứng dụng (như kỳ lân, php-fpm). Nếu tất cả các quy trình/luồng máy chủ đều bận, thì các kết nối máy khách đến sẽ được đưa vào âbacklogâ đang chờ được phục vụ). Công việc tồn đọng đầy đủ khiến các kết nối máy khách bị từ chối ngay lập tức, gây ra lỗi máy khách.
Bộ định tuyến - 128
Máy chủ 1 - 4096
Máy chủ 2 - 128
net.ipv4.tcp_mem
- Ngưỡng sử dụng bộ nhớ đệm TCP để tự dò, trong các trang bộ nhớ (1 trang = 4kb)
Bộ định tuyến - 5529 7375 11058
Máy chủ 1 - 381144 508193 762288
Máy chủ 2 - 5148 6866 10296
net.nf_conntrack_max
- số lượng kết nối tối đa
Bộ định tuyến - 32768
Máy chủ 1 - 262144
Máy chủ 2 - không có thông tin
net.netfilter.nf_conntrack_max
- số lượng kết nối tối đa? Nếu đúng thông số này thì 1560 là chưa đủ
Bộ định tuyến - 1560
Máy chủ 1 - 262144
Máy chủ 2 - không có thông tin
/proc/sys/net/ipv4/tcp_congestion_control
- Tắc nghẽn mạng trong kết nối mạng dữ liệu [...] là chất lượng dịch vụ giảm sút xảy ra khi một nút mạng đang mang nhiều dữ liệu hơn khả năng xử lý của nó. Các hiệu ứng điển hình bao gồm trễ hàng đợi, mất gói hoặc chặn các kết nối mới. Các mạng sử dụng các kỹ thuật kiểm soát tắc nghẽn và tránh tắc nghẽn để cố gắng tránh sự sụp đổ tắc nghẽn.1
Bộ định tuyến - westwood
Máy chủ 1 - khối
Máy chủ 2 - khối
net.ipv4.tcp_syn_retries
- Chỉ định số lần thử truyền lại gói SYN ban đầu cho một nỗ lực kết nối TCP đang hoạt động. Cài đặt hiện tại là 20, nghĩa là có 20 lần thử truyền lại trước khi hết thời gian kết nối. Quá trình này có thể mất vài phút, tùy thuộc vào độ dài của nỗ lực truyền lại.
Bộ định tuyến - 6
Máy chủ 1 - 6
Máy chủ 2 - 6
net.ipv4.tcp_low_latency
- Giá trị mặc định là 0 (tắt). Đối với khối lượng công việc hoặc môi trường trong đó độ trễ được ưu tiên cao hơn, giá trị khuyến nghị là 1 (bật).
Bộ định tuyến - 0
Máy chủ 1 - 0
Máy chủ 2 - 0
net.ipv4.tcp_limit_output_bytes
- Sử dụng tham số này, TCP kiểm soát các giới hạn hàng đợi nhỏ trên cơ sở ổ cắm TCP. TCP có xu hướng tăng dữ liệu trong chuyến bay cho đến khi nhận được thông báo mất mát. Với các khía cạnh của điều chỉnh tự động gửi TCP, một lượng lớn dữ liệu có thể được xếp hàng đợi tại thiết bị trên máy cục bộ, điều này có thể ảnh hưởng xấu đến độ trễ cho các luồng khác.tcp_limit_output_bytes giới hạn số lượng byte trên thiết bị để giảm hiệu ứng độ trễ do kích thước hàng đợi lớn hơn gây ra.
Bộ định tuyến - 262144
Máy chủ 1 - 1048576
Máy chủ 2 - 262144
Một số nơi khác được sử dụng - 262.144 (IBM), 131.072 (IBM)