문제

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

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

기본값은 완전히 공정한 대기열 스케줄러입니다. 내가 궁금해하는 것은 내 맞춤형 커널에 4 개의 스케줄러를 모두 포함시키는 데 사용되는지입니다. 커널이 올바른 하드웨어에 대한 올바른 스케줄러, 특히 플래시 기반 드라이브 용 '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를 재조정하려고하는 자원 낭비 인 메모리 지원 블록 장치 (예 : Ramdisks) 및 기타 비 방사적 미디어 (Flash)에 가장 적합한 선택입니다.
  • 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

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

최신 서버 등급 하드웨어에서는 Noop One만이 유용한 것으로 보입니다. 다른 사람들은 내 테스트에서 느리게 보입니다.

커널 cmdline (grub.cfg)에 "엘리베이터"매개 변수를 추가하여 부팅시 설정을 설정할 수 있습니다.

예시:

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 커널은 오늘 현재 2 차 스토리지 고집 유형에 따라 "최적"스케줄러를 자동으로 선택할 수 없습니다. 스타트 업 또는 런타임 중에 IO 스케줄러를 변경할 수 있습니다. 수동으로.

기본 스케줄러는 /linux-2.6에있는 파일의 내용을 기반으로 스타트 업에서 선택됩니다. /block/kconfig.iosched. 그러나 런타임 중에 IO 스케줄러를 변경할 수 있습니다. echo/sys/block/[dev]/queue/scheduler에있는 파일에 유효한 스케줄러 이름을 설정합니다. 예를 들어, echo deadline > /sys/block/hda/queue/scheduler

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top