Linux I / O 스케줄러 선택


Answers

/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

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

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

기본값은 오랜 시간 동안 anticipatory 를 보였으며 많은 조정을 받았지만 2.6.33 (2010 년 초)에 제거되었습니다. cfq 는 성능이 합리적이고 공정성이 다중 사용자 시스템 (심지어 단일 사용자 데스크탑)의 좋은 목표이기 때문에 얼마전에는 기본값이되었습니다. 일부 시나리오의 경우 - 데이터베이스는 이미 고유 한 일정 및 액세스 패턴을 갖고있는 경향이 있고 흔히 가장 중요한 서비스 (공정성에 관심이있는 사람) 때문에 예를 들어 자주 사용됩니다. 이러한 작업 부하에서 최고의 성능을 발휘할 수 있도록 조정 가능하며, deadline 은 모든 요청을 기본 장치로 신속하게 전달합니다.

Question

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

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

기본값은 완전히 공정한 대기열 스케줄러입니다. 내가 궁금해하는 점은 커스텀 커널에 4 개의 스케쥴러를 모두 포함시켜야한다는 것이다. 커널이 정확한 하드웨어, 특히 플래시 기반 드라이브를위한 'noop'스케줄러와 전통을위한 다른 스케줄러 중 하나를위한 올바른 스케줄러를 선택하기에 충분히 똑똑하지 않은 한, 하나 이상의 스케줄러가 컴파일되는 데 많은 포인트가 없다. 하드 드라이브.

이 경우인가요?




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 rules 파일 (예 : /etc/udev/rules.d/60-ssd-scheduler.rules ) 내에 있습니다. 이 답변은 wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler 기반으로합니다.

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

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



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

현대의 서버급 하드웨어에서는 아무런 도움이되지 않을뿐입니다. 다른 것들은 내 테스트에서 느린 것 같습니다.




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

기본 스케줄러는 /linux-2.6/block/Kconfig.iosched에있는 파일의 내용에 따라 시작시 선택됩니다. 그러나 실행 스케줄러는 / sys / block / [DEV] / queue / scheduler에있는 파일에 유효한 스케줄러 이름을 echo 하여 변경할 수 있습니다. 예를 들어, echo deadline > /sys/block/hda/queue/scheduler