Linux I / O 스케줄러 선택


82

/ sys / block / [disk] / queue / scheduler에 작성하여 실행중인 커널의 특정 장치에 대한 I / O 스케줄러를 변경할 수 있다고 읽었습니다. 예를 들어 내 시스템에서 볼 수 있습니다.

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

기본값은 완전히 공정한 대기열 스케줄러입니다. 내가 궁금한 것은 사용자 정의 커널에 네 개의 스케줄러를 모두 포함하는 데 사용이 있는지 여부입니다. 커널이 올바른 하드웨어, 특히 플래시 기반 드라이브에 대한 'noop'스케줄러를 선택하고 다른 하나는 기존의 하드 드라이브.

이것이 사실입니까?

답변:


109

에 설명 된대로 /usr/src/linux/Documentation/block/switching-sched.txt특정 블록 장치의 I / O 스케줄러는 런타임에 변경할 수 있습니다. 새 스케줄러를 사용하기 전에 이전 스케줄러의 요청이 모두 플러시되므로 약간의 지연 시간이있을 수 있지만 장치를 많이 사용하는 동안에도 문제없이 변경할 수 있습니다.

# 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

이상적으로는 모든 요구를 충족시키는 단일 스케줄러가 있습니다. 아직 존재하지 않는 것 같습니다. 커널은 종종 워크로드에 가장 적합한 스케줄러를 선택할 충분한 지식이 없습니다.

  • noop 메모리 지원 블록 장치 (예 : 램 디스크) 및 I / O를 다시 예약하는 것이 리소스 낭비 인 기타 비 회전 미디어 (플래시)에 가장 적합한 선택 인 경우가 많습니다.
  • deadline 대기 시간에 엄격한 제한을 두는 경량 스케줄러입니다.
  • cfq I / O 대역폭의 시스템 전체 공정성을 유지하려고합니다.

기본값은 anticipatory오랜 시간 이었고 많은 조정을 받았지만 2.6.33 (2010 년 초) 에서 제거되었습니다 . cfq성능이 합리적이고 공정성이 다중 사용자 시스템 (및 단일 사용자 데스크톱까지)의 좋은 목표이기 때문에 얼마 전에 기본값이되었습니다. 일부 시나리오 - 그들은 이미 자신의 독특한 스케줄링 및 액세스 패턴을 가지는 경향이 종종 있습니다으로 데이터베이스가 자주 예로 사용되는 가장 중요한 서비스 (그래서 공정성에 대한 관심 누구?) - anticipatory인 조정의 오랜 역사를 가지고 이러한 워크로드에서 최고의 성능을 발휘하고 deadline모든 요청을 기본 장치로 매우 빠르게 전달합니다.


1
좋은 정보, 감사합니다! 그러나 내 기본 질문은 여전히 ​​답이 없습니다. 플래시 드라이브를 연결하거나 넷북이 기본 ​​드라이브이기 때문에 플래시 디스크에서 실행되는 경우 기본 cfq 대신 noop을 선택할 수있을만큼 커널이 똑똑합니까? 아니면 수동으로 수행하는 것이 전적으로 나에게 달려 있습니까?
Robert S. Barnes

3
기본적으로 다른 스케줄러를 사용하도록 커널을 구성 할 수 있습니다. noop회전하지 않는 미디어에서 자동으로 사용 하는 것이 영리 할 수 있지만 커널에는 해당 기능이 없습니다. 회전하지 않는 미디어를 감지하지만 일부 디스크가 자신을 잘못보고하기 때문에 신뢰할 수 없으며 아직 I / O 스케줄러 코드에 연결되지 않았습니다.
ephemient 2009-06-18

8
데비안 위키 ( wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler ) 에서처럼 장치 특성에 따라 스케줄러를 정의하는 udev 규칙을 추가 할 수 있습니다. # 회전하지 않는 디스크에 대한 마감일 스케줄러 설정 ACTION == "add | change ", KERNEL =="sd [az] ", ATTR {queue / rotational} =="0 ", ATTR {queue / scheduler} ="deadline "
Dani_l 2015-06-06

@Dani_l 그것을 확장하고 답변으로 추가해야합니다.
Robert S. Barnes

1
런타임에 모든 드라이브를 한 번에 변경할 수있는 방법이 있습니까? 마찬가지로 커널 명령 줄 매개 변수 "elevator"로 기본 스케줄러를 설정합니다. 감사.
SkyRaT

20

udev 규칙을 사용하여 시스템이 hw의 일부 특성을 기반으로 스케줄러를 결정하도록 할 수 있습니다.
SSD 및 기타 비 회전 드라이브에 대한 udev 규칙의 예는 다음과 같습니다.

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

