원문 보기: https://dawoum.duckdns.org/wiki/I/O_scheduling
Input/output (I/O) scheduling은 컴퓨터 운영 시스템이 입출력 작업을 저장소 볼륨에 제출하는 순서를 결정하기 위해 사용하는 방법입니다. 입출력 스케줄링은 때때로 디스크 스케줄링이라고 불립니다.
Configurations
보통, 커널에서 제공하는 것만 사용할 수 있기 때문에, 현재 설정과 변경할 수 있는 것을 확인할 필요가 있습니다.
먼저, 디스크를 확인합니다:
- lsblk
이제 시스템에 설치된 디스크 디바이스를 확인했으니, 해당 디바이스의 IO 스케줄러 설정을 확인합니다:
- cat /sys/block/sda/queue/scheduler
│ File: /sys/block/sda/queue/scheduler
───────┼──────────────────────────────────────────────────────────────────────
1 │ none mq-deadline [adios]
현재 시스템에 사용할 수 있는 것이 3개 있고, 설정된 값은 대괄호로 감싸고 있습니다.
처음에는 mq-deadline으로 설정된 것을 adios로 바꾸었습니다.
이제 특정 디바이스를 다른 스케줄러로 바꾸기 위해,
- sudo mq-deadline > /sys/block/sda/queue/scheduler
다음으로 부팅 때, 설정을 적용하기 위해, udev 규칙을 만들 필요가 있습니다:
- sudo vi /etc/udev/rules.d/60-ioschedulers.rules
# HDD
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
# SSD
ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="adios"
# NVMe SSD
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
아치 리눅스에서는 HDD에 대해 bfq, SSD에 대해 bfq, 및 NVME SSD에 대해 none을 사용할 것을 권장합니다.
데비안에서는 6.13 커널을 컴파일했을 때, 디바이스에 상관없이 모두 mq-deadline으로 설정되어 있었고, adios는 새롭게 만들어지고 있는 IO 스케줄러입니다. 커널 종류에 따라 adios는 없을 수 있으며, 필요하다면, 직접 모듈로 만들 수 있습니다:
Udev 규칙을 적용하기 위해, 컴퓨터를 재시작하거나, udevadm을 사용해서 부팅 없이 적용할 수 있습니다:
- sudo udevadm control --reload
- sudo udevadm trigger
따라서 최근 커널에서는 배포판에서 기본으로 제공하는 스케줄러를 사용하는 것이 좋습니다.
Purpose
입출력 스케줄링은 보통 디스크 헤드의 현재 위치에서 멀리 떨어진 곳에 배치된 요청에 대해 긴 접근 시간을 가지는 하드 디스크 드라이브와 함께 작동해야 합니다 (이 작업을 탐색이라고 합니다). 시스템 성능에 미치는 영향을 최소화하기 위해, 대부분의 입출력 스케줄러는 들어오는 무작위로 정렬된 요청을 재배열하는 엘리베이터 알고리즘의 변형을 구현하여 관련 데이터에 최소한의 헤드 움직임으로 접근할 수 있습니다.
입출력 스케줄러는 목표에 따라 많은 목적을 가질 수 있습니다; 공통적인 목적에는 다음이 포함됩니다:
- 하드 디스크에 의해 낭비되는 시간을 최소화하기 위해
- 특정 프로세스의 입출력 요청 우선 순위 지정하기 위해
- 실행 중인 각 프로세스에 디스크 대역폭의 할당을 부여하기 위해
- 특정 요청이 특정 기한 전에 발행될 것을 보장하기 위해
Disciplines
공통적인 스케줄링 분야는 다음을 포함합니다:
Common scheduling disciplines include the following:
- Random scheduling (RSS)
- First In, First Out (FIFO), also known as First Come First Served (FCFS)
- Last In, First Out (LIFO)
- Shortest seek first, also known as Shortest Seek / Service Time First (SSTF)
- Elevator algorithm, also known as SCAN (including its variants, C-SCAN, LOOK, and C-LOOK)
- N-Step-SCAN SCAN of N records at a time
- FSCAN, N-Step-SCAN where N equals queue size at start of the SCAN cycle
- Budget Fair Queueing (BFQ) scheduler on Linux
- Completely Fair Queuing (CFQ) scheduler on Linux
- Anticipatory scheduling
- Noop scheduler
- Deadline scheduler
- mClock scheduler
- Kyber
- NONE (used for NVM Express drives)
- mq-deadline (used for SSD SATA drives)
- cfq bfq and bfq-mq (used for HDD drives)