설정
내 nas 서버 (ubuntu 서버 14.04)에 4 개의 드라이브가 연결된 USB 인클로저 (Buffalo DriveStation Quad)가 있습니다. 인클로저는 JBOD 모드로 구성되었으므로 Linux에서 모든 디스크를 볼 수 있습니다.
두 개의 디스크 (sdb 및 sdc)는 소프트웨어 raid를 /dev/md0
(raid1) 로 구성합니다 . 그리고 /dev/md0
하나의 파티션 (로 장착 /mnt/part1
저널링없이 ext4에 파일 시스템 포함).
다른 두 개의 디스크 (sdd 및 sde)는 LVM을 하나의 볼륨 그룹으로 설정하여 두 개의 논리 파티션을 마운트했습니다. 그중 하나는 전체 볼륨 그룹 용량의 90 % ( /mnt/part2
)이고 다른 하나는 10 % ( /mnt/part3
)입니다. 둘 다 저널링없이 ext4입니다.
APM 문제
하드 드라이브 헤드가 2 분마다 매우 공격적으로 주차되는 것을 알았으므로 문제는 기본 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
) 를 활성화하여 문제를 디버깅하려고 시도했지만 디스크에 액세스 할 수 없습니다.
또한로 APM을 비활성화 hdparm -B255 /dev/sd[bcde]
하고 그 후에 잠자도록 명령했지만 동일한 기능을 수행했습니다. 여전히 몇 분 후에 드라이브가 깨어납니다.
나는이없는 mdadm
데몬 모드 (하루에 한 번 단지 하나의 체크)에서 실행하거나 드라이브를 프로빙 뭔가가 있어야한다. 다음에 무엇을 시도 해야할지에 대한 아이디어가 있습니까? 버팔로 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
. 도움이되지 않았습니다. Btw, 기계는 Lenovo L520 노트북입니다. 누군가가 관련성을 발견 한 경우를 대비하여.
답변
약간 과잉이지만 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 ~]#