2016年11月14日 星期一

MicroSD Card write endurance test

前文
MicroSD/eMMC Endurance?
讓我想試著測試MicroSD卡...

如同網路上對SSD作的測試
我想要對一張MicroSD卡持續讀寫,驗證它甚時候出現BadBlock
這個測試放在我的Server上面跑,因為一般PC沒有SD Interface
所以採用USB讀卡機作為SD Interface

因為MicroSD不像SSD有SMART資訊可以判讀總寫入量(Total Bytes Written)、錯誤發生數量(
Reallocated Sectors Count)
所以採用Badblocks直接對磁碟進行讀寫操作,判斷錯誤發生的數量
讀取/proc/diskstats的sectors written判斷總寫入量

最後,收集數據,自動上傳到Blogger,最後再來想怎呈現
測試的Log會自動發布在Sandisk 8G Write Test

目前測試的MicroSD卡是舊的,等整個測試驗證ok再拆新的卡來跑XD
測試shell script如下,如果有修改再更新

#!/bin/bash

# Loop badblock to write disk
# check the disk endurance, and update it to blogger

DISK='sdc '

while true
do
	sudo badblocks -ws -o usbstick.log /dev/sdc
	DATE=`date -R`
	DISK_TOTAL_MBYTES_WRITEN=`grep $DISK /proc/diskstats|awk '{print $3"\t"$10 / 2 / 1024}' `
	BADBLOCKS_LOG=`cat usbstick.log`
	echo $DATE,$DISK_TOTAL_MBYTES_WRITEN,$BADBLOCKS_LOG >> Sandisk_8G_Write_test.txt
	b.py post Sandisk_8G_Write_test.txt
done

8G的卡, MLC如果3000次,可以寫入24TB的資料量
假設2MBytes/Second
要花138天...

Post Blogger from Linux Shell or command line

前文
MicroSD/eMMC Endurance?
MicroSD Card write endurance test

在進行測試的過程中,我打算把測試結果自動發布
要發布到網路上很簡單,但確有不少限制
如果隨便找個網站或是pastebin貼,在這個Blog上我只能用一個Link的方式指過去
不能透過javascript撈到這些資料
因為安全性因素,javascript預設不能跨站存取資料
refer: 同源政策 (Same-origin policy)

要處理這塊似乎有點麻煩,因此我把念頭轉向直接更新到Blogger上

陸陸續續Google了不少資料,測試不同的範例
從shell script到python的範例
從Google API v2到v3
oauth 2.0 api到Blogger api
(我應該再多比較一下的...現在看起來直接貼blogger比CORS還麻煩Orz)

最後找到這個專案
b.py http://pythonhosted.org/b.py/index.html
不確定Owner還有沒有在維護,因為網頁上有尋求人接手的訊息
執行的時候有Warning message,但還可以正確動作

文件看起來很詳細,但實際用起來還是碰到一些狀況
備註一下這些狀況或是我覺得寫的不清楚的地方

  • http://pythonhosted.org/b.py/introduction.html#installation
    可以用pip安裝,但pip安裝時沒有處理相依性問題,網頁上有另外列出相依的package
    (是pip本來就不會處理相依性問題嗎??我不太熟這個...)
  • 安裝後,因為我要貼到Blogger,需要透過Google開放的api進行操作
    Google api改為全部資料存取必須先經過oauth 2.0 api認證
    所以需要設定相關的client_ID跟client_secret
    (這兩個值需要在Google API Console申請)
    http://pythonhosted.org/b.py/apidoc/bpy.services.html#module-bpy.services.blogger
    但這邊提供的範例內,service_options宣告為dict型態,key為字串型態,應該要用單引號包起來
    但client_id跟client_secret沒有...
  • http://pythonhosted.org/b.py/introduction.html#dependencies
    相依性列出的算是詳細,但可能是因為小弟我資質駑鈍,有些地方一開始沒看懂...
    Handlers是負責解讀文件的parser,將文件解讀為正確的排版,貼到Blogger上
    Handlers是粗體字,底下的AsciiDoc、HTML、Markdown、reStructuredText、Text表示的是可以支援的輸入格式,需要對應的Package來處理

    Markdown似乎不支援一些語法? 我用Table語法沒有被正確處理成Table
    reStructuredText需要的Package似乎下架了,因為我找了半天找不到
    最後才看懂他的表示方式,因為我只需要簡單的文字,所以直接使用Text格式上傳
    輸入格式依據輸入檔案的副檔名決定
搞blogger的時間比我寫測試腳本的時間還多很多...

Anyway, It's worked!

MicroSD/eMMC Endurance?

隨著NAND Flash越來越普及,NAND Flash的價格越來越低,低到可以當作PC的主要儲存媒介來使用,SSD單價比硬碟高一些,但速度比硬碟快上許多
可靠度也已經有不少測試,實際驗證SSD的可靠度
依照測試的結果,SSD一般使用情境應可以使用上七八年不成問題

但實際上,隨著半導體製程的演進,密度越大,價格越來越低
NAND Flash的可靠度也越來越低...
實際上現在的MLC NAND Flash,P/E Cycle已經降到剩下3K,而且這還是開啟一堆雜七雜八功能的情況下的可靠度...
快閃記憶體可靠性對控制晶片的挑戰

從NAND Flash耐受度(Endurance)與所需ECC修正位元數的趨勢來看,過去SLC僅使用1bit ECC,P/E Cycles為100K,到了2xnm就降到60K,MLC則隨著製程的演進,Endurance呈現巨幅下降,ECC修正位元數呈現指數曲線的暴增;從5xnm製程的MLC的P/E Cycles有10K、需4bit ECC,到3xnm製程的MLC其P/E Cycles已下降到5K,且需要 8bit ECC;2xnm製程的MLC則降為3K、ECC修正位元提高到15~24bit。而TLC記憶體的P/E Cycles更降到1K以下,需72bit甚至上百位元的ECC。因此Flash控制晶片的編碼技術,將從BCH編碼技術,逐漸轉向LDPC(Low Density Parity Check)。

refer: Flash與SSD產業的挑戰─可靠度與總成本
我手上有Raspberry pi跟Raspberry pi2各一塊,都是用MicroSD作為主要儲存
另外手上的手機、平板也分別是使用NAND Flash與eMMC作為主要儲存

我手上有一台艾諾烈焰,製造日期為2012/08/16,主要拿來看漫畫、小說的
這一兩年也出現過異常緩慢,開機後出現缺少package之類的訊息,有時甚至要進行還原才能正常工作
懷疑是NAND Flash已經衰退,剩下就是拖一口氣,看哪天壞到連還原都沒救XDDD

這台是直接使用NAND Flash的產品,拆機圖片如下
貼的NAND Flash為美光29F64G08CBAAA
這顆現在應該停產了,淘寶上還找的到料(不知道是真的假的...)
像這種Pure NAND的產品,依靠的是SOC本身的NAND Controller作ECC與Bad block control
NAND Flash的可靠度也無從判斷起...


那如果是使用eMMC的產品,或是使用MicroSD搭配RaspberryPi,MicroSD/eMMC提供的可靠度足夠讓系統長時間穩定運作嗎??

網路上找的到的資料不多,如果我自己來作這樣的自動測試?
有這個念頭...就開始弄吧:D