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
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. –
@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
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 –