在往下看之前,請你先想想:
檔案快取是拿來做什麼的?
什麼樣的檔案我會想讓其快取?
你想要的快取究竟是Cache還是Buffer?
Ramdisk是使用者可以控制的快取,
Windows內建快取是無法控制的。
何況Windows對檔案IO的快取很小,容易感覺到的只有少量的寫入快取而已。
這不是不好的設計,而是以OS層來說,沒辦法去得知最適合每個軟體對檔案的快取策略,導致命中率低下,開大了也沒有意義;當然,OS本身可以對自己的服務做預載入,這又是另一回事了。
何況快取策略是雙面刃,一來要額外的開銷計算快取Hit/Miss的分支;二來要額外處理快取的套用/淘汰機制;三來如果這筆資料根本不需要快取,那多一層IO反而慢了;四來會占用額外的記憶體。
所以Windows不把檔案層快取開大,也不讓使用者做進一步的控制。
由於我們不能控制Windows的檔案快取機制,故:
I. 最好的方法是軟體內使用自己的快取,
(通常而言)軟體本身會使用對於自己最好的快取策略,以達到高的命中率,讓額外使用的記憶體適得其所。
但缺點是每套軟體都有自己的快取空間,占用記憶體就是大家的總和,以一個良心軟體來說,勢必不能用太大。
以CPU的觀點來說,這層就像是L1:各個core使用自己的,不能共用、不能干涉。
II. 其次則是進階使用者針對軟體,去設定Ramdisk、Fancycache,達到控制檔案快取策略的目的。
用途就是我一開始問的,快取會用在哪裡?
1. 使用者預期會重複使用的檔案IO。 ex: P2P
2. 使用者認為,工作階段中可能會重複使用,但工作階段完成後用完就丟的檔案。ex: temp
3. 程序間不支援管道IO且無法修改,使用檔案做資料交換機制。 (少見,但偶爾會用到)
4. 程序無法預估產生資料會有多大、或是32bit程序對記憶體較吃緊,故不保留在記憶體中而是存放在硬碟中。 但使用者可以預估其大小而決定是否將其放在高速緩存中。 ex: h264 2pass encode mbtree
以CPU的觀點來說,這層就像是L3:所有core共用一塊較大的,但既可以不互相影響,必要時亦可以互相干涉。
你會覺得Ramdisk/Fancycache沒用,不是工具差,而是你沒用在對的地方。