NVMe 디스크 문제 해결


이 문서에는 비휘발성 메모리 표현식(NVMe) 인터페이스가 있는 디스크를 사용할 때 발생할 수 있는 오류가 나와 있습니다.

로컬 SSD 및 영구 디스크(영구 디스크 또는 Google Cloud Hyperdisk)에 대해 NVMe 인터페이스를 사용할 수 있습니다. Tau T2A, M3, C3, C3D, H3과 같은 최신 머신 시리즈만 Persistent Disk용 NVMe 인터페이스를 사용합니다. 또한 컨피덴셜 VM은 Persistent Disk용 NVMe를 사용합니다. 다른 모든 Compute Engine 머신 시리즈는 영구 디스크에 대해 SCSI 디스크 인터페이스를 사용합니다.

I/O 작업 시간 초과 오류

I/O 시간 초과 오류가 발생하는 경우 NVMe 기기에 제출된 I/O 작업에 대해 지연 시간이 기본 시간 초과 매개변수를 초과할 수 있습니다.

오류 메시지:

[1369407.045521] nvme nvme0: I/O 252 QID 2 timeout, aborting
[1369407.050941] nvme nvme0: I/O 253 QID 2 timeout, aborting
[1369407.056354] nvme nvme0: I/O 254 QID 2 timeout, aborting
[1369407.061766] nvme nvme0: I/O 255 QID 2 timeout, aborting
[1369407.067168] nvme nvme0: I/O 256 QID 2 timeout, aborting
[1369407.072583] nvme nvme0: I/O 257 QID 2 timeout, aborting
[1369407.077987] nvme nvme0: I/O 258 QID 2 timeout, aborting
[1369407.083395] nvme nvme0: I/O 259 QID 2 timeout, aborting
[1369407.088802] nvme nvme0: I/O 260 QID 2 timeout, aborting
...

해결 방법:

이 문제를 해결하려면 제한 시간 매개변수의 값을 늘립니다.

  1. 제한 시간 매개변수의 현재 값을 확인합니다.

    1. 영구 디스크나 로컬 SSD 볼륨에서 사용하는 NVMe 컨트롤러를 확인합니다.
      ls -l /dev/disk/by-id
      
    2. 디스크에 대한 io_timeout 설정(초)을 표시합니다.

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      다음을 바꿉니다.

      • CONTROLLER_ID: NVMe 디스크 컨트롤러의 ID입니다. 예를 들면 nvme1입니다.
      • NAMESPACE: NVMe 디스크의 네임스페이스입니다. 예를 들면 nvme1n1입니다.

      NVMe를 사용하는 단일 디스크만 있는 경우 다음 명령어를 사용합니다.

      cat /sys/class/nvme/nvme0/nvme0n1/queue/io_timeout
      

  2. NVMe 기기에 제출된 I/O 작업의 제한 시간 매개변수를 늘리려면 /lib/udev/rules.d/65-gce-disk-naming.rules 파일에 다음 줄을 추가한 후 VM을 다시 시작합니다.

    KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", ATTRS{model}=="nvme_card-pd", ATTR{queue/io_timeout}="4294967295"
    

분리된 디스크가 계속 컴퓨팅 인스턴스 운영체제에 표시됨

Linux 커널 버전 6.0~6.2를 사용하는 VM에서 Compute Engine API 메서드 instances.detachDisk 또는 gcloud compute instances detach-disk 명령어와 관련된 작업이 예상대로 작동하지 않을 수 있습니다. Google Cloud 콘솔에서는 기기가 삭제된 것으로 표시하고 컴퓨팅 인스턴스 메타데이터(compute disks describe 명령어)에서는 기기가 삭제된 것으로 표시하지만 기기 마운트 지점 및 udev 규칙에 의해 생성된 모든 심볼릭 링크는 게스트 운영체제에 계속 표시됩니다.

오류 메시지:

VM의 분리된 디스크에서 읽기를 시도하면 I/O 오류가 발생합니다.

sudo head /dev/nvme0n3

head: error reading '/dev/nvme0n3': Input/output error

문제:

Linux 6.0~6.2 커널을 사용하지만 NVMe 수정 백포트가 포함되지 않는 운영체제 이미지는 NVMe 디스크가 분리된 시기를 인식할 수 없습니다.

해결 방법:

VM을 재부팅하여 디스크 삭제 프로세스를 완료합니다.

