모든 이야기

NAND 평균 오류율이 낮아도 page 읽기에 실패하는 이유

NAND의 평균 bit 오류율이 줄었다. 그런데 정정에 실패한 page 수는 오히려 늘었다. 측정 실수처럼 보이지만 두 숫자는 다른 것을 묻는다. 평균은 전체 오류의 양을 말하고, ECC Error Tail은 정정 한계를 넘는 오류가 어디에 얼마나 몰렸는지를 묻는다.

읽기 성공을 판단할 때 필요한 것은 모든 page의 오류를 합친 숫자만이 아니다. ECC가 실제로 보호하는 작은 단위마다 오류가 어떻게 분배되었는지 알아야 한다. 어떤 단위의 남는 정정 능력을 다른 단위에 자동으로 빌려줄 수는 없기 때문이다.

같은 400개 오류의 다른 결과

계산을 위해 page 하나가 4,096bit짜리 ECC codeword 하나로 구성된 가상 메모리를 정하자. codeword는 원본과 정정 정보를 묶은 단위다. 이 예의 decoder는 오류가 8bit 이하이면 모두 정정하고, 9bit 이상이면 실패를 보고한다고 가정한다. 실제 LDPC의 성공 여부가 단순한 오류 개수 경계만으로 정해진다는 뜻은 아니다.

100개 page에 오류가 총 400개 있다면 평균은 page당 4개다. 전체 bit 수를 분모로 계산한 raw bit error rate도 400/(100×4,096), 약 0.0977%다.

첫 번째 배치에서는 모든 page에 오류가 4개씩 있다. 각 page가 8개 이내이므로 정의한 decoder는 100개를 모두 정정한다. 두 번째 배치에서는 10개 page에 각각 40개가 있고 나머지 90개에는 없다. 총 오류와 평균 오류율은 같지만 10개 page가 정정에 실패한다.

두 번째 배치의 오류를 총 300개로 줄여도 이야기는 끝나지 않는다. 10개 page에 각각 30개씩 남겼다면 평균 오류율은 약 0.0732%로 내려가지만 실패 page는 여전히 10개다. 평균 개선이 정정 경계를 넘는 page의 개선으로 이어졌는지 따로 봐야 한다.

정정 경계를 넘는 확률을 묻는다

NAND 신뢰성 논문의 ECC 설명은 codeword 길이가 l, 정정 능력이 t일 때 오류 개수가 t를 넘는 확률을 모델링한다. 각 bit가 독립적이고 같은 확률 p로 틀린다면, 오류 개수 X는 이항분포이고 실패 확률은 P(X>t)다. 평균 lp만 계산하는 것과 분포의 오른쪽 꼬리를 합하는 것은 다른 계산이다. 논문도 독립·동일 분포 가정을 명시한다. Cai 등의 원문 §1.3.7, 식 (1)

평균 오류율을 이 식에 넣으려면 그 평균이 모델의 가정에 맞는지 먼저 확인해야 한다. page마다 p가 다르거나, 인접한 셀의 오류가 함께 발생한다면 모든 bit에 하나의 p를 적용한 모델이 관측한 꼬리를 재현하지 못할 수 있다. 앞의 두 배치는 같은 평균에서도 서로 다른 오류 분포가 가능함을 보여 주는 인공적인 반례다. 특정 NAND 제품의 실측 분포는 아니다.

여러 codeword가 page에 들어가는 경우에는 위치가 더 중요해진다. 하나의 page에 두 codeword가 있고 각자 8개까지 정정할 수 있다고 하자. 오류 10개가 5개씩 나뉘면 둘 다 정정되지만, 9개와 1개로 몰리면 첫 단위가 실패한다. “page 전체에는 16개 분량의 정정 능력이 있다”는 합계가 실제 decoder의 보호 단위를 바꾸지는 않는다.

실패 하나가 읽기 전체를 막을 수 있다

호스트가 요구한 논리 블록이 여러 codeword에 걸쳐 있다면 그중 하나의 실패만으로 요청 데이터의 일부를 얻지 못할 수 있다. 원문은 논리 블록 안의 하나 이상 codeword가 실패하는 확률을 별도로 계산한다. 독립이고 codeword마다 실패 확률 q가 같으며 다른 실패 원인이 없다면 K개 중 하나 이상 실패할 확률은 1−(1−q)^K다. 원문 §1.3.10, 식 (2)

가령 q=0.001이고 K=4라면 약 0.003994, 즉 0.3994%다. 이것은 네 개를 읽는 가상 요청의 실패 확률이며, 실제 SSD의 데이터 손실률이나 수명 수치가 아니다. codeword들의 실패가 서로 관련되어 있으면 이 곱셈 가정도 다시 검토해야 한다.

실험 결과를 읽을 때는 평균 오류율 옆에 codeword별 오류 개수 분포, 정정 한계를 넘은 비율, 높은 오류를 보이는 위치와 조건을 함께 놓는 편이 좋다. 같은 page를 반복 읽은 관측과 서로 다른 page를 한 번씩 읽은 관측도 구별해야 한다. 표본에서 한 번도 실패하지 않았다는 사실만으로 드문 실패 확률이 0이라고 판단할 수는 없다.

ECC Error Tail을 살핀다는 것은 평균을 버린다는 뜻이 아니다. 평균으로 오류의 전체 양을 보고, 꼬리로 decoder가 넘지 못하는 경계를 본다는 뜻이다. NAND의 읽기 신뢰성을 설명하려면 “얼마나 틀렸나”에 더해 “어느 보호 단위가 한계를 넘었나”에 답해야 한다.