리눅스가 메모리를 제거 할 수 있습니까?


10

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

답변:


2

대답은 그렇습니다. 투명하게 처리됩니다 (오류를 감지 할 수있는 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를 통해 활성화 할 수있는 하드웨어 절차입니다.


1
더 비싼 ECC 메모리가있는 경우에만 적용됩니다.
psusi

이것은 ECC가있는 모든 메모리에 적용됩니다. 패리티 (그러나 수정이 불가능 함), SECDED, 더 비싼 Chipkill 또는 새로운 것이어야합니다. DDR1은 이미 ECC를 구현할 수 있지만 사용하는 실제 모델에 따라 다릅니다. "가정용"시장은 전통적으로 복원력이 덜 필요하지만 슈퍼 컴퓨터에는 20 년 이상 서버가 장착되어 있습니다.
Cimbali

1
나는 ECC 메모리가 비 ECC보다 비싸서 대부분의 사람들이 가지고 있지 않다는 것을 의미했습니다.
psusi

1
"대부분의 사람들"은 꽤 모호합니다. 내가 말했듯이 투자 및 전력 가격을 지불하는 것이 일반적인지 여부는 시장에 달려 있습니다. 2 년이 지난 나의 평균 Dell 노트북에는 표준 사양이 있으며 특별한 옵션은 요구되지 않습니다. 기능의 소형화로 인해 다양한 방사선에 DIMM을 더 잘 인식 할 수 있기 때문에 점점 더 일반화되고 있습니다.
Cimbali

1
"Patrol Scrubbing"(ECC 메모리가있는 시스템에서)을 수행하는 Cimbali-바이오스 펌웨어 (아마도 smm 모드, OS 커널 용 투명) 또는 일부 소프트웨어 모드 (패트롤 스크러빙을 수행하는 모듈)의 Linux 커널? ECC 메모리는 ECC 합계를 확인하지 않았습니다. ECC를 확인하려면 데이터를 읽어야합니다 (메모리 컨트롤러의 ECC 체계가 합계를 확인 함). 일부 메모리는 CPU의 일반 프로그램에 의해 자주 읽히고 다른 메모리는 몇 주 동안 읽지 못할 수 있습니다. 순찰 스크러빙은 매일 (인텔) 또는 1-48 시간마다 모든 메모리를 읽어
ECC

7

이것은 실제로 나쁜 생각입니다. 빠른 스위프에서 메모리를 안정적으로 테스트 할 수 없습니다. 이것이 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 비트 오류를 ​​자동으로 감지 할 수 있습니다 (커널에서 수정할 수없는 메모리 문제가 발생하면 로그 메시지가 표시됨)


커널 매개 변수에 대한 팁을 주셔서 감사합니다. 이것이 왜 그렇게 나쁜 아이디어인지, 왜 memtest86 (+)와 같은 방법으로 메모리 청크를 확인할 수 없는지 명확히 할 수 있다고 생각하십니까? 더 안정적인 테스트를 위해서는 더 많은 CPU 시간이 필요하다는 것을 알고 있습니다. CPU 시간이 충분히 긴 시간에 걸쳐 퍼져 있고 멀티 CPU 외에 점점 더 주류가되고 있다면 문제가되지 않을 수 있습니다.
Waxhead

기술적으로 충분한 시간이 지나면 가능할 수도 있습니다. 그러나 병목 현상은 CPU가 아니라 메모리 버스이며 CPU의 메모리 캐시를 "중독"합니다. 나는 그러한 커널 모듈을 알지 못했고 아이디어는 나에게 매우 연약 해 보인다 (라이브 시스템 등에서 임의의 메모리 영역에 반복적 인 패턴 쓰기를 조정하는 등)
haimg

haimg : 질문 : VFS가이 예약 된 메모리에 대한 페이징을 관리합니까? 나는 그것이 보이지 않을 것이라고 생각합니다.
Jay D

1
@Waxhead 메모리 스크러빙은 일반적으로 하드웨어를 사용하여 BIOS 수준에서 수행됩니다. 활성화 된 경우 순찰 스크러빙 및 수요 스크러빙 옵션을 찾아야합니다. ECC 메모리를 사용하는 것이 메모리 무결성이 중요한 경우, 이러한 옵션을 활성화하면 얻을 수있는 작은 성능 저하가 가치가 있습니다.
Ian

1
badram 커널 모듈에 대한 참조를 여기 에 포함시키는 것이 흥미로울 수 있다고 생각합니다 . 제안한대로 memtest86을 사용하지만 커널이 불량 메모리를 사용하지 않도록하는 대신 커널을 사용하지 않도록 커널에 할당하여 커널이나 응용 프로그램이 해당 메모리로 실행되지 않도록 효과적으로 보장합니다.
Cimbali

2

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

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

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


답변으로 표시되었을 때 답변이 누락되어 문제를 이해했다고 생각하는 이유는 무엇입니까?
Dave

1
Dave의 대답에도 불구하고 Larry는 매우 정확합니다. 대답은 질문을 오해합니다. 이 질문은 리눅스가 ECC h / w에 의해 감지되고 수정 된 단일 비트 오류가 수정 불가능한 2 비트 오류로 변하는 것을 막기 위해 Larry가 조심스럽게 설명하는 메모리 스크럽을 수행 할 수 있는지 묻습니다. 이 대답은 소프트웨어 응용 프로그램을 사용하여 이러한 오류를 처음 감지하는 방법에 대해 설명합니다.
Ian

나는 당신이 여기서 목적을 오해한다고 생각합니다. 스크러빙에 대한 설명은 물론 정확합니다. 예를 들어 비 ecram 램에서 (필수적이지 않은) 파일 서버를 실행하고 CPU 사이클을 사용하여 조만간 손상을 감지하는 것이 좋습니다. 불량 메모리 칩을 인식하지 못하는 것보다 메모리에 결함이있는 것으로 표시하고 알고 있습니다. 아마도 더 나은 표현은 메모리 유효성 검사 / 확인 일 것입니다. 기술적으로는 문지르지 않지만 잠재적으로 나쁜 메모리로 인한 손상을 줄이는 실용적인 방법입니다.
Waxhead 2019

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.