이 문제를 방지하려면 이 문제가 없는 Linux 커널 버전의 운영체제를 사용합니다.

  • 5.19 이전
  • 6.3 이상

게스트 OS에서 uname -r 명령어를 사용하여 Linux 커널 버전을 볼 수 있습니다.

로컬 SSD 디스크를 C3 또는 C3D VM에 연결하는 경우 추가 단계를 수행하여 로컬 SSD 디스크에 대한 심볼릭 링크를 만들어야 할 수도 있습니다. 이러한 단계는 Google Cloud에서 제공하는 다음 공개 이미지 중 하나를 사용하는 경우에만 필요합니다.

  • SLES 15 SP4 및 SP5
  • SLES 12 SP4

이러한 추가 단계는 로컬 SSD 디스크에만 적용됩니다. Persistent Disk 볼륨에는 아무 작업도 수행할 필요가 없습니다.

이전에 나열된 공개 Linux 이미지에는 C3 및 C3D VM에 연결된 로컬 SSD 기기에 대한 심볼릭 링크를 만들 수 있는 올바른 udev 구성이 없습니다. 커스텀 이미지에도 C3 및 C3D VM에 연결된 로컬 SSD 기기의 심볼릭 링크를 만드는 데 필요한 필수 udev 규칙이 포함되지 않을 수 있습니다.

다음 안내에 따라 SUSE 또는 커스텀 이미지의 udev 규칙을 추가합니다.

  1. udev 규칙 디렉터리를 찾습니다. 일반적으로 /lib/udev/rules.d 또는 /usr/lib/udev/rules.d입니다. 이미지에 다른 udev 규칙 디렉터리가 있을 수 있습니다.
  2. udev 규칙 디렉터리에서 65-gce-disk-naming.rules 파일을 찾습니다.
  3. 65-gce-disk-naming.rules 파일에 다음 줄이 포함되어 있으면 이미지에서 새 규칙을 지원하고 개발자가 여기서 중지할 수 있습니다.

    KERNEL=="nvme*n*", ATTRS{model}=="nvme_card[0-9]*",IMPORT{program}="google_nvme_id -d $tempnode"
    
  4. 위 줄이 없거나 65-gce-disk-naming.rules 파일이 없으면 기존 파일을 바꾸거나 https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules URL의 파일 콘텐츠로 새 파일을 만듭니다. 이 파일에는 이전 단계의 줄과 Compute Engine 디스크 이름을 지정하는 데 필요한 기타 규칙을 포함하여 업데이트된 65-gce-disk-naming.rules 파일 콘텐츠가 포함됩니다. 예를 들면 다음과 같습니다.

    sudo curl -o 65-gce-disk-naming.rules https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/rules.d/65-gce-disk-naming.rules
    
  5. udev 디렉터리로 이동합니다.

  6. udev 디렉터리에서 google_nvme_id 파일을 찾습니다.

  7. 기존 google_nvme_id 파일의 콘텐츠를 바꾸거나 이 URL의 콘텐츠로 새 파일을 만듭니다.

    sudo curl -o google_nvme_id https://raw.githubusercontent.com/GoogleCloudPlatform/guest-configs/20230630.00/src/lib/udev/google_nvme_id
    
  8. google_nvme_id 파일이 실행 가능한지 확인합니다.

    sudo chmod 755 google_nvme_id
    
  9. VM을 재부팅합니다.

  10. 심볼릭 링크가 성공적으로 생성되었는지 확인합니다.

    ls -l /dev/disk/by-id/google-local-nvme-ssd*
    

    인스턴스에 연결된 로컬 SSD와 동일한 수의 링크가 출력에 나열되어야 하며 각 링크는 서로 다른 /dev/nvme 기기 경로를 가리켜야 합니다. 예를 들면 다음과 같습니다.

    lrwxrwxrwx 1 root root 13 Jul 19 22:52 /dev/disk/by-id/google-local-nvme-ssd-0 -> ../../nvme0n1
    lrwxrwxrwx 1 root root 13 Jul 19 22:52 /dev/disk/by-id/google-local-nvme-ssd-1 -> ../../nvme1n1
    

    기기 이름에 대한 자세한 내용은 기기 이름 지정을 참조하세요.

    lsblk를 실행하여 /dev/nvme 기기 경로가 로컬 SSD 기기인지 확인할 수 있습니다. 크기가 375G인 NVMe 기기는 로컬 SSD 기기입니다.

다음 단계