一.当时使用场景
用户访问网站会有一条access log ,这条log会有用户的IP,为了了解每天网站访问者的地域分布情况,
需要拿到这些IP去查找IP所属地域;这样一下子就会有很多IP要到固定的服务(比如:http://www.ip.com/127.0.0.1)上去查询
二.分析难点和性能瓶颈
最简单和一般的实现方式就是拿到这些IP循环的请求查询;事实上我的第一版也是这么干的。
但是跑了一段时间后发现不少超时的,看/var/log/message 发现报了不少 localhost kernel: TCP: time wait bucket table overflow
这种错误。在网上查询了一下发现是由于服务器端口使用太多太快导致不够用;查到这里很多人也许会选择修改Linux内核参数扩大端口
开启端口复用,加快回收等等。这样做还是有一定的效果的但是没有根本上解决问题。
首先跟说一下一些基本知识和个人的理解:
1. http 连接本身是短连接、无状态的,并且在tcp连接之上的一个协议;
2. tcp 是端到端可信的、有状态的长链接;这两条如果不清楚可以自己去查找资料百度一下一大堆,这里不详细介绍了
3. 默认下发送一个http请求要有这几个过程:域名解析目标机器端口、tcp连接(本机一个端口和目标端口)、发送http请求、收到http响应、关闭(tcp)连接。
这样每个请求都需要这样来一遍,其实http 1.0 就差不多这样的;但在http 1.1 做了一些优化,这些优化不具体的介绍,只说这次使用Connnection这个报头
字段,默认下的值close还有一个keep-alive。
keep-alive 的作用就是复用tcp连接;在一个tcp连接上多次http请求响应,这样系统就不用耗费大量的资源放在建立和释放tcp连接上,还可以加快的http整体耗时。
另外有个坑要注意,一般如果你请求时带着keep-alive的话服务器一般会跟你保持连接也返回keep-alive,但是为了安全的原因,服务器可能会在一段时间(300秒或者100个http)内返回close,
一般服务器都有这个配置,感兴趣可以自己查阅。所以你得关注这个头,如果服务器关闭了连接你还得重新建立一个。