거의 동일한 문제가 발생했습니다.에 설명된 것 중 하나아쿠벤투지역 사회.
이 질문을 게시한 사용자와 마찬가지로 내 시스템에는 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
.
이 검토는 도움이 되기는 하지만 다음을 포함하여 몇 가지 답이 없는 질문을 남깁니다.
- 문제를 일으키는 구체적인 결함은 무엇이며 어디에 있습니까?
- 결함을 방지하기 위해 해결 방법에 어떤 변경 사항이 적용되었습니까?
- 이 해결 방법으로 인해 어떤 기능이나 기타 원하는 효과가 손실됩니까?
- 특히 적절한 솔루션을 제공하려면 커널, 저장 매체 펌웨어, 시스템 펌웨어(예: UEFI/BIOS) 또는 기타 구성 요소 중 무엇을 수정해야 합니까?
어떤 의견이라도 이 혼란의 전부 또는 일부를 해결하는 데 도움이 될 것입니다.
답변1
내부의 코드 주석drivers/nvme/host/core.c
Linux 커널 소스 코드에서 가장 잘 설명되는 것 같습니다.
/*
* 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 컨트롤러 내에서 상태 전환 규칙을 구성합니다.
- 문제를 일으키는 구체적인 결함은 무엇이며 어디에 있습니까?
이 특정 Kingston NVMe SSD는 절전 모드 해제 시간 예측에 대해 너무 낙관적이거나 충분히 깊은 절전 상태에 들어간 후(컨트롤러를 완전히 재설정하지 않고) 절전 모드에서 해제되지 않는 것 같습니다. APST 사용 권한이 부여되면 일종의 절전 상태로 들어갔다가 지정된 시간 내에 작동 상태로 돌아가지 못해 커널이 불행해집니다.
- 결함을 방지하기 위해 해결 방법에 어떤 변경 사항이 적용되었습니까?
APST 전원 관리 상태에서 깨어나는 데 허용되는 최대 시간은 정확히 0마이크로초이므로 APST 기능이 비활성화됩니다.
- 이 해결 방법으로 인해 어떤 기능이나 기타 원하는 효과가 손실됩니까?
NVMe 컨트롤러의 자율 전원 관리 기능을 사용할 수 없는 경우 컨트롤러는 커널에서 명시적으로 요청할 때만 절전 상태로 들어갈 수 있습니다. 이는 에너지 절약이 APST를 사용할 때만큼 크지 않을 것임을 의미합니다.
- 특히 사용자가 올바른 솔루션을 경험할 수 있도록 커널, 저장 매체 펌웨어, 시스템 펌웨어(예: UEFI/BIOS) 또는 기타 구성 요소 중 무엇을 수정해야 합니까?
가장 좋은 해결책은 Kingston이 APST 전원 관리가 제대로 작동하도록 하는 NVMe 디스크 펌웨어 업데이트를 제공하거나 적어도 드라이브가 제공할 수 없는 것을 약속하지 않도록 하는 것입니다. 즉, APST 모드로의 지나치게 낙관적인 전환 시간을 발표하지 않도록 하는 것 및/또는 사용 중 컨트롤러 오작동을 일으키는 APST 모드에 대해서는 전혀 발표하지 않습니다.
가장 깊은 절전 상태를 완전히 방지하도록 APST를 프로그래밍하여 문제를 피할 수 있는 것으로 밝혀지면 보다 구체적인 커널 수준 해결 방법을 만드는 것이 가능할 수 있습니다. Linux 커널의 많은 장치 드라이버에는 특정 하드웨어 모델에 대한 해결 방법을 지정하는 "이상한 테이블"이 있습니다. NVMe의 경우 다음을 수행할 수 있습니다.drivers/nvme/host/pci.c
Linux 커널 소스 코드에서:
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 드라이버 유지 관리 담당자와 논의해야 할 수도 있습니다.