Đánh số lớp / bộ lọc Linux TC


12

Tôi hiện đang làm việc trên một giải pháp định hình lưu lượng truy cập cho các công ty cấp ISP và đã đi đến một vấn đề thú vị (triết học).

Nhìn về số lượng điểm cuối mà hệ thống sẽ xử lý (khoảng ~ 20k), tôi hơi lo lắng điều gì sẽ xảy ra khi tôi cần chính sách / định hình lưu lượng truy cập của nhiều người dùng hơn. Vì tôi hiện đang sử dụng cây định hình HFSC (xem tc-hfsc, chủ yếu là thứ tương tự nhưng mát hơn như HTB được biết đến nhiều hơn) cho toàn bộ mạng, tôi cần sử dụng nhiều ClassID hơn (rõ ràng ít nhất một cho mỗi người dùng trên mạng). Vấn đề mà tôi nhận thấy là các TC ClassID bị giới hạn - chúng là các số 16 bit, mang lại cho tôi tối đa 64k người dùng có thể được định hình bởi giải pháp này.

Tương tự, nếu tôi muốn quản lý các bộ lọc TC một cách hiệu quả (ví dụ: không sử dụng 'kỹ thuật tuôn ra tất cả'), tôi cần có thể xóa hoặc sửa đổi các mục bộ lọc riêng lẻ. (Tôi đang sử dụng một cái gì đó tương tự như bảng băm từ LARTC [1]). Một lần nữa, phương pháp duy nhất có vẻ hoạt động với điều này là đánh số tất cả các bộ lọc bằng cách sử dụng các ưu tiên riêng lẻ (bộ lọc tc thêm dev ... pro 1). Không có tham số nào khác có thể được sử dụng cho mục đích này, và thật đáng tiếc, Prio chỉ là 16 bit.

Câu hỏi của tôi là: Có tồn tại một số phương pháp tốt để mở rộng "không gian định danh" có sẵn, chẳng hạn như clsid 32 bit cho lệnh 'tc class' và các ưu tiên 32 bit (hoặc bất kỳ xử lý sửa đổi nào khác) cho 'bộ lọc tc' chỉ huy?

Cảm ơn rất nhiều,

-mk

(btw Tôi hy vọng điều này sẽ không xảy ra với kịch bản "64k người dùng là đủ cho tất cả mọi người" ...)


Tất cả các giá trị đó được lưu trữ trong không gian kernel, để làm cho chúng lớn hơn, bạn cần biên dịch lại các tiện ích kernel và không gian người dùng. Bạn đã thử sử dụng kernel 64 bit chưa? Họ có thể được định nghĩa là 32 bit ở đó.
Hubert Kario

Nhân 64 bit sử dụng cùng kích cỡ. Ví dụ: số bộ lọc là số nguyên u32 bao gồm phần trên (giao thức) và phần dưới (prô) rõ ràng là 16 bit. ID lớp được mã hóa cứng là u16. Có lẽ sẽ thử hỏi ai đó về LKML.
exa

1
ngay cả khi sử dụng hàm băm cho các bộ lọc của bạn, bạn sẽ gặp rất nhiều vấn đề về IO nếu bạn đang sử dụng nhiều bộ lọc đó (tôi đoán là ngược dòng và hạ lưu). Tôi đã dành rất nhiều thời gian và phải vá lỗi triển khai hàng đợi bên trong kernel để có những thứ hoạt động vớiou ksoftirqd. Tôi đã sử dụng một bản vá từ một anh chàng tên là Simon Lodal mà tôi đã gặp trên LARTC 4 năm trước. Hãy xem bản vá của anh ấy mail-archive.com/lartc@mailman.ds9a.nl/msg16279.html . Bạn có thể thử gửi cho anh ấy một e-mail vì anh ấy luôn có một phiên bản rất cập nhật (so với kernel cuối cùng) với anh ấy.
Pottauez

@Pabluez Cảm ơn rất nhiều, tôi sẽ cố gắng tận dụng tốt nhất.
exa

1
Tôi nghĩ rằng yêu cầu của bạn là hợp lệ nhưng như Pottauez đã viết điều này chắc chắn liên quan đến rất nhiều thay đổi hạt nhân. Tôi không muốn nói "bạn đang làm sai", nhưng tôi sẽ khuyến khích bạn kiểm tra luồng mở, trong đó phần dưới của việc xử lý gói được thực hiện ở cấp chuyển đổi và việc kiểm soát được thực hiện trong phần mềm tùy chỉnh, có lẽ chạy trong không gian người dùng. Tôi không biết nếu nó phù hợp với yêu cầu của bạn, nhưng nó chắc chắn đáng để điều tra.
AndreasM

Câu trả lời:


2

Tôi nghĩ rằng bạn không nên đặt 64k người dùng với các lớp và bộ lọc ngược dòng cho mỗi người trong số họ trên cùng một giao diện. Bạn có thể lặp lại các trình xử lý cho mỗi giao diện bạn có, vì vậy hãy thêm nhiều giao diện khác. Bạn sẽ cần một công việc / máy chủ / NIC đáng kinh ngạc để có những thứ này. Nếu máy chủ gặp sự cố, bạn sẽ có 64k người dùng ngoại tuyến (và nó sẽ dễ dàng bị sập với lượng lưu lượng đó). Đừng quên rằng MACHI gói đi qua card mạng của bạn sẽ được kiểm tra và phân loại bởi một bộ lọc và được gửi đến một lớp để được xếp hàng. Đây là rất nhiều công việc cho một NIC của một cổng ISP với 64k khách hàng. Chủ yếu là với tất cả các luồng video mà chúng ta có ngày nay (rất khó để xếp hàng đúng cách).


Tôi đảm bảo tính khả dụng của dịch vụ ở một số cấp độ khác, nhưng cảm ơn vì đã quan tâm. Trên thực tế, với các NIC tốt, không khó để có một bộ định tuyến linux có thể chuyển tiếp 10Gbit.
exa

Đối với câu hỏi ban đầu, tôi quan tâm nhiều hơn đến các công cụ như thêm 5 lớp khác nhau cho mỗi người dùng, điều này sẽ cho phép tôi thực hiện công việc QOS thực sự tốt (như xử lý luồng và lưu lượng thời gian thực riêng biệt), nhưng hầu như không thể tưởng tượng được trong điều kiện hiện tại (với tôi trường hợp sử dụng hiện tại của ~ 20k điểm cuối tôi đã ở dưới giới hạn).
exa

1
được rồi, để chuyển tiếp 10Gbits không phải là vấn đề, vấn đề là có nhiều bộ lọc và lớp 64k * 2 (thăng trầm). Chúc may mắn: D
Pottauez

0

Bạn có thể chia việc xử lý lưu lượng thành hai máy (sử dụng máy thứ ba) thay vì xử lý tất cả lưu lượng trên một máy. Lưu lượng có thể được định tuyến đơn giản dựa trên địa chỉ IP nguồn. Vì vậy, bạn sẽ có tối đa 10k người dùng nếu bạn có thể chia đều (các) dải IP.

Tất nhiên, bạn có thể sử dụng nhiều hơn hai máy nếu cần. Tôi nghĩ rằng điều này có thể tốt hơn so với việc vá nhân Linux và thực hiện một số hack khác. Nói tóm lại, việc định hình lưu lượng sẽ được phân phối trên một số máy. Nút trung tâm sẽ chỉ chuyển tiếp lưu lượng đến nút xử lý bên phải.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.