2009-06-17 53 views
76

Tôi đọc rằng có thể thay đổi bộ lập lịch I/O cho một thiết bị cụ thể trên hạt nhân đang chạy bằng cách ghi vào/sys/block/[disk]/queue/scheduler. Ví dụ: tôi có thể thấy trên hệ thống của mình:Chọn một Bộ lập lịch I/O Linux

[email protected]:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

rằng mặc định là trình lập lịch xếp hàng hoàn toàn công bằng. Những gì tôi tự hỏi là nếu có bất kỳ sử dụng trong bao gồm tất cả bốn schedulers trong hạt nhân tùy chỉnh của tôi. Có vẻ như không có nhiều hơn một bộ lập lịch được biên dịch trừ khi hạt nhân đủ thông minh để chọn bộ lập lịch chính xác cho phần cứng chính xác, cụ thể là bộ lập lịch 'noop' cho các ổ đĩa flash và một trong những bộ khác cho truyền thống ổ cứng.

Đây có phải là trường hợp không?

Trả lời

103

Như được ghi trong /usr/src/linux/Documentation/block/switching-sched.txt, trình lên lịch I/O trên bất kỳ thiết bị khối cụ thể nào có thể được thay đổi khi chạy. Có thể có một số độ trễ vì các yêu cầu của trình lên lịch trước đều bị xóa trước khi đưa trình lên lịch mới vào sử dụng, nhưng nó có thể được thay đổi mà không gặp sự cố ngay cả khi thiết bị đang được sử dụng nhiều.

# cat /sys/block/hda/queue/scheduler 
noop deadline [cfq] 
# echo anticipatory > /sys/block/hda/queue/scheduler 
# cat /sys/block/hda/queue/scheduler 
noop [deadline] cfq 

Lý tưởng nhất, sẽ có một trình lập lịch biểu duy nhất đáp ứng mọi nhu cầu. Nó dường như chưa tồn tại. Hạt nhân thường không có đủ kiến ​​thức để chọn lên lịch tốt nhất cho khối lượng công việc của bạn:

  • noop thường là sự lựa chọn tốt nhất cho các thiết bị khối bộ nhớ được hỗ trợ (ví dụ đĩa RAM) và các phương tiện truyền thông không quay (flash), nơi cố gắng sắp xếp lại I/O là một sự lãng phí nguồn lực
  • deadline là một lịch trình nhẹ mà cố gắng đặt một giới hạn cứng về độ trễ
  • cfq cố gắng để duy trì sự công bằng cho toàn hệ thống I/O băng thông

Mặc định là anticipatory trong một thời gian dài và đã nhận được nhiều điều chỉnh nhưng bị xóa trong 2.6.33 (đầu năm 2010). cfq đã trở thành mặc định một số trong khi trước đây, vì hiệu suất của nó là hợp lý và công bằng là một mục tiêu tốt cho hệ thống đa người dùng (và thậm chí cả người dùng máy tính để bàn đơn). Đối với một số trường hợp - cơ sở dữ liệu thường được sử dụng làm ví dụ, vì chúng có xu hướng có lịch biểu và mẫu truy cập riêng và thường là hầu hết các dịch vụ quan trọng (vì vậy ai quan tâm đến sự công bằng?) - anticipatory có lịch sử lâu dài có thể điều chỉnh để có hiệu suất tốt nhất trên các tải công việc này và deadline sẽ nhanh chóng chuyển tất cả các yêu cầu đến thiết bị cơ bản.

+1

Thông tin tuyệt vời, cảm ơn! Nhưng câu hỏi cơ bản của tôi vẫn chưa được trả lời, nếu tôi cắm một ổ đĩa flash hoặc netbook của tôi chạy ra khỏi ổ đĩa flash vì ổ đĩa chính của nó là hạt nhân đủ thông minh để chọn noop thay vì cfq mặc định? Hoặc là hoàn toàn tùy thuộc vào tôi để làm điều đó theo cách thủ công? –

+3

Bạn có thể định cấu hình hạt nhân để sử dụng một bộ lập lịch khác theo mặc định. Sẽ rất thông minh khi tự động sử dụng 'noop' ​​trên phương tiện không quay, nhưng hạt nhân không có chức năng đó. Nó không có phát hiện phương tiện truyền thông không quay, nhưng nó không đáng tin cậy như một số đĩa misreport mình, và nó chưa được nối lên đến mã lập lịch I/O dù sao đi nữa. – ephemient

