Chọn bộ lập lịch I / O Linux


82

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:

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

rằng mặc định là bộ lập lịch xếp hàng hoàn toàn công bằng. Điều tôi tự hỏi là nếu có bất kỳ công dụng nào trong việc bao gồm cả bốn bộ lập lịch trong nhân tùy chỉnh của tôi. Có vẻ như sẽ không có nhiều điểm khi 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 đúng phần cứng, cụ thể là bộ lập lịch 'noop' cho ổ đĩa flash và một trong những bộ lập lịch khác cho truyền thống ổ cứng.

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

Câu trả lời:


109

Như đã nêu trong tài liệu /usr/src/linux/Documentation/block/switching-sched.txt, bộ lập lịch I / O trên bất kỳ thiết bị khối cụ thể nào có thể được thay đổi trong thời gian chạy. Có thể có một số độ trễ do các yêu cầu của người lập lịch trước đó đều được 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 là sẽ có một công cụ lập lịch duy nhất để đáp ứng mọi nhu cầu. Nó dường như chưa tồn tại. Kernel thường không có đủ kiến ​​thức để chọn bộ lập lịch tốt nhất cho khối lượng công việc của bạn:

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

Mặc định đã có anticipatorytrong một thời gian dài, và nó đã nhận được rất nhiều điều chỉnh, nhưng đã bị gỡ bỏ vào 2.6.33 (đầu năm 2010). cfqđã trở thành mặc định cách đây một thời gian, vì hiệu suất của nó hợp lý và công bằng là mục tiêu tốt cho các hệ thống nhiều người dùng (và thậm chí cả máy tính để bàn một người dùng). Đố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ó các mẫu truy cập và lập lịch đặc biệt của riêng mình, và thường là dịch vụ quan trọng nhất (vì vậy ai quan tâm đến sự công bằng?) - anticipatorycó lịch sử lâu dài là có thể điều chỉnh được để đạt hiệu suất tốt nhất trên các khối lượng công việc này và deadlinerất nhanh chóng chuyển tất cả các yêu cầu đến thiết bị bên dưới.


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 ổ đĩa flash hoặc netbook của tôi chạy ra đĩa flash vì ổ đĩa chính của nó thì liệu hạt nhân có đủ thông minh để chọn noop thay vì cfq mặc định không? Hay là hoàn toàn phụ thuộc vào tôi để làm điều đó theo cách thủ công?
Robert S. Barnes

3
Bạn có thể 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 nếu tự động sử dụng nooptrên phương tiện không quay, nhưng hạt nhân không có chức năng đó. Nó có khả năng phát hiện các phương tiện không quay, nhưng nó không đáng tin cậy vì một số đĩa tự báo cáo sai và dù sao thì nó vẫn chưa được kết nối với mã bộ lập lịch I / O.
ephemient

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

@Dani_l Bạn nên mở rộng điều đó và thêm nó làm câu trả lời.
Robert S. Barnes

1
Có cách nào để thay đổi nó cho tất cả các ổ đĩa cùng một lúc trong thời gian chạy không? Tương tự như vậy, thiết lập bộ lập lịch mặc định bằng dòng lệnh nhân tham số "thang máy". Cảm ơn.
SkyRaT

20

Có thể sử dụng quy tắc udev để cho phép hệ thống quyết định bộ lập lịch dựa trên một số đặc điểm của hw.
Một quy tắc udev mẫu cho SSD và các ổ đĩ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 tệp quy tắc udev mới (ví dụ /etc/udev/rules.d/60-ssd-scheduler.rules:). Câu trả lời này dựa trên debian wiki

Để kiểm tra xem các đĩa ssd có sử dụng quy tắc hay không, bạn có thể kiểm tra trước thuộc tính trigger:

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

Câu trả lời tuyệt vời về việc 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 phương tiện đó. Hạn chót được khuyến nghị không chỉ đối với vật liệu không quay. Oracle khuyến nghị bộ lập lịch deadline io cho khối lượng công việc cơ sở dữ liệu. Khuyến nghị này của Oracle có lẽ xuất phát từ thực tế là thời hạn có thể xử lý việc ghi đồng bộ tốt hơn 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" có thể điều chỉnh bộ lập lịch (không thể điều chỉnh như vậy cho các lần đọc). Cơ sở dữ liệu có thể có hiệu suất kém nếu quá trình ghi làm lại đồng bộ của nó không diễn ra nhanh chóng.
Tagar

