설정
내 NAS 서버(ubuntu 서버 14.04)에 연결된 4개의 드라이브가 포함된 USB 인클로저(Buffalo DriveStation Quad)가 있습니다. 섀시는 JBOD 모드로 구성되어 있으므로 Linux의 모든 디스크가 표시됩니다.
두 개의 디스크(sdb 및 sdc)는 소프트웨어 raid /dev/md0
(raid1)를 사용하여 구성됩니다. ext4 파일 시스템을 사용하여 /dev/md0
단일 파티션( )으로 마운트되며 로깅 이 필요하지 않습니다./mnt/part1
다른 두 개의 디스크(sdd 및 sde)는 LVM을 사용하여 볼륨 그룹으로 설정되었으며, 여기에서 두 개의 논리 파티션을 마운트했습니다. 그 중 하나는 전체 볼륨 그룹 용량의 90%( )이고 /mnt/part2
, 다른 하나는 10%( /mnt/part3
)입니다. 둘 다 ext4이며 로깅이 없습니다.
APM 문제
내 문제는 하드 드라이브 헤드가 몇 분마다 매우 자주 고정되는 것을 발견했기 때문에 기본 APM 모드에서 시작되었습니다. 주제에 대해 조사한 후 결국 hdparm -B198 /dev/sd[bcde]
.
잠을 잤나요?
현재 상황에 만족하지만, 활동이 없으면 잠에 드는 드라이브도 있었으면 좋겠습니다. 특히 sdb 및 sdc( /mnt/part1
)는 실제로 95%의 시간 동안 어떤 활동도 수행하지 않습니다. 아무리 노력해도 드라이브가 1~2분 이상 절전 모드로 전환되지 않는 것이 문제인 것 같습니다.
모든 파티션을 마운트 해제하고 명령을 실행하면 hdparm -y /dev/sd[bcde]
드라이브가 절전 모드로 전환되지만 몇 분 동안만 가능합니다. 그러면 그들은 하나둘씩 깨어날 것이다. block_dump( )를 활성화하여 문제 디버깅을 시도했지만 echo 1 > /proc/sys/vm/block_dump
디스크에 대한 액세스가 표시되지 않았습니다.
hdparm -B255 /dev/sd[bcde]
또한 APM을 비활성화 한 다음 잠자기 명령을 사용해 보았지만 여전히 동일합니다. 드라이브는 몇 분 후에도 계속 깨어납니다.
저는 데몬 모드로 실행하고 있지 않으며 mdadm
(하루에 한 번만 확인) 드라이브를 조사하는 다른 어떤 것도 있어서는 안 됩니다. 그럼 다음에 무엇을 시도해 볼지에 대한 아이디어가 있나요? Buffalo USB 케이스가 형편없나요?
업데이트 #1
문제가 발생한 후 디스크가 깨어나는 데 걸리는 시간을 이해하는 데 시간을 보냈습니다 hdparm -y /dev/sd[bc]
. 다음 타임스탬프는 패턴을 보여줍니다.
00:00 hdparm -y /dev/sd[bc]
00:40 disks start to wake up
00:59 disks fully awake
01:00 hdparm -y /dev/sd[bc]
03:40 disks start to wake up
03:59 disks fully awake
04:00 hdparm -y /dev/sd[bc]
06:40 disks start to wake up
06:59 disks fully awake
즉, 뭔가가 3분마다 디스크를 확인/깨우고 있는 것 같습니다. 대기 모드로 진입하는 첫 번째 명령은 체크포인트로부터 정확히 40초 후입니다.
업데이트 #2
재시작 시스템을 사용하십시오 acpi=off apm=off
. 도움이 되지 않습니다. 그건 그렇고, 기계는 Lenovo L520 노트북입니다. 누군가가 관련성이 있다고 생각하는 경우를 대비하여.
답변1
약간 과잉일 수 있지만 SystemTap
해당 디스크에서 I/O를 수행하는 프로세스를 식별하는 데 도움이 될 수 있습니다.
SystemTap 준비
[root@localhost ~]# stap-prep
snip
추적 스크립트 설치
[root@localhost ~]# cat >/tmp/traceio2.stp
#! /usr/bin/env stap
global device_of_interest
probe begin {
/* The following is not the most efficient way to do this.
One could directly put the result of usrdev2kerndev()
into device_of_interest. However, want to test out
the other device functions */
dev = usrdev2kerndev($1)
device_of_interest = MKDEV(MAJOR(dev), MINOR(dev))
}
probe vfs.write, vfs.read
{
if (dev == device_of_interest)
printf ("%s(%d) %s 0x%x\n",
execname(), pid(), ppfunc(), dev)
}
모니터링하려는 장치 ID를 찾으세요. 이 경우에는 /dev/sda5를 모니터링하겠습니다.
[root@localhost ~]# df -k /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 18141508 16293424 903496 95% /
[root@localhost ~]# ls -l /dev/sda5
brw-rw----. 1 root disk 8, 5 Jul 1 01:21 /dev/sda5
[root@localhost ~]#
16진수 메이저 + 마이너 숫자(8,5)를 사용하여 모니터링합니다. 범인을 찾아보세요. 가지고 있다
[root@localhost ~]# /tmp/traceio2.stp 0x805
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
lightdm(503) vfs_write 0x800005
bash(3036) vfs_read 0x800005
bash(3036) vfs_read 0x800005
^C
[root@localhost ~]#