Nginx做前端Proxy时TIME_WAIT过多的问题

我们的DSP系统目前基本非凌晨时段的QPS都在10W以上,我们使用Golang来处理这些HTTP请求,Web服务器的前端用Nginx来做负载均衡,通过Nginx的proxy_pass来与Golang交互。

由于nginx代理使用了短链接的方式和后端交互的原因,使得系统TIME_WAIT的tcp连接很多:

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 250263
CLOSE_WAIT 57
FIN_WAIT2 3
ESTABLISHED 2463
SYN_RECV 8

ss 比 netstat 要快,所以也可以用下面的命令来查看:

shell> ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'

这会占用系统过多的端口,还浪费了系统资源,所以我们必须想办法减少TIME_WAIT。

TIME_WAIT导致占用过多端口的一个影响是会占用我们需要使用到的端口,例如我们有个服务监听的端口为8012,重启的时候经常会提示端口被占用。
通过查看/proc/sys/net/ipv4/ip_local_port_range可以知道设置的Linux内核自动分配端口的端口范围:

shell> cat /proc/sys/net/ipv4/ip_local_port_range
1025 65535

对于这个设置系统就会从1025~65535这个范围内随机分配端口来用于连接,而我们服务的8012端口刚好在这个范围之内,所以如果8012刚好被系统分配出去使用了,则启动我们服务的时候,就会提示端口被占用。

所以我们需要设置/proc/sys/net/ipv4/ip_local_reserved_ports来告诉系统给我们预留哪些端口,不可以用于自动分配。

shell> vim /etc/sysctl.conf
net.ipv4.ip_local_reserved_ports = 8012,11211-11220

shell> sysctl -p

关于预留端口的更具体信息可以参考:

网络端口预留
预留端口避免占用ip_local_reserved_ports
上面我们解决了端口占用问题,但是我们还是需要解决TIME_WAIT过多的问题。
Nginx 1.1以上版本的upstream已经支持keep-alive的,所以我们可以开启Nginx proxy的keep-alive来减少tcp连接:

upstream http_backend {
 server 127.0.0.1:8080;

keepalive 16;
}

server {
 ...

location /http/ {
 proxy_pass http://http_backend;
 proxy_http_version 1.1;
 proxy_set_header Connection "";
 ...
 }
}

可以参加Nginx的官方文档: http://nginx.org/cn/docs/http/ngx_http_upstream_module.html#keepalive

开了keep-alive之后,TIME_WAIT明显减少:

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 12612
CLOSE_WAIT 11
FIN_WAIT1 4
FIN_WAIT2 1
ESTABLISHED 7667
SYN_RECV 3

另外不少文章提到可以修改系统的/etc/sysctl.conf配置来减少TIME_WAIT的tcp连接:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

参见: http://blog.s135.com/post/271/

不过开启tcp_tw_recycle可能会带来一些不稳定的网络问题,请参考:

记一次TIME_WAIT网络故障
再叙TIME_WAIT
关于sysctl相关配置的说明,请参考:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

参考文章:

部分网络内核参数说明
http://performancewiki.com/linux-tuning.html
tcp协议timestamp字段导致问题分析
http://www.lognormal.com/blog/2012/09/27/linux-tcpip-tuning/

移动端MRAID广告相关资源

MARID是Mobile Rich Media Ad Interface Definitions的缩写,即移动富媒体广告接口定义。

下面是相关的一些资料。

 

浅析Ad Exchange广告交易模式

 

众所周知,互联网广告是互联网行业最主要的赢利模式,流量变现成为互联网商业产品非常重要的评价标准。随着互联网人群定向技术的发展,互联网广告也开始摆脱单一、古板的交易模式,转而向更精确高效的交易模式转变。

Ad Exchange是互联网广告交易平台,像股票交易平台一样,Ad Exchange联系的是广告交易的买方和卖方,也就是广告主方和广告位拥有方。说到买卖双方,就要引出两个为买卖双方服务的平台——DSP平台和SSP平台。

DSP:互联网里有成千上万的广告主,他们急需推广自己的产品,寻找优质的媒介和精准的目标用户,优化广告投放策略,提高投入产出比。简单的讲,DSP就是广告主服务平台,广告主可以在平台上设置广告的目标受众、投放地域、广告出价等等。

