리눅스가 메모리를 제거 할 수 있습니까? 있어도 시스템이 “안전하게”계속

리눅스에는 메모리를 “쓰러 뜨리는”메커니즘이 있습니까? 예를 들어, 불량 램 칩이 설치되어 있어도 시스템이 “안전하게”계속 작동 할 수 있도록 메모리를 테스트하고 영역이 더러워진 것으로 표시합니까?!



답변

대답은 그렇습니다. 투명하게 처리됩니다 (오류를 감지 할 수있는 ECC 메모리가 있고 커널 버전이 2.6.30 이상이면 안전하게 작동합니다).

기본적으로 메모리는 프로세서에서 읽을 때마다 점검되며 ECC (Error Correcting Code)와의 일관성을 확인하기 위해 주기적으로 제거됩니다 *. 오류가 발생하면 Machine Check Exception이 발생하며 mcelog ( http://www.mcelog.org/ )에 의해 기록 및 수집 됩니다.

오류가 수정 가능한 경우, “누설 버킷”카운터가 증가하여 너무 자주 실패하는 물리적 DIMM이 다른 것으로 대체 될 수 있습니다. 따라서 메모리 페이지가 새 위치로 복사되고 가상 메모리 주소가 새 페이지를 가리 키도록 업데이트되며 이전 페이지는 더 이상 사용되지 않는 것으로 OS에 의해 표시됩니다.

이것을 리눅스에서는 “소프트 오프라인”이라고합니다 (Solaris에서는 메모리 페이지 폐기, 다른 OS에 대해서는 모르겠습니다).

그러나 오류를 수정할 수없는 경우 “하드 오프닝”이라는 문제가 발생합니다. 즉, 메모리 페이지가 일반 운영 체제 메모리 관리에서 제거되고 응용 프로그램이 종료됩니다 (NB : 포착 가능한 SIGBUS 신호에 의해 어디에 있는지 알려줍니다) 오류가 발생했지만 신경 쓰지 않고 잡으려고 시도하지 않는 경우는 거의 없습니다.) 메모리 페이지가 파일에서 매핑되고 정리 된 경우 OS는 프로세스를 종료하지 않고 다른 물리적 위치에 투명하게 다시로드 할 수도 있습니다.

mcelog에서 더 많은 내용을 읽을 수 있고, 많은 구성 옵션이 있으며, 다른 동작을 트리거 할 수 있고, 옵션 및 읽을 사항 및 시스템에서 mcelog가 실행 중인지 확인하는 방법에 대한 기타 리드를 얻을 수 있습니다.


* 스크러빙 또는 “Patrol Scrubbing”은 메모리를 읽고 ECC와 비교하여 오류를 확인하고 오류가 발견되면 수정 된 메모리 단어로 덮어 씁니다. 패트롤 스크러빙이라는 용어는 메모리 읽기 오류에서 잘못된 데이터를 덮어 쓰는 데 사용되며, 종종 “요청 스크러빙”이라고도합니다. 스크러빙은 일반적으로 BIOS를 통해 활성화 할 수있는 하드웨어 절차입니다.


답변

이것은 실제로 나쁜 생각입니다. 빠른 스위프에서 메모리를 안정적으로 테스트 할 수 없습니다. 이것이 memtest86과 같은 소프트웨어가 다른 비트 패턴이있는 다중 패스를 사용하여 메모리를 테스트하는 이유입니다. 해결책:

  1. memtest86 , 바람직하게는 긴 테스트를 사용 하여 메모리를 테스트하고 밤새 실행하면 오랜 시간이 걸립니다.

  2. 불량 메모리가 감지되면 memmap 커널 매개 변수 를 사용하여 커널이 해당 메모리를 사용하지 않도록하십시오.

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] 특정 메모리를 예약 된 것으로 표시하십시오.
            ss에서 ss + nn까지 사용할 메모리 영역.
            예 : 0x18690000-0x1869ffff에서 메모리 제외
                     memmap = 64K $ 0x18690000
                     또는
                     memmap = 0x10000 $ 0x18690000

또한 ECC 메모리를 사용하여 1 비트 오류를 ​​수정하고 메모리에서 2 비트 오류를 ​​자동으로 감지 할 수 있습니다 (커널에서 수정할 수없는 메모리 문제가 발생하면 로그 메시지가 표시됨)


답변

게시물과 답변은 문제를 오해합니다. 메모리 스크러빙은 수정 가능한 단일 비트 오류가 수정 불가능한 이중 오류로 바뀌지 않도록하기위한 것입니다. 스크러버는 때때로 모든 물리적 메모리 (캐시가이를 놓치게 함) 일뿐입니다. 단일 비트 오류가있는 경우 오류가 수정되고 수정 및 비교를 통해 올바른 값을 다시 작성해야 오류가 지워집니다.

그렇지 않으면 이미 하나의 오류가있는 단어에서 두 번째 오류가 발생하면 전체 단어를 수정할 수 없으며 OS에서 과감한 작업을 수행해야합니다.

제거는 코드 페이지와 같이 읽지 만 기록되지 않은 메모리는 시간이 지남에 따라 오류를 축적 할 수 있으므로 제거가 중요합니다.


답변

ECC 메모리가있는 경우 https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac 에서 자세히 살펴볼 수 있습니다 . ( “sdram_scrub_rate”가 특히 흥미로 웠습니다.)

(이 링크가 어느 시점에서 끊어지면 (실제로해서는 안됨) 적절한 Linux 설명서를 다운로드하고 “scrub”를 검색하는 것이 좋습니다.)


답변