[CDN 技术] TCP_MEM_HIT 和 TCP_HIT 的性能到底相差多远

Jun 13th, 2010

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2010/06/13/squid-tcp_mem_hit-tcp_hit.html

在内存中命中,使用 Squid 本身的机制来 Cache 文件,和文件系统本身的 Cache 机构时,Squid 内存 Cache 机构性能提高会有多少.

压力测试语句

./ab -c 100 -n 30000   "http://test.php-oa.com:81/4k.html?cct00003000"

测试用的 AB ,并发 100 打 3W 次压力,文件的大小是 4k 的小文件.使用 16 进制来随机生成文件名.这样来测试,为了保证有效性,我先前打了二次,不做为记录,只为了 Cache ,然后在 Squid  中配置大点的内存来存放这些小文件.

系统的配置,机器有点老.不好意思,哈哈

cache_mem 2048 MB
maximum_object_size 409600 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 4096 KB

 

1. TCP_MEM_HIT 时的数据

这是打出来的数据.当所有的 Object 都是内存命中时的性能,如果随机数,在少点,上 5k 是很容易的.这是每秒处理完的响应.

Time taken for tests:   6.979 seconds
Complete requests:      30000
Failed requests:        0
Write errors:           0
Total transferred:      135908818 bytes
HTML transferred:       122884096 bytes
Requests per second:    4298.66 [#/sec] (mean)
Time per request:       23.263 [ms] (mean)
Time per request:       0.233 [ms] (mean, across all concurrent requests)
Transfer rate:          19017.79 [Kbytes/sec] received

 

2.TCP_HIT时的数据

然后重起 Squid .因为重起 squid 时会给所有的数据保存到硬盘中,这时文件就不在会变成 TCP_MEM_HIT,只会是 TCP_HIT.然后在 使用 并发 100 打 3W 次压力.

Concurrency Level:      100
Time taken for tests:   8.915 seconds
Complete requests:      30000
Failed requests:        0
Write errors:           0
Total transferred:      135934529 bytes
HTML transferred:       122884096 bytes
Requests per second:    3365.13 [#/sec] (mean)
Time per request:       29.717 [ms] (mean)
Time per request:       0.297 [ms] (mean, across all concurrent requests)
Transfer rate:          14890.54 [Kbytes/sec] received

 

TCP_MEM_HIT 和 TCP_HIT 总结:

很明显的,当响应是TCP_MEM_HIT 时,量能打到4298.66 [#/sec] 和 TCP_HIT时3365.13 [#/sec] ,从流量上也能看出来.我担心是不是 I/O 影响了性了,在 TCP_HIT 时,使用 iostat 监控了多次硬盘,基本没有什么 I/O 操作,说明被文件系统本身 cache 到内存中了.

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. 陈子
    Jun 19th, 2010 at 06:23
    Reply | Quote | #1

    第一次知道TCP_HIT的时候还可能是文件系统本身cache到内存~~~月初有一次iostat看cache磁盘几乎没操作的时候我还一直奇怪呢~~

  2. 李俊
    Jun 24th, 2010 at 08:10
    Reply | Quote | #2

    好文,剖析的通俗易懂

  3. coopci
    Oct 27th, 2010 at 03:28
    Reply | Quote | #3

    在TCP_HIT也没有io操作的时候,区别只在于TCP_MEM_HIT少了一次从kernel态到user态的内存拷贝。其实MEM_HIT这种指标在当今已经没意义了,如果改成sendfile,那么没有io操作的情况下(也就是这篇博文测试用例的情况),能够获得比目前TCP_MEM_HIT更高的效率,如果再配成0 cache_mem还能节省下这些物理内存给fs用。

  4. catdog
    Dec 28th, 2010 at 14:40
    Reply | Quote | #4

    因为这个case里面,压力太低了,不到20M一秒的吞吐,硬盘表示毫无压力。
    楼上的把squid改成基于sendfile了?公开源码吧,扬名立万啊

  5. admin
    Dec 31st, 2010 at 03:31
    Reply | Quote | #5

    普通硬盘如果随机读 4 k 以下,能有 1-2M 的速度就相当不错了,时间都用在寻道上了。。。

  6. iammutex
    Oct 26th, 2011 at 07:55
    Reply | Quote | #6

    你好,想请问一下,为什么Squid要设置成重启后磁盘的数据就不会加载到内存。
    这样的话,按我的理解就是:只有从后端取到的数据会加入内存,而只有当内存使用达到限制时,才按memory_replacement_policy设置的策略删除内存中的冷数据,而原本就在磁盘缓存的数据就再也没有机会进入到内存中。只会利用到文件系统本身的cache层。

  7. 扶 凯
    Oct 28th, 2011 at 02:42
    Reply | Quote | #7

    你的理解没错。所以我指得不会加载到内存,是不会加载到 Squid 管理的内存块中,但系统本身的 cache 还是会有。