缓存种类的介绍、工作机制和设置的建议

最近又很多同学被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条评论隐藏

  1. 2009年4月25日 周六 18:51 | 回复

    咦~~~通常,
    我都是拉到轴的最大值。

  2. #2 bpxyz
    2009年6月8日 周一 12:53 | 回复

    说明楼上的内存比较海! 😯

  3. #3 QQ2008
    2009年10月30日 周五 12:05 | 回复

    什么是slot?经常见,但是一直不知道它到底是什么意思…

  4. #4 Anti-VC
    2009年10月30日 周五 12:08 | 回复

    @QQ2008
    传输通道吧。

  5. #5 Mikeven
    2010年3月17日 周三 20:19 | 回复

    受益匪浅,,应该让那些P2P毁硬盘一族来拜读拜读

  6. #6 吹口哨的绞刑架
    2011年4月27日 周三 13:28 | 回复

    感谢zz-fly大过来专门教学,开发员的话大家要好好听哦~ 8)

  7. #7 YUANW0W
    2011年11月27日 周日 00:38 | 回复

    没读这篇文章之前我还想把电骡的缓存设置的和我迅雷的一样 256MB…. 瞬间傻叉了

  8. #8 新手
    2011年12月4日 周日 13:13 | 回复

    官版預設的256KB簡直是虐待硬碟 2MB也根本不夠
    重點還是快取停留時間的長短
    官版預設FileBufferTimeLimit=80(秒)建議改高一點吧
    現在4GB記憶體那麼便宜 沒必要再讓硬碟頻繁工作了

  9. #9 新手
    2011年12月4日 周日 13:25 | 回复

    請用ProcessExplorer觀察I/O寫入的情況….就知道官版emule再高速下載的時代有多麼操硬碟了

  10. #10 of
    2011年12月4日 周日 14:39 | 回复

    @新手 这位大侠到底看没看这篇emule mod开发者亲自写的文章呀?

  11. #11 of
    2011年12月4日 周日 14:46 | 回复

    @新手

    前文已经说了,EM的缓存是针对文件的,如假设每个Slot对应一个文件,那么EM缓存大小时候合理关键看Slot Speed。
    对于小水管,Slot Speed也是就是10多20K,512K的File Buffer足够它挥霍20S以上,足够了。
    如果说你只下载少量文件,可能有多个Slot在写入同一文件,可能就需要1M的File Buffer。
    对于大水管,Slot Speed上百,但这并不意味着需要10M以上的File Buffer。原因有两个,一个和BT一样,由于随机读取的存在,你必须读硬盘;另一个就是File Buffer越大,文件丢失的可能性越大,而且这个可能性是指数级增长的。因此,即使是大水管,1.5M~2M的File Buffer也差不多了。可以利用优先级的管理,让EM上传不同的文件,下载的文件数量也多一点,让每个Slot对应不同的文件。

    有心的同学也请转到VeryCD,让那边的小白知道easymule 30M的File Buffer设定是多么脑残

  12. #12 8X
    2011年12月9日 周五 03:02 | 回复

    考虑加一下原文信息啥的?

发表评论

您的Email将不会显示出来。头像请至Gravatar.com注册上传。*号标注项为必填。

*
*
*
标签用法
字数:0