線程指的是同時有多少個讀或寫任務在并行執行,一般來說,CPU里面的一個核心同一時間只能運行一個線程。如果只有一個核心,要想運行多線程,只能使用時間切片。每個線程跑一段時間片,所有線程輪流使用這個核心。Linux使用Jiffies 來代表一秒鐘被劃分過了多少個時間片,一般來說Jiffies是1000或100,所以時間片就是毫秒或10毫秒。
一般電腦發送一個讀寫命令到SSD只需要幾微秒。但是SSD要花幾百微秒甚至幾毫秒才能執行完這個命令。如果發一個讀寫命令,然后線程一直休眠,等待結果回來才喚醒處結果,這叫作同步模式。可以想象,同步模式是很浪費SSD性能的,因為SSD 里面有很多并行單元,比如一般企業級SSD內部有8~16個數據通道,每個通道內部有4~16個行邏輯單元(LUN,Plane),所以同一時間可以執行32~256個讀寫命令。同步模式就味著,只有其中一個并行單元在工作,暴殄天物。
為了提高并行性,大部分情況下SSD讀寫采用的是異步模式。就是用幾微秒發送命令,發完線程不會傻傻地在那里等,而是繼續發后面的命令。如果前面的命令執行完了,SSD通知會通過中斷或者輪詢等方式告訴CPU,由CPU來調用該命令的回調函數來處理結果。這樣的好處是,SSD里面幾十上百個并行單元都能分到活干,效率暴增。
不過,在異步模式下,CPU不能一直無限地發命令到SSD。比如SSD 執行讀寫如果發生了卡頓。那有可能系統會一直不停地發命令。幾千個,甚至幾萬個,這樣一方面 SSD扛住,另一方面這么多命令會很占內存,系統也要掛掉了。這樣,就帶來一個參數叫作隊列深度。舉個例子,隊列深度64就是說,系統發的命令都發到一個大小為64的隊列,如果填滿了就不能再發。等前面的讀寫命令執行完了,隊列里面空出位置來,才能繼續填命令。
一個 SSD 或者文件有大小,測試讀寫的時候設置 Offset 就可以從某個偏移地址開始測試。比如從 offset=4G 的偏移地址開始。
Linux 讀寫SSD 等塊設備使用的是BIO(Block-IO),這是個數據結構,包含了數據塊邏輯地址 LBA,數據大小和內存地址等。一般Linux系統是自帶FIO的,如果沒有或者版本太老,要自己從https://github.com/axboe/fio下載安裝,FIO功能非常強大,可以通過man來查看每一個功能,也有網頁版。