[linux] Linux I / O 스케줄러 선택

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

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

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

이것이 사실입니까?



답변

에 설명 된대로 /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모든 요청을 기본 장치로 매우 빠르게 전달합니다.


답변

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


답변

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

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


답변

커널 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 만 필요합니다.

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

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


답변

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

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


답변