+7

Bạn có thể thêm các quy tắc udev để xác định lịch trình dựa trên các đặc tính của thiết bị, như trong wiki debian (https://wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler) # đặt thời hạn biểu cho các đĩa không xoay ACTION == "thêm | thay đổi", KERNEL == "sd [az]", ATTR {hàng đợi/quay} == "0", ATTR {hàng đợi/lịch biểu} = "thời hạn" –

7

Mục đích của việc hỗ trợ hạt nhân là những thứ khác nhau là bạn có thể dùng thử mà không cần khởi động lại; sau đó bạn có thể chạy khối lượng công việc thử nghiệm thông qua sytsem, đo lường hiệu suất và sau đó làm cho tiêu chuẩn đó cho ứng dụng của bạn.

Trên phần cứng cấp máy chủ hiện đại, chỉ phần cứng mới có vẻ hữu ích. Những người khác dường như chậm hơn trong các bài kiểm tra của tôi.

+0

Làm thế nào để bạn thực sự thay đổi nó khi chạy? –

+0

hiệu suất của noop liên quan đến các bộ lập lịch khác rất nhiều phụ thuộc vào phần cứng và tải cụ thể. Trong tò mò, bạn đang chạy đĩa, bộ điều khiển và thử nghiệm nào? – ephemient

+1

Vâng, noop là tốt khi bạn có bộ điều khiển RAID thông minh và các công cụ khác mà nó biết nhiều hơn hạt nhân về các mẫu truy cập tốt nhất. Thời hạn không phải là xấu. –

-5

Nhân Linux không tự động thay đổi Bộ lập lịch IO vào thời gian chạy. Bởi điều này tôi có nghĩa là, hạt nhân Linux, như của ngày hôm nay, không thể tự động chọn một "tối ưu" lịch trình tùy thuộc vào loại lưu trữ thứ cấp phát sinh. Trong khi khởi động, hoặc trong thời gian chạy, có thể thay đổi bộ lập lịch IO theo cách thủ công.

Trình lên lịch mặc định được chọn khi khởi động dựa trên nội dung trong tệp có tại /linux-2.6 /block/Kconfig.iosched. Tuy nhiên, có thể thay đổi bộ lập lịch IO trong thời gian chạy bằng cách echo nhập tên bộ lập lịch hợp lệ vào tệp nằm tại/sys/block/[DEV]/queue/scheduler. Ví dụ: echo deadline > /sys/block/hda/queue/scheduler

+7

Tôi không hiểu tại sao câu trả lời này xứng đáng với rất nhiều downvotes. Nó không phải là thực sự không chính xác. – DepressedDaniel

+0

@DepressedDaniel xem chỉnh sửa – Spookbuster

17

Có thể sử dụng quy tắc udev để cho phép hệ thống quyết định lịch trình dựa trên một số đặc điểm của hw.
Một ví dụ quy tắc udev cho SSD và ổ đĩa không quay khác có thể trông giống như

# set noop scheduler for non-rotating disks 
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop" 

bên trong một quy tắc udev mới tập tin (ví dụ, /etc/udev/rules.d/60-ssd-scheduler.rules). Câu trả lời này được dựa trên debian wiki

Để kiểm tra xem đĩa SSD sẽ sử dụng các quy tắc, nó có thể kiểm tra các thuộc tính kích hoạt trước:

for f in /sys/block/sd?/queue/rotational; do printf "$f "; cat $f; done 
+0

Câu trả lời hay về tự động phát hiện phương tiện không quay và chỉ áp dụng bộ lập lịch IO cho những người đó.Thời hạn được đề xuất không chỉ cho phương tiện truyền thông không quay. Oracle đề xuất thời hạn lập lịch biểu io cho khối lượng công việc cơ sở dữ liệu. Khuyến nghị của Oracle có thể đến từ thực tế là thời hạn có thể xử lý ghi đồng bộ tốt hơn so với các bộ lập lịch IO khác. Hãy tìm ví dụ cho/sys/block/sdX/queue/iosched/write_starved "deadline" scheduler tunable (không có khả năng điều chỉnh cho lần đọc). Cơ sở dữ liệu có thể có hiệu suất kém nếu việc ghi lại đồng bộ hóa của nó không đến nhanh chóng. – Tagar

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