SSP:互联网里也有成千上万拥有丰富媒体资源和用户流量的网站,他们急需把庞大的流量变现来发展壮大,同时还希望每一个流量都能够达到最大的收益。简单的讲,SSP就是一个媒体服务平台,站长们可以在ssp上管理自己的广告位,控制广告的展现,设置补余等等。

NewImage

和股票交易平台不同的是,Ad Exchange平台的竞价机制不是先到先得而是竞价获得,即RTB模式。

RTB —— Real Time Bidding 的简称,就是实时竞价。跟传统购买形式相比,RTB是在每一个广告展示曝光的基础上进行竞价,就是每一个PV都会进行一次展现竞价,谁出价高,谁的广告就会被这个PV看到。

有个问题出现了,为什么广告主即买方会为了一个广告PV而竞相出价呢,这个广告位有什么了不起的,会让广告主心甘情愿出最高价来竞标。秘密就在于,Ad Exchange广告平台售卖的不是传统意义上的广告位了,而是访问这个广告位的具体用户,这个用户会有自己的兴趣爱好,广告如果能够投其所好,就能产生最大的收益。这样的用户在互联网海洋里可是稀缺资源,他完全有魅力让广告主来竞相竞价获得在用户面前展现自己的机会。那么,Ad Exchange是怎么知道这个访问用户是谁,他会对什么更感兴趣呢?这就要引出互联网数据平台DMP了。

DMP(Data-ManagementPlatform)数据管理平台,是把分散的第一、第三方数据进行整合纳入统一的技术平台,并对这些数据进行标准化和细分,从而把这些细分结果推向现有的互动营销环境里。

有了DMP,Ad Exchange就可以知道访问广告位的用户是对什么感兴趣了用户了,这样RTB模式就有了运营的资本,广告主也乐于出较高的价钱来买这个用户。

介绍完了买卖双方和交易方式,下面就来看看Ad Exchange广告交易平台的运行方式吧。当一个用户访问广告位页面时,ssp端向Ad Exchange发出访问讯号,告知有一个访问请求,ssp把广告位的具体信息,例如所属站点、最低出价以及通过DMP分析匹配后的用户属性信息打包发送给各个DSP,DSP端开始对这个广告展现进行竞价,竞价获胜者就能够让自己的广告展现在这个广告位上,进而让用户看到。下图描述的例子是一个对汽车感兴趣的用户访问站点,DSP端各个汽车厂家对这个用户展开争夺的过程。

NewImage

针对具体用户的广告投放方式相较于传统的买固定广告位包天或者包月展现,优势还是很明显的,既能够有效的提高广告主的ROI,也能够让广告位的收益最大化。假设一个汽车广告主按cpm方式花50块买了10个PV的展现,10个PV里有5个人对汽车感兴趣,另外5个人对美食感兴趣,那么汽车广告主覆盖有效用户的成本是50块,站长的收益也只有是50块,而那些美食广告主无法覆盖目标用户,没有展现机会;而如果按照Ad Exchange模式购买广告,广告主只需要针对5个目标用户竞价展现就好,即时每个目标用户的出价会高于CPM方式下的平均出价,但是由于精准,广告主的成本不但没有增加反而有所下降,花更少的钱覆盖更多的用户,这样就有效的提高了广告主的ROI,同样,美食广告主也可以通过Ad Exchange来覆盖到另外5个对美食感兴趣的用户,获得广告展示机会。对站长而言,一个广告位不再被某一个单一广告主购买后独占,而是对每一个流量都竞价获利,这样就能够保证广告主的流量获得最大的收益,流量越大,收益越高。所以Ad Exchange更容易获得高质量的广告位资源。如下图所示:

NewImage

Ad Exchange在中国甚至亚洲都还处于蓝海,现在中国市场上还没有真正意义上的Ad Exchange,可以预见, Ad Exchange将是中国未来广告交易的一种重要方式,也将是展示广告的一个重要增长点。

附另外一张RTB原理图:

NewImage

 

NewImage

 

点击下载大图,大图更清晰

 

via: http://ueo.baidu.com/?p=1071