2011-12-15 28 views
8

Theo this tutorial tệp đĩa không đồng bộ io có thể dễ dàng đạt được bằng cách sử dụng AIO trên Linux, ít nhất là từ điểm lập trình/api. Nhưng trước và sau hướng dẫn này, tôi đã đọc rất nhiều bài viết và bài viết rằng điều này hoặc là không thể được thực hiện hoặc bạn nên sử dụng libevent với một bản vá và nhiều vấn đề khác. Một điều nữa là vòng lặp mà tôi đã chờ đợi một tín hiệu, nhưng dựa trên hướng dẫn này tôi có thể sử dụng một cơ chế gọi lại, điều này rõ ràng làm cho AIO dễ sử dụng hơn nhiều.Tệp đĩa Linux AIO

Bây giờ, tôi không phải là lập trình viên Linux ngay cả khi quay lâu Tôi chỉ muốn tìm một cách đơn giản để hỗ trợ tập tin đĩa không đồng bộ trên Linux, tìm hiểu và thêm nó vào thư viện io đĩa async mà tôi cần cho dự án cá nhân. Hiện tại tôi đang sử dụng io chồng lên nhau trên cửa sổ và chuỗi công việc io trên nền tảng không phải cửa sổ. Kể từ khi giải pháp mutithreaded có thể được khôn lanh, tôi muốn thay thế nó trên Linux với AIO.

SO, điều gì xảy ra với AIO như được mô tả trong hướng dẫn này? Có hiệu suất không? Có hạn chế về hoạt động có thể được thực hiện bằng AIO không?

p.s. Tôi không quan tâm nếu mã sẽ không được di động đến các nền tảng tuân thủ POSIX khác, miễn là nó hoạt động trên các bản phân phối Linux chính. Và tất cả những gì tôi quan tâm là io đĩa thường xuyên.

Cảm ơn.

+3

Hỗ trợ AIO trên Linux là xấu. Hiện tại, AIO sẽ bỏ qua bộ đệm đệm và thực hiện trực tiếp đĩa IO, những gì có thể làm tổn thương hiệu năng một cách tồi tệ. – lvella

+0

nó có thể tồi tệ hơn giải pháp chủ đề công nhân không? – p00ya00

+1

Nó phụ thuộc vào bạn sử dụng. Nếu tất cả những gì bạn làm là để đọc hoặc viết một tập tin lớn tuần tự, nó sẽ hoạt động tốt, nhưng nếu bạn truy cập vào các khối nhỏ ngẫu nhiên, nó chắc chắn sẽ tồi tệ hơn. Nhân tiện, giải pháp thread-worker này là những gì bạn nhận được nếu bạn sử dụng giao diện POSIX 'aio_read() 'vv Nó được thực hiện với các luồng chặn trên không gian người dùng bởi glibc. – lvella

Trả lời

11

Hướng dẫn cung cấp tổng quan về I/O không đồng bộ nói chung và nói về cách hỗ trợ hạt nhân cho nó. Sau đó, nó tiếp tục nói về posix AIO (là API được chuẩn hóa để truy cập I/O không đồng bộ), ngụ ý rằng việc sử dụng API AIO posix trên Linux, sẽ cho phép bạn truy cập vào hỗ trợ hạt nhân cho AIO. Đây không phải là trường hợp.

Trên Linux, có thực sự hai triển khai đa chức năng riêng biệt:

  1. hạt nhân đa chức năng trong đó sử dụng io_submit() et al) mà chỉ được hỗ trợ trong kernel 2.6 (hoặc thực sự 2.5 và có thể có back-chuyển. phiên bản của nó để 2.4.
  2. posix AIO mà là một tính năng glibc, về cơ bản không liên quan đến hạt nhân. nó thực hiện các API posix về chủ đề người dùng cấp làm chặn đĩa I/cuộc gọi O.

Vì vậy, , trong ngắn hạn, nếu bạn đã thực hiện chung nhiều chủ đề cho đĩa I/O, bạn có thể sử dụng tốt hơn việc sử dụng glibc (vì bạn có thể kiểm soát nó nhiều hơn một chút).

Nếu bạn cam kết thực sự sử dụng nhóm chức năng io_submit(), bạn có thể phải làm rất nhiều công việc để phá vỡ các hạn chế đối với các chức năng đó.

hạt nhân AIO yêu cầu các tệp của bạn sẽ được mở bằng O_DIRECT. Mà lần lượt yêu cầu tất cả các tập tin của bạn offsets, đọc và viết kích cỡ để được liên kết với khối trên đĩa. Điều này thường tốt nếu bạn chỉ sử dụng một tệp lớn và bạn có thể làm cho nó hoạt động rất giống với bộ đệm trang trong hệ điều hành. Để đọc và viết các tập tin tùy ý với độ dài và độ dài tùy ý, nó sẽ bị lộn xộn.

Nếu bạn kết thúc cho AIO hạt nhân một shot, tôi rất muốn khuyên bạn nên nhìn vào một hoặc nhiều eventfds để iocbs của bạn để bạn có thể chờ đợi trên hoàn thành bằng cách sử dụng epoll/select thay vì phải chặn trong io_getevents().

2

Việc triển khai Linux của POSIX AIO sinh ra một chuỗi cho mỗi bài viết bạn thực hiện. Điều này thường không tốt và bạn nên sử dụng các chuỗi công việc của riêng bạn để thực hiện việc ghi, để bạn có thể kiểm soát số lượng chuỗi đang phát. Nói cách khác, gắn bó với những gì bạn có, AIO sẽ không mua cho bạn bất cứ thứ gì.

+0

AIO hạt nhân không làm điều này, nhưng ít hữu ích hơn vì nó bỏ qua bộ nhớ cache đệm vv (tất nhiên, đó là những gì cơ sở dữ liệu muốn) – MarkR

Các vấn đề liên quan