Nov 17 2008

nginx 的 tcp_nopush 和 tcp_nodelay

Category: 技术ssmax @ 17:06:52

nginx的 tcp_nopush 就相当于freebsd下面的TCP_NOPUSH 或者 linux 下面的TCP_CORK

这个东东和tcp_nodelay是互斥的。下面是详细的解释。

 

TCP_NODELAY 和 TCP_CORK,
这两个选项都对网络连接的行为具有重要的作用。许多UNIX系统都实现了TCP_NODELAY选项,但是,TCP_CORK则是Linux系统所独有的而且相对较新;它首先在内核版本2.4上得以实现。此外,其他UNIX系统版本也有功能类似的选项,值得注意的是,在某种由BSD派生的系统上的TCP_NOPUSH选项其实就是TCP_CORK的一部分具体实现。
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络拥塞问题(欲了解详情请参看IETF RFC 896)。他解决的问题就是所谓的silly window syndrome ,中文称“愚蠢窗口症候群”,具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞,。 Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。
现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle算法。
另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。
假设应用程序使用sendfile()函数来转移大量数据。应用协议通常要求发送某些信息来预先解释数据,这些信息其实就是报头内容。典型情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。
但是,如果我们在套接字上设置了TCP_CORK(可以比喻为在管道上插入“塞子”)选项,具有报头的包就会填补大量的数据,所有的数据都根据大小自动地通过包传输出去。当数据传输完成时,最好取消TCP_CORK 选项设置给连接“拔去塞子”以便任一部分的帧都能发送出去。这同“塞住”网络连接同等重要。
总而言之,如果你肯定能一起发送多个数据集合(例如HTTP响应的头和正文),那么我们建议你设置TCP_CORK选项,这样在这些数据之间不存在延迟。能极大地有益于WWW、FTP以及文件服务器的性能,同时也简化了你的工作。示例代码如下:

intfd, on = 1;

/* 此处是创建套接字等操作,出于篇幅的考虑省略*/

setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* cork */
write (fd, …);
fprintf (fd, …);
sendfile (fd, …);
write (fd, …);
sendfile (fd, …);

on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 */

不幸的是,许多常用的程序并没有考虑到以上问题。例如,Eric Allman编写的sendmail就没有对其套接字设置任何选项。

Apache HTTPD是因特网上最流行的Web服务器,它的所有套接字就都设置了TCP_NODELAY选项,而且其性能也深受大多数用户的满意。这是为什么呢?答案就在于实现的差别之上。由BSD衍生的TCP/IP协议栈(值得注意的是FreeBSD)在这种状况下的操作就不同。当在TCP_NODELAY 模式下提交大量小数据块传输时,大量信息将按照一次write()函数调用发送一块数据的方式发送出去。然而,因为负责请求交付确认的记数器是面向字节而非面向包(在Linux上)的,所以引入延迟的概率就降低了很多。结果仅仅和全部数据的大小有关系。而 Linux 在第一包到达之后就要求确认,FreeBSD则在进行如此操作之前会等待好几百个包。

在Linux系统上,TCP_NODELAY的效果同习惯于BSD TCP/IP协议栈的开发者所期望的效果有很大不同,而且在Linux上的Apache性能表现也会更差些。其他在Linux上频繁采用TCP_NODELAY的应用程序也有同样的问题。


Nov 13 2008

锒铛入狱

Category: 乱up当秘笈ssmax @ 19:45:44

风光一时的阿扁终于进去了,进去之前还叫嚣了一把,见过无耻的,没见过这么无耻的。。。


Nov 12 2008

笑话一则

Category: 乱up当秘笈ssmax @ 21:22:51

有一美女下夜班,被一好色男子尾随跟踪,美女很害怕,正好路过一片坟地, 好色男子正要下手, 美女走到一座坟墓前说:“爸爸,开门吧,我回来了”。吓的好色男子狂奔而去。  美女为自己的聪明得意地笑了起来,哪知笑声未落,从坟墓里传出一个阴森森的声音说:“闺女,你咋又忘记带钥匙了呢?”吓得美女尖叫著跑了。  这时,一个盗墓者从坟墓里爬了出来,说:“影响我工作,吓死你”。突然发现墓碑前有一老者,手拿凿子在刻墓碑,就好奇地问:“你在干吗”?老者生气地说:“这些不肖子孙把我的墓碑都刻错了,只好自己来改啦”。盗墓者一听,吓得撒腿就跑了。 看著盗墓者的背影,老者冷笑道:“跟老子抢生意,吓死你”。一不小心,凿子掉地上了,老者正要弯腰去拾,却看见从草丛中伸出一只手,同时还有个冷冰冰声音:“ 啊,敢乱改我家的门牌号”。吓得老者连滚带爬地跑了。  一个拾荒者从草丛中爬出来,捡起地上的凿子,感叹道:“这年头,捡块烂铁还得费这么大神。”祝辛苦挣钱的同志们天天快乐 !