7

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

Trên phần cứng cấp máy chủ hiện đại, chỉ có cái noop mới tỏ ra hữu ích. Những người khác có vẻ chậm hơn trong các thử nghiệm của tôi.


Làm thế nào để bạn thực sự thay đổi nó trong thời gian chạy?
Robert S. Barnes

hiệu suất của noop so với các bộ lập lịch khác phụ thuộc rất nhiều vào phần cứng và tải cụ thể. Vì tò mò, bạn đã chạy những đĩa, bộ điều khiển và thử nghiệm nào?
ephemient

1
Vâng, không tốt khi bạn có bộ điều khiển RAID thông minh và những thứ 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. Hạn chót cũng không tệ.
Zan Lynx

1
Đây hoàn toàn là một bài tập học tập đối với tôi, trong đó tôi đang cố gắng cấu hình hạt nhân khởi động nhỏ nhất và nhanh nhất có thể để cung cấp tất cả các chức năng tôi cần trên máy tính xách tay của mình. Tôi đã xem cả "Phát triển nhân Linux" và "Trình điều khiển thiết bị Linux cần thiết" và không tìm thấy câu trả lời thỏa đáng cho câu hỏi này, hạt nhân thông minh như thế nào trong việc chọn một Bộ lập lịch trong thời gian chạy hay nó chỉ luôn sử dụng mặc định trừ khi bạn tự đặt nó thành thứ gì khác?
Robert S. Barnes

ephemient> trên bộ điều khiển DELL PERC, cũng trên DELL Powervault MD3000. Nó có vẻ tốt hơn so với mặc định (CFQ) trên cả hai.
MarkR

0

Bạn có thể đặt điều này khi khởi động bằng cách thêm tham số "thang máy" vào cmdline hạt nhân (chẳng hạn như trong grub.cfg)

Thí dụ:

elevator=deadline

Điều này sẽ làm cho "deadline" trở thành bộ lập lịch I / O mặc định cho tất cả các thiết bị khối.

Nếu bạn muốn truy vấn hoặc thay đổi bộ lập lịch sau khi hệ thống đã khởi động hoặc muốn sử dụng bộ lập lịch khác cho một thiết bị khối cụ thể, tôi khuyên bạn nên cài đặt và sử dụng công cụ ioschedset để thực hiện việc này dễ dàng.

https://github.com/kata198/ioschedset

Nếu bạn đang sử dụng Archlinux, nó có sẵn sau:

https://aur.archlinux.org/packages/ioschedset

Một số ví dụ sử dụng:

# Get i/o scheduler for all block devices
[username@hostname ~]$ io-get-sched
sda:    bfq
sr0:    bfq

# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none

# Set sda to use "kyber"
[username@hostname ~]$ io-set-sched kyber /dev/sda
Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:
+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change
[username@hostname ~]$ io-get-sched
sda:    kyber
sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ io-set-sched deadline
Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!
+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda
[username@hostname ~]$ io-get-sched sda
sda:    mq-deadline

Cách sử dụng nên được tự giải thích. Các công cụ này là độc lập và chỉ yêu cầu bash.

Hi vọng điêu nay co ich!

EDIT: Tuyên bố từ chối trách nhiệm, đây là những kịch bản tôi đã viết.


-3

Nhân Linux không tự động thay đổi Bộ lập lịch IO tại thời điểm chạy. Ý tôi là, hạt nhân Linux, cho đến ngày nay, không thể tự động chọn một bộ lập lịch "tối ưu" tùy thuộc vào loại thiết bị lưu trữ thứ cấp. Trong quá trình 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 .

Bộ lập lịch mặc định được chọn khi khởi động dựa trên nội dung trong tệp nằm 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 echonhậ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


8
Tôi không hiểu tại sao câu trả lời này lại xứng đáng nhận được nhiều phiếu phản đối như vậy. Nó không thực sự không chính xác.
Trầm cảmDaniel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.