我的工作機有16G RAM,日常開發加上跑了幾個VM,記憶體還有剩,於是便切了2GB出來做Ram Disk,並把Windows暫存目錄設在Ram Disk上,多少能提高一些效能(延伸閱讀: 保哥的介紹文)。這個配置方式已順利運作近半年,最近卻發現,看似充裕且每次重開就清空的2GB空間,居然有被用完的一天。心想工作複雜系統操勞,暫存檔案偏多在所難免,既然記憶體還有餘,就再加大到4GB好了。沒想到不到兩天的時間,4GB的Ram Disk又被用光,感覺事有蹊蹺,茶包射手於是主動介入調查。

開啟WinDirState,佔用磁碟機空間的凶手立即現形!

TEMP目錄下出現好幾個360MB大小的tmp*.tmp.testgen檔案,展開後看來是某個ASP.NET WCF專案的複本,這才想起來,前幾天為該WCF專案加掛了Unit Test單元測試專案,而資料夾建立的時間,幾乎就是Visual Studio建置(Build)專案的頻率。經過實驗證實了此點: 每建置該單元測試專案一次,就會產生一個temp*.tmp.testgen暫存目錄,由於該WCF專案的App_Data中包含大量資料檔案,進一步造成每複製一次就產生可觀的無謂資料量,加上沒有自動清除機制配套,幾個陰錯陽差,就啃光了Ram Disk有限的空間。

上網查了testgen目錄的案底,資料很有限,只有一篇CodeProject的文章提及,點出它每次都會複製整個目錄且不會自動清除,所以要小心單元測試對象專案的目錄若包含大量或大型檔案(就像我遇到的例子,或者App_Data下有SQL Server Express要掛載的大型mdb檔,也會很精彩),便會因複製耗時拖慢編譯速度並佔用大量磁碟空間。

在本次案例中,我的解決方式是先刪除WCF專案App_Data目錄下非必要的檔案,降低建置Unit Test專案的成本;另一方面,再進一步設定Unit Test專案不要隨著Solution每次都編譯,這才發現,這陣子老覺得建置Solution慢如老牛拖車的凶手也一併落網囉~~


Comments

# by 佑翔

黑大真是用心,原來我們ramdisk的兇手是同一人!!感恩~

# by KKBruce

這算Bug or 計設不良? 跟 MS 反應有用嗎?

# by Jeffrey

to 佑翔, (握手)要RamDisk + Unit Test Project + 專案檔案大 三條成立才會爆發,能遇到有共同經驗的人真是難得。 to KKBruce, 原本Temp目錄就是任意塞東西,Windows也訂了空間不足時可優先清除的策略,我想不能算Bug,但就算不是因為RamDisk的空間有限爆出問題來,每次Build時要一直重覆複製大量檔案感覺對效能的殺傷力不小,或許針對這類情境要有一些警告或調整選項會更好。

# by 91

我之前也有碰到這樣的狀況,所以後來VS的temp路徑,我就不指到RamDisk了。 編譯一次+跑一次測試,就會把RamDisk吃掉不少。要命的是RamDisk爆掉的時候,當時的VS會當掉...

Post a comment