Linux에서 NVME APST 문제 명확화

Linux에서 NVME APST 문제 명확화

거의 동일한 문제가 발생했습니다.에 설명된 것 중 하나아쿠벤투지역 사회.

이 질문을 게시한 사용자와 마찬가지로 내 시스템에는 Kingston NVME 디스크가 장착되어 있으며 해당 사용자와 마찬가지로 grub 메뉴에 다음 커널 옵션을 추가하여 문제가 해결되었습니다 nvme_core.default_ps_max_latency_us=0.

사용자가 명시한 해결 방법은 다음과 같습니다.

문제는 SSD 기능인 APST(Autonomous Power State Transition)로 인해 작동이 멈추는 것입니다. 이 문제를 완화하려면 수정 사항이 릴리스될 때까지 옵션 nvme_core.default_ps_max_latency_us=0 에 이 줄을 포함하세요 GRUB_CMDLINE_LINUX_DEFAULT.

이 검토는 도움이 되기는 하지만 다음을 포함하여 몇 가지 답이 없는 질문을 남깁니다.

  1. 문제를 일으키는 구체적인 결함은 무엇이며 어디에 있습니까?
  2. 결함을 방지하기 위해 해결 방법에 어떤 변경 사항이 적용되었습니까?
  3. 이 해결 방법으로 인해 어떤 기능이나 기타 원하는 효과가 손실됩니까?
  4. 특히 적절한 솔루션을 제공하려면 커널, 저장 매체 펌웨어, 시스템 펌웨어(예: UEFI/BIOS) 또는 기타 구성 요소 중 무엇을 수정해야 합니까?

어떤 의견이라도 이 혼란의 전부 또는 일부를 해결하는 데 도움이 될 것입니다.

답변1

내부의 코드 주석drivers/nvme/host/core.cLinux 커널 소스 코드에서 가장 잘 설명되는 것 같습니다.

/*
 * APST (Autonomous Power State Transition) lets us program a table of power
 * state transitions that the controller will perform automatically.
 *
 * Depending on module params, one of the two supported techniques will be used:
 *
 * - If the parameters provide explicit timeouts and tolerances, they will be
 *   used to build a table with up to 2 non-operational states to transition to.
 *   The default parameter values were selected based on the values used by
 *   Microsoft's and Intel's NVMe drivers. Yet, since we don't implement dynamic
 *   regeneration of the APST table in the event of switching between external
 *   and battery power, the timeouts and tolerances reflect a compromise
 *   between values used by Microsoft for AC and battery scenarios.
 * - If not, we'll configure the table with a simple heuristic: we are willing
 *   to spend at most 2% of the time transitioning between power states.
 *   Therefore, when running in any given state, we will enter the next
 *   lower-power non-operational state after waiting 50 * (enlat + exlat)
 *   microseconds, as long as that state's exit latency is under the requested
 *   maximum latency.
 *
 * We will not autonomously enter any non-operational state for which the total
 * latency exceeds ps_max_latency_us.
 *
 * Users can set ps_max_latency_us to zero to turn off APST.
 */
static int nvme_configure_apst(struct nvme_ctrl *ctrl)

따라서 APST는 NVMe 컨트롤러(NVMe SSD 내)가 구성 가능한 규칙에 따라 전원 관리 상태 간에 자동으로 전환할 수 있도록 하는 기능입니다. NVMe 컨트롤러는 각 절전 상태를 시작하고 종료하는 데 걸리는 시간을 마이크로초 단위로 지정합니다. 커널은 이 정보를 사용하여 NVMe 컨트롤러 내에서 상태 전환 규칙을 구성합니다.

  1. 문제를 일으키는 구체적인 결함은 무엇이며 어디에 있습니까?

이 특정 Kingston NVMe SSD는 절전 모드 해제 시간 예측에 대해 너무 낙관적이거나 충분히 깊은 절전 상태에 들어간 후(컨트롤러를 완전히 재설정하지 않고) 절전 모드에서 해제되지 않는 것 같습니다. APST 사용 권한이 부여되면 일종의 절전 상태로 들어갔다가 지정된 시간 내에 작동 상태로 돌아가지 못해 커널이 불행해집니다.

  1. 결함을 방지하기 위해 해결 방법에 어떤 변경 사항이 적용되었습니까?

APST 전원 관리 상태에서 깨어나는 데 허용되는 최대 시간은 정확히 0마이크로초이므로 APST 기능이 비활성화됩니다.

  1. 이 해결 방법으로 인해 어떤 기능이나 기타 원하는 효과가 손실됩니까?

NVMe 컨트롤러의 자율 전원 관리 기능을 사용할 수 없는 경우 컨트롤러는 커널에서 명시적으로 요청할 때만 절전 상태로 들어갈 수 있습니다. 이는 에너지 절약이 APST를 사용할 때만큼 크지 않을 것임을 의미합니다.

  1. 특히 사용자가 올바른 솔루션을 경험할 수 있도록 커널, 저장 매체 펌웨어, 시스템 펌웨어(예: UEFI/BIOS) 또는 기타 구성 요소 중 무엇을 수정해야 합니까?

