最近又很多同學被eMule和BT的不同緩存設定誤解了,以為eMule的緩存越大越好……
為了減少這種誤解,特開此帖科普一下。
有心的同學也請轉到VeryCD,讓那邊的小白知道 easyMule 30MB的File Buffer設定是多麼腦殘
緩存分類
緩存主要有兩大類,一類是緩存,英文一般是Cache/Buffer,這類緩存是由應用程序設定和管理的,所有文件公用的緩存,BT使用這種緩存;另一類是文件緩存,英文一般是 File Buffer。這類緩存是由系統設定和管理的,每個文件都有自己專用的文件緩存,eMule使用這類緩存。
- Cache/Buffer是由應用程序設定和管理的,它並不一定位於物理內存中。不過可以通過一個簡單的測試知道它是否位於物理內存中。首先, 將緩存大小設定為幾MB,運行一段時間,記錄下程序佔用的物理內存和虛擬內存大小。然後將緩存大小設定為剛才值得10倍,再運行一段時間,記錄下程序佔用的 物理內存和虛擬內存大小。比較兩次記錄,看看是物理內存佔用是否明顯增大,明顯的話,緩存位於物理內存之中。如果是虛擬內存佔用明顯增大,而物理內存變化不明顯,那麼這個應用程序的緩存並不位於物理內存之中。
- File Buffer 由於是系統設定和管理的,只要你的物理內存充足,一般都是位於物理內存中。又由於它是每個文件專用的,即使只設定了1MB的File Buffer,你如果打開了30個文件,那麼就是總共30MB的File Buffer。後面介紹完原理後,你就應該知道這對絕大部分人已經足夠了。
緩存工作原理
- 緩存(Cache/Buffer)可以細分為讀和寫。
- 讀緩存(Read Buffer)作用是將文件內容預讀到內存中,在讀操作前檢查文件是否在緩存中(術語是命中),沒有命中的話,在從硬碟中讀取文件。從上述工作原理可知,命中率讀緩存的關鍵指標。現在,我們分析命中率。命中率分順序讀取命中率和隨機讀取命中率:
從計算機的專業書籍中我們知道,CPU的高速緩存可以看作是物理內存的讀緩存,兩者的容量比一般是1:1000,然而CPU高速緩存的命中率一般不低於80%。因此我們知道,只需要很小的緩存就可以使得順序讀取的命中率很高;而隨機讀取的命中率,用概率論算算就知道,1GB的內容需要800MB的緩存才能達到80%的命中率。需要極大的緩存才能做到較高的命中率。
在實際中,順序讀取的發生頻率比隨機讀寫要多少幾個數量級,因此用更好的緩存演算法提高順序讀取的命中率才是讀緩存的前進方向,單純提升緩存大小沒有太大意義。綜合上面的分析我們知道,提高讀緩存的效果並不需要很大的緩存,即使設置了很大的緩存,也是在浪費你的物理內存。寫緩存(Write Buffer)的作用是在寫入文件之前,先將要寫入的內容寫到內存中,積累到一定的量以後,再寫入實際文件。因此,寫緩存沒有命中率的說法,它的效果只和寫入速度和緩存大小有關。
- 文件緩存(File Buffer)是由系統設置和管理的,每打開一個文件,系統會自動給那個文件分配File Buffer,一般不分讀寫。雖然說Windows很廢品,但是它的 File Buffer 演算法不比一般軟體差,所以關鍵是設置多大比較好而已。但是,如果 File Buffer 設置過大,例如30MB,你往裡面寫了10MB的數據,系統很可能認為緩存還很空,並不進行實際寫入操作。萬一在這時斷電或者程序崩潰,你這10MB就會丟失了。
BT緩存的大小
緩存的大小自然和讀寫速度相關,在這裡我把普通帶寬、小水管定義為 2Mbps ADSL,Upload/Download=64KB/s||256KB/s;高帶寬、大水管定義為 Upload/Download=1MB/s||2MB/s
- 對於小水管來說,8M的寫緩存(Write Buffer)需要半分鐘才能填滿,平均來說大概10s-15s寫一次硬碟,如果這個頻率你都不能接受的話,那你還是用無盤工作站好了。
- 至於讀緩存,BT的上傳是按文件塊進行的(一般的種子,文件塊大小是256KB/512KB)。64KB/s的上傳槽(Slot)一般是4-6個,上傳槽速度 (Slot Speed)一般不超過20KB/s,一個文件塊足夠它傳10s。因此,給每個Slot兩個文件塊的讀緩存就差不多了,害怕命中率不夠高,每個Slot四個文件塊也應該夠了。具體算一下,512KB*6xSlot*(2~4)=6-12MB,也就是說6-12MB的讀緩存就足夠了。
- 把讀寫緩存加起來,8+12=20MB,對於小水管是足夠多了。用uTorrent,使用上述緩存大小設定,讀緩存的命中率能達到85%以上。至於200M的緩存,如BitComet之流,命中率可能可以提升,但是提升的很有限。而且,由於隨機讀取的客觀存在,即使你有200MB緩存,你也不可能保證命中,讀硬碟的頻率不會比20MB緩存低多少。
- 對於大水管來說,想像小水管一樣10-15s寫一次硬碟是不可能的,而且BT下載完一個完整的文件塊後,為了保證數據安全,會儘快將那個數據塊寫入硬碟。因此,對於大水管來說,設置10倍於下載速度的寫緩存,滿足3-5s寫一次硬碟的要求就可以了,太大也沒有意義。
- 大水管由於上傳速度快,發生隨機讀取的可能性更高了,平均幾秒鐘就會發生一次不命中,必需讀硬碟。因此,讀緩存的量也不需要太多,緩存100個左右的文件塊,也就是大約50MB的緩存也就差不多了。
加起來大概需要70MB的緩存,同樣的,在這個情況下就算設置200MB的緩存,讀硬碟的頻率也不見得低多少。
eMule緩存的大小
前文已經說了,eMule的緩存是針對文件的,如假設每個Slot對應一個文件,那麼eMule緩存大小時候合理關鍵看Slot速度。
- 對於小水管,Slot速度也是就是10多20KB/s,512KB/s的File Buffer足夠它揮霍20s以上,足夠了。如果說你只下載少量文件,可能有多個Slot在寫入同一文件,可能就需要1MB的File Buffer。
- 對於大水管,Slot速度上百甚至上千,但這並不意味著需要10MB以上的File Buffer。原因有兩個,一個和BT一樣,由於隨機讀取的存在,你必須讀硬碟;另一個就是File Buffer越大,文件丟失的可能性越大,而且這個可能性是指數級增長的。因此,即使是大水管,1.5MB-2MB的File Buffer也差不多了。可以利用優先順序的管理,讓eMule上傳不同的文件,下載的文件數量也多一點,讓每個Slot對應不同的文件。
12條評論隱藏
咦~~~通常,
我都是拉到軸的最大值。
說明樓上的內存比較海! 😯
什麼是slot?經常見,但是一直不知道它到底是什麼意思…
@QQ2008
傳輸通道吧。
受益匪淺,,應該讓那些P2P毀硬碟一族來拜讀拜讀
感謝zz-fly大過來專門教學,開發員的話大家要好好聽哦~ 8)
沒讀這篇文章之前我還想把電騾的緩存設置的和我迅雷的一樣 256MB…. 瞬間傻叉了
官版預設的256KB簡直是虐待硬碟 2MB也根本不夠
重點還是快取停留時間的長短
官版預設FileBufferTimeLimit=80(秒)建議改高一點吧
現在4GB記憶體那麼便宜 沒必要再讓硬碟頻繁工作了
請用ProcessExplorer觀察I/O寫入的情況….就知道官版emule再高速下載的時代有多麼操硬碟了
@新手 這位大俠到底看沒看這篇emule mod開發者親自寫的文章呀?
@新手
考慮加一下原文信息啥的?