2015-03-12 20 views
15

Tôi đang viết chương trình C để đọc dữ liệu từ ổ SSD bằng cách đọc trực tiếp từ tệp thiết bị khối thô.Nhân Linux xử lý các yêu cầu I/O không đồng bộ (AIO) như thế nào?

Tôi đang thử Linux AIO (Tôi đang nói về API AIO Linux, tức là các chức năng được cung cấp bởi linuxaio.h, chẳng hạn như io_submit(...), v.v., không phải API POSIO AIO). Tôi mở tệp thiết bị khối bằng cách sử dụng cờ O_DIRECT và tôi đảm bảo rằng tôi ghi vào bộ đệm được căn chỉnh theo kích thước khối.

Tôi nhận thấy rằng Linux AIO nhanh hơn đáng kể so với sử dụng IO đồng bộ cũng với cờ O_DIRECT. Điều khiến tôi ngạc nhiên nhất là thông lượng đạt được bằng cách phát hành nhiều lần đọc ngẫu nhiên nhỏ vài KB mỗi Linux với AIO cao hơn đáng kể ngay cả khi thông lượng đạt được một số lượng lớn (tuần tự) đọc vài MB bằng đồng bộ I/O và O_DIRECT.

Vì vậy, tôi muốn biết: Linux AIO giống như thế nào tốt hơn so với I/O đồng bộ? Hạt nhân làm gì khi sử dụng AIO? Hạt nhân có thực hiện yêu cầu sắp xếp lại không? Việc sử dụng Linux AIO có dẫn đến việc sử dụng CPU lớn hơn sử dụng I/O đồng bộ không?

Thanks a lot trước

+0

AIO nhanh hơn vì tên của nó. của nó không đồng bộ, về cơ bản tất cả IO được thực hiện để bộ nhớ và không đĩa cơ bản. –

+4

@Miline: Điều đó hoàn toàn không có ý nghĩa gì cả. Thực hiện đọc ngẫu nhiên từ đĩa hoàn toàn yêu cầu I/O vật lý từ đĩa. Không có cách nào để ma thuật những byte đó từ đĩa vào bộ nhớ. – MSalters

+0

Những gì tôi có nghĩa là IO chủ yếu được thực hiện từ bộ nhớ nơi dữ liệu được lưu trữ. Dữ liệu được ghi được nạp vào bộ nhớ và sau đó io được trả về ứng dụng. Và trang đó trong bộ nhớ được đánh dấu là bẩn. Vì vậy, công việc hệ thống tập tin của nó để tuôn ra trang đó vào đĩa .. trong trường hợp của DIRECTIO .. io không được trả lại cho đến khi dữ liệu được ghi vào đĩa –

Trả lời

20

Câu trả lời ngắn: Nhiều khả năng thực hiện đa chức năng là "nhanh" vì nó nộp nhiều IOs song song, trong khi triển khai đồng bộ có hoặc không hoặc một I/O trong khi bay . Nó không liên quan gì đến việc ghi vào bộ nhớ hoặc với đường dẫn I/O hạt nhân có thêm chi phí cho I/O đồng bộ.

Bạn có thể kiểm tra điều này bằng cách sử dụng iostat -x -d 1. Xem số avgqu-sz (kích thước hàng đợi trung bình = số lượng trung bình I/O trên chuyến bay) và % util (sử dụng = phần trăm thời gian thiết bị có ít nhất một I/O được cấp cho nó) .