가장 좋은 해결책은 Kingston이 APST 전원 관리가 제대로 작동하도록 하는 NVMe 디스크 펌웨어 업데이트를 제공하거나 적어도 드라이브가 제공할 수 없는 것을 약속하지 않도록 하는 것입니다. 즉, APST 모드로의 지나치게 낙관적인 전환 시간을 발표하지 않도록 하는 것 및/또는 사용 중 컨트롤러 오작동을 일으키는 APST 모드에 대해서는 전혀 발표하지 않습니다.

가장 깊은 절전 상태를 완전히 방지하도록 APST를 프로그래밍하여 문제를 피할 수 있는 것으로 밝혀지면 보다 구체적인 커널 수준 해결 방법을 만드는 것이 가능할 수 있습니다. Linux 커널의 많은 장치 드라이버에는 특정 하드웨어 모델에 대한 해결 방법을 지정하는 "이상한 테이블"이 있습니다. NVMe의 경우 다음을 수행할 수 있습니다.drivers/nvme/host/pci.cLinux 커널 소스 코드에서:

static const struct pci_device_id nvme_id_table[] = {
    { PCI_VDEVICE(INTEL, 0x0953),   /* Intel 750/P3500/P3600/P3700 */
        .driver_data = NVME_QUIRK_STRIPE_SIZE |
                NVME_QUIRK_DEALLOCATE_ZEROES, },
    { PCI_VDEVICE(INTEL, 0x0a53),   /* Intel P3520 */
        .driver_data = NVME_QUIRK_STRIPE_SIZE |
                NVME_QUIRK_DEALLOCATE_ZEROES, },
    { PCI_VDEVICE(INTEL, 0x0a54),   /* Intel P4500/P4600 */
        .driver_data = NVME_QUIRK_STRIPE_SIZE |
                NVME_QUIRK_DEALLOCATE_ZEROES |
                NVME_QUIRK_IGNORE_DEV_SUBNQN, },
    { PCI_VDEVICE(INTEL, 0x0a55),   /* Dell Express Flash P4600 */
        .driver_data = NVME_QUIRK_STRIPE_SIZE |
                NVME_QUIRK_DEALLOCATE_ZEROES, },
    { PCI_VDEVICE(INTEL, 0xf1a5),   /* Intel 600P/P3100 */
        .driver_data = NVME_QUIRK_NO_DEEPEST_PS |
                NVME_QUIRK_MEDIUM_PRIO_SQ |
                NVME_QUIRK_NO_TEMP_THRESH_CHANGE |
                NVME_QUIRK_DISABLE_WRITE_ZEROES, },
    { PCI_VDEVICE(INTEL, 0xf1a6),   /* Intel 760p/Pro 7600p */
        .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, },
    { PCI_VDEVICE(INTEL, 0x5845),   /* Qemu emulated controller */
        .driver_data = NVME_QUIRK_IDENTIFY_CNS |
                NVME_QUIRK_DISABLE_WRITE_ZEROES |
                NVME_QUIRK_BOGUS_NID, },
    { PCI_VDEVICE(REDHAT, 0x0010),  /* Qemu emulated controller */
        .driver_data = NVME_QUIRK_BOGUS_NID, },
[...]

여기의 다양한 설정은 NVME_QUIRK_드라이버 내의 다양한 해결 코드를 트리거합니다.

NVME_QUIRK_NO_DEEPEST_PS상태가 가장 깊은 전원 관리 상태로 전환되는 것을 방지하는 이상한 설정이 이미 있습니다 . Kingston NVMe의 APST 문제가 Intel 600P/P3100 및 ADATA SX8200PNP에 대해 구현된 해결 방법과 동일한 경우 아래와 같이 새로운 이상한 테이블 항목을 작성하십시오( <angle brackets>내용을 적절한 값으로 바꾸면 다음을 사용할 수 있습니다).lspci -nn):

    { PCI_DEVICE(<PCI vendor ID>, <PCI product ID of the SSD>),   /* <specify make/model of SSD here> */
        .driver_data = NVME_QUIRK_NO_DEEPEST_PS, },

그리고 이 수정 사항을 적용하여 커널을 다시 컴파일하십시오.

분명히 이 SSD 모델을 실제로 소유한 사람은 이를 테스트해야 할 것입니다. C 프로그래밍의 기본 사항과 사용자 정의 커널을 컴파일하는 방법에 익숙하다면 이번이 Linux 커널 기여자의 긴 목록에 귀하의 이름을 추가할 수 있는 기회가 될 수 있습니다! 관심이 있다면 읽어보셔도 좋을 것 같습니다kernelnewbies.org자세한 내용은.

커널 프로그래밍이 항상 복잡할 필요는 없습니다. 적절한 하드웨어와 기본적인 프로그래밍 지식을 갖춘 사람만 있으면 되는 쉬운 부분이 많이 있습니다. 나는 이와 같은 몇 가지 작은 패치를 제출했습니다.

설정으로 NVME_QUIRK_NO_DEEPEST_PS문제가 해결되지 않는 것으로 판명되면 새로운 문제를 구현해야 할 수도 있습니다. 이는 더 복잡할 수 있으며 이 문제를 피하기 위해 정확히 수행해야 할 작업이 무엇인지 알아내기 위해 Kingston의 몇 가지 실험이나 바람직하게는 정보가 필요할 수 있으며 이를 달성하기 위한 최선의 방법에 대해 Linux NVMe 드라이버 유지 관리 담당자와 논의해야 할 수도 있습니다.

관련 정보