Làm thế nào một bộ xử lý có thể xử lý 10 Gigabit mỗi giây hoặc tốc độ dữ liệu trở lên?


11

Tôi không biết đó có phải là nơi thích hợp để hỏi không. Nó có thể là một câu hỏi rất ngớ ngẩn. Tôi giả sử rằng một số bộ xử lý phải xử lý các khung dữ liệu để chuyển đổi / định tuyến. Bộ xử lý hiện đại có tốc độ vài GHz. Làm thế nào để họ xử lý dữ liệu đến với tốc độ nhanh hơn so với họ hoạt động?

Câu trả lời:


16

Bạn hoàn toàn chính xác, nếu chúng ta phải sử dụng một chu kỳ hướng dẫn trên mỗi bit thì 10Gbps sẽ không thể thực hiện được. Vì vậy, điều đầu tiên cần lưu ý là chúng tôi xử lý một từ cho mỗi lệnh CPU - 64 bit.

Thậm chí sau đó, điều tồi tệ nhất chúng ta có thể làm cho hiệu năng là để CPU truy cập tất cả các từ của gói. Do đó, tập trung vào xử lý "không sao chép" các gói. Một số mánh khóe đó nằm ở chính các giao diện: chúng có DMA ("Truy cập bộ nhớ trực tiếp") để chip điều khiển ethernet sao chép dữ liệu vào RAM; họ tính toán tổng kiểm tra để CPU không phải truy cập tất cả các từ trong gói để làm như vậy. Một số trong đó là trong thiết kế cấu trúc dữ liệu: chúng tôi cẩn thận sắp xếp bộ đệm gói để chúng tôi có thể di chuyển chúng bằng cách thay đổi mức nợ của một mục trong bảng trang. Một số trong đó chỉ là lập trình cẩn thận để đảm bảo rằng dữ liệu gói được truy cập ít nhất số lần và tốt nhất là không nên truy cập cho đến khi chương trình ứng dụng nhận được.

Khi chúng tôi đã thực hiện tất cả những điều này, giới hạn tiếp theo là chi phí xử lý từng gói một. Do đó, có rất nhiều tính năng "giảm tải phân đoạn" cả trong bộ điều khiển ethernet và trong nhân để chúng tôi xử lý các nhóm gói. Chúng tôi thậm chí trì hoãn việc truy xuất dữ liệu từ bộ điều khiển ethernet để các nhóm này lớn hơn.

Cuối cùng, chúng ta có các phím tắt trong trường hợp đặc biệt, chẳng hạn như lệnh gọi sendfile () của kernel, là đường dẫn nhanh từ đĩa tới mạng bằng cách sử dụng lượng công việc tối thiểu.

Chúng ta thậm chí có thể định tuyến trường hợp đặc biệt (chuyển tiếp các gói từ giao diện này sang giao diện khác) bằng cách sử dụng các tính năng phần cứng của thẻ giao diện mạng và coi bus PCI là bus giữa các thẻ thay vì liên quan đến CPU. Điều đó không thể được thực hiện trong các hệ điều hành có mục đích chung, nhưng các nhà cung cấp như Intel cung cấp thư viện phần mềm để triển khai các tính năng như vậy trên bộ điều khiển ethernet của họ.

Di chuyển khỏi CPU hoàn toàn, chúng ta thậm chí có thể xây dựng các bộ định tuyến mục đích đặc biệt trong đó tất cả các tác vụ chuyển tiếp xảy ra trong phần cứng. Vì bus PCI sau đó sẽ là một hạn chế nên chúng chạy nhiều bus song song; hoặc thậm chí nhiều thanh song song với nhiều cụm công tắc thanh ngang song song. Ở một đầu của thị trường, một công tắc ethernet nhỏ dựa trên TCAM sẽ là một ví dụ; ở đầu kia của thị trường, Juniper M40 sẽ là một thiết kế chuẩn.

