2016年4月18日 星期一

Intel SSD 535 (240G) 寫入放大 10倍 變成 1.5倍 的方法

如果 0.5秒就去讀取一下 SSD, 就能避免大量 Total NAND Writes(F9)
後面是驗證程式,自行編成exe之後,放到系統啟動時自動執行。
此程式僅會增加 SSD 1KB/sec 的讀取,對系統影響非常小。
希望 Intel 能提供韌體徹底解決。

  1. 先解決 wfpdiag.etl 頻繁寫入的問題: netsh wfp set options netevents = off
  2. 如果可以, 把 swap file 移到傳統 HDD
  3. 其他SSD優化設定...自行 google...
  4. 底下是驗證結果:
  5. SMART: Total NAND Writes(F9), Total LBAs Read(F2), Written(F1)
  6. 2016/4/13-16:00     749G(F9)           83.75G(F2)   76.09G(F1)
  7. 2016/4/18-20:47     781G              141.84G       96.59G
  8. 5天增加               32G               58.09G       20.5G
  9. 這5天的寫入放大僅1.5, 執行此程式之前竟然會接近10 ?!
2016/08/04 已將底下程式 source & exe 放到 github:
https://github.com/fonwin/issd-rx
最近觀察寫入放大約2倍左右

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
   int sleepms = 500;
   if(argc > 1)
      sleepms = atoi(argv[1]);
   printf("SSD read interval: %d ms\n", sleepms);

   DWORD DesiredAccess = GENERIC_READ|GENERIC_WRITE;
   DWORD ShareMode = FILE_SHARE_READ;
   DWORD CreationDistribution = OPEN_ALWAYS;
   DWORD FlagsAndAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING;
   HANDLE FD_ = CreateFileA("./dummy", DesiredAccess, ShareMode, NULL, CreationDistribution, FlagsAndAttributes, 0);

   DWORD rsz = 0, wsz = 0;
   char  buf[1024] = { 0 };
   if(::GetFileSize(FD_, NULL) < sizeof(buf))
      WriteFile(FD_, buf, sizeof(buf), &wsz, 0);
   __int64 tms = 0;
   __int64 totalrx = 0;
   for(;;) {
      SetFilePointer(FD_, 0, 0, FILE_BEGIN);
      ReadFile(FD_, buf, 512, &rsz, 0);
      if(rsz == 0)
         printf("[fd=%p, r=%d,w=%d]", FD_, rsz, wsz);
      totalrx += rsz;
      SleepEx(sleepms, TRUE);
      if((tms += sleepms) % (1000*10) == 0) {
         __int64 secs = tms / 1000;
         printf("\r[Spent time: %lld:%02d:%02d][Read %lld bytes]"
                , secs/60/60, (int)(secs/60)%60, (int)(secs%60)
                , totalrx);
      }
   }
   CloseHandle(FD_);
   return 0;
}