디스크가 마운트되지 않은 경우에도(USB 인클로저에) 계속 깨어남

디스크가 마운트되지 않은 경우에도(USB 인클로저에) 계속 깨어남

설정

내 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 ~]#

관련 정보