Một công tắc thông thường sẽ bắt đầu nhận gói tin, tra cứu địa chỉ đích trong TCAM, gắn thẻ với cổng đầu ra vào gói và sau đó DMA gói vẫn đến bộ điều khiển của cổng ra. Lưu ý rằng nếu cổng đầu ra bị tắc nghẽn thì tất cả những gì có thể được thực hiện trên công tắc đơn giản này là vứt bỏ gói dữ liệu vào. Do đó, các công tắc đơn giản không đưa ra lựa chọn tốt khi liên kết thay đổi tốc độ và một số hàng đợi là mong muốn. Tất nhiên các công tắc tinh vi hơn tồn tại, mà bạn phải trả nhiều tiền hơn.

Một bộ định tuyến thông thường sẽ nhận được một gói và giữ nó trong một hàng đợi ngắn. Địa chỉ IP đích sẽ được tra cứu trong RAM tĩnh, gói tin sau đó sẽ được phát nổ vào các ô để giảm độ trễ và mỗi ô gửi đến một thanh chuyển đổi chéo sang thẻ đi ra. Thẻ đó sẽ tập hợp lại các ô thành một gói và xếp hàng gói ra khỏi giao diện đầu ra. Việc xếp hàng trên giao diện đầu ra có thể tinh vi.


Câu trả lời chính xác. Bạn có thể giải thích về the packet will then be exploded into cells to reduce latency?
Eddie

Trong thiết kế bộ định tuyến, bạn có thể chỉ cần gửi một gói từ thẻ dòng này sang thẻ khác thông qua chuyển đổi thanh ngang (hoặc một số loại xe buýt liên thẻ khác). Nhưng sau đó độ trễ bị ràng buộc bởi độ dài của gói - bạn sẽ có một độ trễ truyền gói hoàn chỉnh khác khi gói được gửi qua chuyển mạch ngang. Để tránh điều đó, chúng ta có thể có nhiều liên kết song song vào chuyển đổi thanh ngang và chia gói trên các liên kết đó. Sau đó độ trễ cho các gói lớn giảm đi nhiều. Một phần của gói phân tách được gọi là "ô".
vk5tu

Tôi biết câu trả lời này là từ hai năm trước, nhưng CẢM ƠN BẠN RẤT NHIỀU. Tôi đã có câu hỏi tương tự như poster ban đầu, và tìm thấy câu trả lời của bạn trong tìm kiếm của tôi. Đó là RẤT tốt bằng văn bản và kỹ lưỡng. Cảm ơn!
loneboat

0

Ngày nay, hầu hết tất cả các chuyển mạch, và phần lớn việc định tuyến, được xử lý trong phần cứng, do đó tốc độ bộ xử lý phát huy tác dụng đối với các ngoại lệ. Đối với những thứ như máy chủ, có thể bộ xử lý không đủ nhanh. Điều này đã được trường hợp trong quá khứ. Khi ethernet 1 Gbps xuất hiện lần đầu tiên, xe buýt được sử dụng trong PC và máy chủ chỉ có thể xử lý 400 Mbps.

Điều gì xảy ra khi bộ xử lý không đủ nhanh là lưu lượng bị giảm. Dù sao, rất nhiều lưu lượng có thể bị loại bỏ, vì đó là cách xử lý tắc nghẽn, nếu được thực hiện đúng. RED (Phát hiện sớm ngẫu nhiên) là một phương pháp được sử dụng để thả ngẫu nhiên các gói trong hàng đợi để ngăn chúng lấp đầy và thả các gói. Điều này có thể giúp ngăn chặn đồng bộ hóa TCP. Rất nhiều giọt xảy ra trên các thiết bị chuyển mạch, trong đó nhiều cổng có tốc độ có thể cần gửi đến một cổng khác có cùng tốc độ.


1
Điều này gây nhầm lẫn loại bỏ xâm nhập với giọt đi ra. Loại bỏ thường xảy ra khi bộ đệm vòng của giao diện ethernet bị đầy - như xảy ra khi CPU không thể theo kịp tốc độ đến của dữ liệu. Bộ đệm vòng đó quá nhỏ để RED được thực hiện.
vk5tu

@ vk5tu, bạn đã bỏ lỡ quan điểm của tôi rằng lưu lượng truy cập bị giảm mọi lúc, cho dù đi vào hay đi ra. Nếu bất kỳ phần nào của hệ thống không thể xử lý lưu lượng, một số sẽ bị loại bỏ và một số bị bỏ mục đích.
Ron Maupin
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.