squid优化笔记 nginx正向代理的缺点

发布时间:2019-09-07编辑:脚本学堂
介绍:局域网内网站的速度有点慢,网络带宽大多数都被p2p占用了,但是由于某些网站的视频用p2p技术,所以不能完全禁止p2p,所以只好在缓存服务器上做文章。

  介绍:局域网内网站的速度有点慢,网络带宽大多数都被p2p占用了,但是由于某些网站的视频用p2p技术,所以不能完全禁止p2p,所以只好在缓存服务器上做文章。

  1、先是测试了一把nginx的正向代理功能,虽然对多CPU支持好一些,但整体效果不好,主要表现在:

(1)nginx不能区分文件的大小,所有文件都做缓存,我监控的最夸张的一个,是一个15G的电影,尽管超出了cache的最大范围,但是nginx还是坚持下载完。这不仅给磁盘带来很大负担,而且长时间占用了大量带宽,等于变相减慢了其他客户的速度。比较理想的状况是,控制文件大小,主要缓存图片、css、html、js等小文件,以及小的rar、zip、doc、pdf等,对于大一些的文件,最好还是让客户端自已去挤nat服务器。
    nginx的解决方法是通过不同的locate,把不同的文件区别对待,但是最终还必须有一个locate / ,否则还是不能显示完整的网页,或者干脆打不开网页。

(2)nginx的磁盘性能很差,缓存上万个文件的时候,就明显变慢,磁盘IO长时间保持100%,拖慢了整个系统速度。即使nginx可以多定义cache,用locate把不同文件类型放进不同的磁盘,但是由于nginx没有良好的磁盘机制,一旦一个磁盘中的文件达到上万后,磁盘IO很快就成为瓶颈,磁盘一直是100%。

(3)nginx的DNS查询量非常大,会被防火墙block掉。

(4)nginx没有良好的状态监控工具,找系统的瓶颈比较难,大多数时候靠猜测和抓包分析。

2、varnish,做正向代理力不从心,网上也没找到做正向代理的例子,忽略之。

3、改用传统的squid,以前只是小范围用,机器上千的环境,必须拿出12分的注意力来搞了。
(1)squid可以定义代理的文件大小,这点正符合我们的要求。

    maximum_object_size 4 MB
    maximum_object_size_in_memory 2 KB

这个正好定义最大缓存大小,超过大小的squid好像是通过正常的nat去下载(???测试??!!!)。对于网页,一般文件大小是20k左右,4兆大小就可以缓存大多数的小文件,至于电影、软件等,缓存的意义不大。

(2)自带了squidclient工具,可以很好地分析系统的瓶颈。

(3)支持多种磁盘系统,从最基本的ufs到aufs、diskd、coss等,ufs相当于直接用系统读写,最开始测试使用时,有大量的unlinkd,并且磁盘很容易到100%,大量的io把磁盘拖垮。我用的是320M的scsi,到300t/s的时候,大约是10MB/s,虽然CPU利用率和内存利用率都不高,中断也不是很高,但是系统基本上处于停止状态,在800台机器的情况下,最大输出10MB/s,在squidclient中,有大量的aborted,说明系统已经饱和,查看store_io,发现有超过十分之一的failed,说明磁盘已经成为系统的瓶颈。

(4)diskd在FreeBSD9.0中,老是dump,测试没通过。

(5)coss模式还是比较好的,

    #cache_dir coss /web/coss0 2000 max-size=100000 block-size=2048 overwrite-percent=50 membufs=100
    #cache_dir coss /home/coss0 2000 max-size=800000 block-size=2048 overwrite-percent=50 membufs=100

在这个模式下,还是比较不错的,但是文件数达到几十万的时候,磁盘性能也出现下降的趋势,磁盘也处于100%的busy之中,对它只进行了两个磁盘的测试,估计用三、四块的时候,情况会有所改善。

(6)aufs模式,性能不错,也比较稳定,目前状态:

    Connection information for squid:
            Number of clients accessing cache:      800
            Number of HTTP requests received:       2276332
            Number of ICP messages received:        0
            Number of ICP messages sent:    0
            Number of queued ICP replies:   0
            Request failure ratio:   0.00
            Average HTTP requests per minute since start:   6100.2
    …………
    Internal Data Structures:
    1225098 StoreEntries
    57947 StoreEntries with MemObjects
    57868 Hot Object Cache Items
    1205423 on-disk objects

性能仍然不错。

4、squid优化方案

(1)常用的squidclient命令:
  mgr:info
    Request failure ratio:失败率,主要跟网络有关
    Request Hit Ratios:命中率,如果太低(<20%),就没有意义了
    Storage Swap size:磁盘上文件的总大小
    Cache Misses: 0.12106 0.15048
    Cache Hits: 0.00091 0.00091
    这两项的对比,如果接近,就说明缓存系统已经不起作用
    Number of file desc currently in use: 使用的文件句柄数,我的经验是到3000以上时,系统就会明显慢下来。(???刚加磁盘,等待验证跟数的关系)
    Files queued for open: 如果两位数以上,就加或去掉squid吧,它已经成为累赘。

mgr:io 网上的优化方案没见过用它,但我觉得它最有用,可以分析缓存文件的大小,以此来调节缓存区的最大文件体积,如果有多个硬盘,可以把它们平均分一下。我用了三块硬盘,第一块最大限制为1536(3个扇区大小,再大了浪费空间了,不知道aufs有没有特殊的机制???),对应机率差不多为30,第二块为6680,第三块由于文件体积比较大,所以机率少分配一点,长期观察,第三块闲得多点,所以把第三块跟系统盘放一起:

    number of reads: 6919199
    Read Histogram:
    1- 1: 725 0%
    2- 2: 1091 0%
    3- 4: 316 0%
    5- 8: 628 0%
    9- 16: 1538 0%
    17- 32: 4510 0%
    33- 64: 19317 0%
    65- 128: 67065 1%
    129- 256: 285571 4%
    257- 512: 314122 5%
    513- 1024: 245197 4%
    1025- 2048: 1569399 23% 此段用的最多,把这单独放到一个磁盘上
    2049- 4096: 1396080 20%
    4097- 8192: 1408089 20%
    8193-16384: 811719 12%
    16385-32768: 347989 5%

mgr:store_io  还是磁盘
    create.select_fail 0
    create.create_fail 0

(2)替换机制,由于是针对小文件,就用heap吧,网上资料不多,但是说明上说对小文件更有效:
    cache_replacement_policy heap GDSF
    memory_replacement_policy heap GDSF

(3)日志,还是关了吧。如果没有特殊要求,不需要记录客户端的网址,也不需要进行分析,关了要清静不少:
    access_log none
    cache_store_log none

5、FreeBSD的必用工具:
   top:查看squid的利用率,如果频繁出现io,那么就去处理磁盘吧;
   iostat : 查看磁盘的使用情况
   systat -vm 磁盘的busy程度;中断的数量
   netstat -m 查看mbuf
   vmstat -i 中断数,特别注意中断风暴
   rate -i em0 -f "port 80" -Rb 查看通过代理的数据包和流量统计

6、总结:缓存服务器,最主要的还是要优化好磁盘,当然内存足够大除外——现实情况是:机器只有1G内存!