Nov 12 2008

squid做二级proxy时候需要注意的

Category: 乱up当秘笈ssmax @ 13:49:03

因为后台直接撑不住连接数,需要在前台lvs+squid之间再加一层squid作为后台proxy,加上去以后发现频繁有

WARNING: Forwarding loop detected for:

错误,/etc/hosts和dns那边的设置是没有loop的应该,那唯一可能就是squid通过Via head来检查了,检查hostname,一看,果然如此。。。因为统一配置,proxy和前台的squid全部都是同一个hostname的,导致前台过来的请求被认为是loop了。

改一下配置文件的visible_hostname就好了

另外关于替换策略,proxy的命中率很低,看来要换几个替换策略再测试一下了。


Nov 11 2008

网站压力测试

Category: 技术ssmax @ 17:15:37

linux下面主要就是

Siege、webbench、ab

ab是apache自带的了,其他两个都是开源的。

Windows下面就是微软的 Web Application Stress

还有一只HP的Loadrunner,有windows和linux版,不过都是一些超大型的测试框架了,没有兴趣去深入研究。


Nov 10 2008

Category: 乱up当秘笈ssmax @ 17:53:11

从早上就一直没有停过手。。。

广州网通机房有 30台squid+3台lvs+1台lvs热备 顶图片的流量,tmd如果再挂就杀了我吧

顺便整理了一下机器,乱七八糟的原来,汗啊汗。

还要准备搬西单机房,靠,头疼。


Nov 09 2008

昨天立冬

Category: 乱up当秘笈ssmax @ 10:04:25

一下子冻了10度都有,等冬至再冻个10度,冬天就真的来了,现在只是秋天,哈哈


Nov 07 2008

Lighttpd 的连接数

Category: 乱up当秘笈ssmax @ 18:30:35

server.max-connections

server.max-fds

源代码看了一下,应该是和两个都有关,继续看看吧,今晚不知道还会不会挂掉。

今天下午boss说要不要去四川听讲座。。。汗啊,是什么xx沟冰川自然区。。。冰川,冻死啊,还要下周就出发,直接了当说不去了,tnnd都没人去竟然要摆我上台。


Nov 06 2008

debian的chkconfig

Category: 技术ssmax @ 13:36:55

redhat上面的chkconfig比较好用,原来不知道debian上面也有,还去装了一个rcconf,原来debian自己就带有一个update-rc.d脚本,直接可以完成需要的东西了。

usage: update-rc.d [-n] [-f] <basename> remove
       update-rc.d [-n] <basename> defaults [NN | sNN kNN]
       update-rc.d [-n] <basename> start|stop NN runlvl [runlvl] […] .
                -n: not really
                -f: force

 

例子:

update-rc.d nfs start 20 2 3 4 5 . stop 20 0 1 6 .


Nov 06 2008

LVS– ipvsadm命令参考(转载)

Category: 技术ssmax @ 10:48:32

LVS– ipvsadm命令参考(转载)

对ipvsadm 的命令参考,并根据自己使用的经验,进行了一个简单的翻译,希望
对ipvsadm 的使用者有一定的帮助。
为了更好的让大家理解这份命令手册,将手册里面用到的几个术语先简单的介绍
一下:
1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法

ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm –set tcp tcpfin udp
ipvsadm –start-daemon state [–mcast-interface interface]
ipvsadm –stop-daemon
ipvsadm -h
命令选项解释:
有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可
以。
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的
VRRP 功能。
–stop-daemon 停止同步守护进程
-h –help 显示帮助信息
其他的选项:
-t –tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]
-u –udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出IP 地址和端口的数字形式

例子
  b.  清除ipvsadm表
      $ sudo ipvsadm -C
  c.  使用ipvsadm安装LVS服务
      $ sudo ipvsadm -A -t 192.168.192.168:80 -s rr   ##192.168.192.168是虚拟IP
  d.  增加realserver
      $ sudo ipvsadm -a -t 192.168.192.168:80 -r 192.168.1.11:80 -m -w 1
      $ sudo ipvsadm -a -t 192.168.192.168:80 -r 192.168.1.128:80 -m -w 1
  e.  测试
      browser open 192.168.192.168,同时ipvsadm打开。
      $ sudo ipvsadm
      IP Virtual Server version 1.2.1 (size=4096)
      Prot LocalAddress:Port Scheduler Flags
        -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
      TCP  192.168.192.168:http rr
        -> 192.168.1.128:http           Masq    1      0          0
        -> 192.168.1.11:http            Masq    1      0          0


« Previous PageNext Page »