Long trả lời:

  • Khái niệm về "nhanh" được khéo léo khi nói về I/O. "Nhanh hơn" có nghĩa là băng thông cao hơn không? Hay độ trễ thấp hơn? Hoặc băng thông ở kích thước yêu cầu nhất định? Hoặc độ trễ ở độ sâu hàng đợi nhất định? Hoặc kết hợp độ trễ, băng thông, kích thước yêu cầu, chiều sâu hàng đợi và nhiều thông số khác hoặc khối lượng công việc? Tôi giả định ở đây rằng bạn đang sử dụng thông lượng/băng thông, tuy nhiên, bạn nên nhớ rằng hiệu suất của thiết bị lưu trữ không phải là chỉ số thứ nguyên duy nhất.

  • Ổ SSD là thiết bị song song cao. Một SSD bao gồm nhiều chip flash, mỗi chip có bội số chết có thể đọc/ghi độc lập. SSD tận dụng lợi thế của điều này và thực hiện nhiều I/O song song, mà không có sự gia tăng đáng chú ý trong thời gian đáp ứng. Do đó, về mặt thông lượng, điều quan trọng là có bao nhiêu I/OS đồng thời mà SSD nhìn thấy. Cho phép hiểu điều gì sẽ xảy ra khi một luồng gửi I/O đồng bộ: a) chủ đề dành một số chu kỳ CPU chuẩn bị yêu cầu I/O (tạo dữ liệu, tính toán bù đắp, sao chép dữ liệu vào bộ đệm, vv), b) cuộc gọi hệ thống được thực hiện (ví dụ pread()), thực thi truyền vào không gian hạt nhân, và các khối luồng, c) yêu cầu I/O được xử lý bởi hạt nhân & duyệt qua các lớp I/O hạt nhân khác nhau, d) I/O yêu cầu được gửi đến thiết bị và duyệt qua kết nối (ví dụ:PCIe), e) yêu cầu I/O được xử lý bởi firmware SSD, f) lệnh đọc thực tế được gửi tới chip flash thích hợp, g) bộ điều khiển SSD đợi dữ liệu, h) bộ điều khiển SSD lấy dữ liệu từ các chip flash và gửi nó thông qua các kết nối. Tại thời điểm này dữ liệu rời khỏi SSD và các giai đoạn e-a) xảy ra ngược lại.

  • Như bạn có thể thấy, quy trình I/O đồng bộ đang phát yêu cầu ping-pong với SSD. Trong nhiều giai đoạn được mô tả ở trên, không có dữ liệu nào thực sự được đọc từ các chip flash. Ngày đầu này, mặc dù SSD của bạn có thể xử lý hàng chục đến hàng trăm yêu cầu song song, nó thấy nhiều nhất một yêu cầu tại bất kỳ thời điểm nào. Vì vậy, thông lượng là rất, rất thấp bởi vì bạn đang thực sự không thực sự sử dụng SSD.

  • I/O không đồng bộ giúp theo hai cách: a) cho phép quá trình gửi nhiều yêu cầu I/O song song (SSD có đủ công việc để giữ bận) và b) cho phép I/O pipelining thông qua các giai đoạn xử lý khác nhau (do đó tách độ trễ của giai đoạn khỏi thông lượng).

  • Lý do tại sao bạn thấy I/O không đồng bộ nhanh hơn I/O đồng bộ là vì bạn so sánh táo và cam. Thông lượng đồng bộ là ở kích thước yêu cầu nhất định, độ sâu hàng đợi thấp và không có pipelining. Thông lượng không đồng bộ có kích thước yêu cầu khác nhau, độ sâu hàng đợi cao hơn và với pipelining. Những con số bạn thấy không thể so sánh được.

  • Phần lớn ứng dụng chuyên sâu I/O (tức là hầu hết các ứng dụng như cơ sở dữ liệu, máy chủ web, v.v.) có nhiều luồng thực hiện I/O đồng bộ. Mặc dù mỗi luồng có thể gửi tối đa một I/O vào bất kỳ thời điểm cụ thể nào, hạt nhân & thiết bị SSD nhìn thấy nhiều yêu cầu I/O có thể được phân phối song song. Các yêu cầu I/O đồng bộ nhiều kết quả có cùng lợi ích như nhiều yêu cầu I/O không đồng bộ.

    Sự khác biệt chính giữa I/O không đồng bộ và đồng bộ xuống theo cách I/O & lập lịch trình quy trình và mô hình lập trình. Cả hai async & đồng bộ I/O có thể ép cùng một IOPS/thông lượng từ một thiết bị lưu trữ nếu được thực hiện đúng.

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