IO 스케줄러를 최적화하고 회전하는 드라이브와 회전하지 않는 드라이브(다름)에 적합한 스케줄러를 사용하려고 합니다. 내가 실행할 때 :
cat /sys/block/sd*/queue/rotational
나는 얻다:
1 <-- for sda
1 <-- for sdb
sdb는 USB 플래시 드라이브이지만 회전해서는 안 됩니다.
$ udevadm info -a -n /dev/sda | grep queue
ATTRS{queue_depth}=="31"
ATTRS{queue_ramp_up_period}=="120000"
ATTRS{queue_type}=="simple"
$ udevadm info -a -n /dev/sdb | grep queue
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
따라서 그러한 속성은 없습니다.
ATTR{queue/rotational}=="0" or ...=="1"
답변1
예, 이것은 혼란스러운 질문입니다. 여기에 서신이 있습니다.커널 오류 90761(2015년 보고서) 및 2019년이를 조사한 블로그 게시물. 아마도 이는 전통적인 IO 스케줄러가 모두 그랬기 때문에 단지 외관상의 문제일 뿐입니다.MQ 마감일.. 하지만 상당한 고민 끝에 효과가 있는 규칙을 알아내서 여기에 게시하는 것이 좋겠다고 생각했습니다.
/etc/udev/rules.d/usb-flash-drive-non-rotational.rules
:
# Try to catch USB flash drives and set them as non-rotational. Probably no impact whatsoever : /
# c.f. https://mpdesouza.com/blog/kernel-adventures-are-usb-sticks-rotational-devices/
# Device is already marked as non-rotational, skip over it
ATTR{queue/rotational}=="0", GOTO="skip"
# Device has some sort of queue support, likely to be an HDD actually
ATTRS{queue_type}!="none", GOTO="skip"
# Flip the rotational bit on this removable device and give audible signs of having caught a match
ATTR{removable}=="1", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ACTION=="add", ATTR{queue/rotational}="0"
ATTR{removable}=="1", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/beep -f 70 -r 2"
LABEL="skip"
답변2
hdparm -I
각 디스크에 대해 실행할 수 있습니다 .
hdparm -I /dev/sda
hdparm -I /dev/sdb
이 줄의 출력에 hdparm -I
다음 줄이 포함된 경우:
Nominal Media Rotation Rate: Solid State Device
ATA 스타일 IDENTIFY 응답의 정보를 사용하여 드라이브가 회전할 수 없음을 나타냅니다.
그러나 분명히 이 정보를 쿼리하는 다른 방법이 있으며 커널은 이를 선호하는 것 같습니다. 패키지가 설치되어 있는 경우 sg3_utils
이 명령을 사용하여 커널이 수행하는 것과 동일한 쿼리를 수행할 수 있습니다(적어도 이 글을 쓰는 시점에서는).
sg_inq --vpd --page=0xb1 /dev/sda
응답에 다음 줄이 포함된 경우:
Non-rotating medium (e.g. solid state)
...그런 다음에만 /sys/block/sd*/queue/rotational
속성이 0으로 설정됩니다.
USB 플래시 드라이브가 USB2인 경우 스케줄러 기반 최적화는 USB 프로토콜 비효율성으로 인해 압도될 가능성이 높습니다. 실제 USB3 SuperSpeed 드라이브가 있는 경우에만 이에 대해 걱정하면 됩니다.