Tôi đang xây dựng một máy chủ Linux hiệu năng cao (dựa trên ổ cắm không bị chặn, và đĩa không đồng bộ IO [dựa trên io_submit/io_getevents/eventfd]). Một số tiêu chuẩn của tôi cho thấy cách tôi xử lý ổ cắm không đủ hiệu quả cho các yêu cầu của tôi. Đặc biệt, tôi quan tâm đến việc lấy dữ liệu từ bộ đệm vùng người dùng đến thẻ mạng, và từ thẻ mạng trở lại bộ đệm vùng người dùng (hãy bỏ qua cuộc gọi sendfile ngay bây giờ). Từ những gì tôi hiểu, hãy gọi đọc/ghi trên ổ cắm Linux không chặn không hoàn toàn không đồng bộ - hệ thống chặn cuộc gọi trong khi nó sao chép bộ đệm từ vùng người dùng đến hạt nhân (hoặc cách khác xung quanh), và chỉ sau đó trở lại. Có cách nào để tránh tình trạng nghe lén này trong Linux không? Đặc biệt, có một cuộc gọi viết không đồng bộ hoàn toàn mà tôi có thể thực hiện trên một socket sẽ trả về ngay lập tức, DMA bộ đệm vùng người dùng vào thẻ mạng khi cần thiết và báo hiệu/thiết lập một sự kiện/etc. hoàn thành? Tôi biết Windows có một giao diện cho điều này, nhưng tôi không thể tìm thấy bất cứ điều gì về điều này trong Linux.Ổ cắm Linux hiệu quả (DMA/zero-copy)
Cảm ơn!
Cảm ơn! Bạn có một linh cảm về cách hiệu quả này sẽ được đọc/ghi? Nói chung, có hướng dẫn "phương pháp hay nhất" ở đâu đó cho loại nội dung này không? Phải mất nhiều ngày để sàng lọc thông qua tất cả các API bỏ phiếu và báo hiệu, và sau đó thêm thời gian để chuẩn nó tất cả trước khi tôi tìm thấy một thực hành tốt nhất cho ghép nối ổ cắm và async IO. Nó sẽ thực sự giúp đỡ để tìm một hướng dẫn thực hành tốt nhất ổ cắm. Có trang vấn đề C10K, nhưng hầu hết các thông tin có nhiều năm tuổi (đó là tuổi trong thời gian hạt nhân), và thường rất không thuyết phục. –
'splice' và bạn bè là khá mới, vì vậy tôi không chắc chắn nếu có bất kỳ loại" thực hành tốt nhất "hướng dẫn cho họ được nêu ra. Chúng phải có độ trễ khá thấp và không sao chép nếu có thể - đó là toàn bộ điểm của chúng. Bạn có thể thử hỏi trên danh sách gửi thư linux-net và/hoặc linux-kernel. – caf
1,5 năm trôi qua kể từ khi các bài đăng này, bất kỳ sự phát triển mới nào trong lĩnh vực này? @caf: bạn có thể làm điều này với 'splice' không? –