새 udev 규칙 파일 (예 :) 내부 /etc/udev/rules.d/60-ssd-scheduler.rules. 이 답변은 데비안 위키를 기반으로합니다.

ssd 디스크가 규칙을 사용하는지 확인하려면 미리 트리거 속성을 확인할 수 있습니다.

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

비 회전 미디어 감지 자동화 및 IO 스케줄러 적용에 대한 훌륭한 답변입니다. 기한은 회전하지 않는 미디어에만 권장되는 것이 아닙니다. 오라클은 데이터베이스 워크로드에 대해 마감일 io 스케줄러를 권장합니다. 이 오라클의 권장 사항은 마감일이 다른 IO 스케줄러보다 더 나은 동기 쓰기를 처리 할 수 ​​있다는 사실에서 비롯된 것 같습니다. 예를 들어 / sys / block / sdX / queue / iosched / writes_starved "deadline"스케줄러 튜너 블 (읽기에 대한 튜너 블 없음)을 찾습니다. 동기식 재실행 쓰기가 빠르게 진행되지 않으면 데이터베이스 성능이 저하 될 수 있습니다.
Tagar

7

커널이 다른 커널을 지원하도록하는 목적은 재부팅하지 않고 사용해 볼 수 있다는 것입니다. 그런 다음 시스템을 통해 테스트 워크로드를 실행하고 성능을 측정 한 다음이를 앱의 표준 워크로드로 만들 수 있습니다.

최신 서버급 하드웨어에서는 noop 하나만 유용하게 보입니다. 다른 것들은 내 테스트에서 더 느리게 보입니다.


실제로 런타임에 어떻게 변경합니까?
Robert S. Barnes

다른 스케줄러에 비해 noop의 성능은 하드웨어와 특정 부하에 따라 크게 달라집니다. 호기심으로 어떤 디스크, 컨트롤러 및 테스트를 실행하고 있었습니까?
ephemient 2009-06-18

1
예, noop은 최상의 액세스 패턴에 대해 커널보다 더 많이 알고있는 스마트 RAID 컨트롤러 및 기타 항목이있을 때 좋습니다. 마감일도 나쁘지 않습니다.
Zan Lynx

1
이것은 순전히 내 랩톱에서 필요한 모든 기능을 제공하는 가능한 가장 작고 빠른 부팅 커널을 구성하려는 저에게있어 학습 연습입니다. 저는 "Linux Kernel Development"와 "Essential Linux Device Drivers"를 모두 살펴 봤지만이 질문에 대한 만족스러운 답을 찾지 못했습니다. 런타임에 스케줄러를 선택할 때 커널이 얼마나 똑똑한 지 아니면 항상 기본값을 사용합니까? 수동으로 다른 것으로 설정 했습니까?
Robert S. Barnes

ephemient>는 DELL PERC 컨트롤러와 DELL Powervault MD3000에도 적용되었습니다. 둘 다 기본값 (CFQ)보다 나아 보였습니다.
MarkR

0

커널 cmdline (예 : grub.cfg)에 "elevator"매개 변수를 추가하여 부팅시이를 설정할 수 있습니다.

예:

elevator=deadline

이렇게하면 모든 블록 장치의 기본 I / O 스케줄러가 "마감일"이됩니다.

시스템이 부팅 된 후 스케줄러를 쿼리 또는 변경하거나 특정 블록 장치에 대해 다른 스케줄러를 사용하려면 ioschedset 도구를 설치하여 사용하는 것이 좋습니다 .

https://github.com/kata198/ioschedset

Archlinux를 사용하는 경우 aur에서 사용할 수 있습니다.

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

사용 예 :

# 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

사용법은 자명해야합니다. 이 도구는 독립형이며 bash 만 필요합니다.

도움이 되었기를 바랍니다!

편집 : 면책 조항, 이들은 내가 작성한 스크립트입니다.


-3

Linux 커널은 런타임에 IO 스케줄러를 자동으로 변경하지 않습니다. 즉, 현재 Linux 커널은 보조 스토리지 장치 유형에 따라 "최적"스케줄러를 자동으로 선택할 수 없습니다. 시작 중 또는 런타임 중에 IO 스케줄러를 수동으로 변경할 수 있습니다 .

기본 스케줄러는 /linux-2.6 /block/Kconfig.iosched 에있는 파일의 내용을 기반으로 시작시 선택됩니다 . 그러나 echo/ sys / block / [DEV] / queue / scheduler에있는 파일에 유효한 스케줄러 이름을 입력하여 런타임 중에 IO 스케줄러를 변경할 수 있습니다. 예를 들면echo deadline > /sys/block/hda/queue/scheduler


8
이 답변이 왜 그렇게 많은 반대표를받을 가치가 있는지 모르겠습니다. 실제로 잘못된 것은 아닙니다.
DepressedDaniel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.