April 2011

tcp 内核参数对NAT 用户的影响

非原创,前同事参详出来的,我知道一下原因,但今天遇到了,决定mark 一下。

故障现象:

NAT 用户,也就是使用同一个出口ip 的那些用户,例如,使用办公网络的用户。NAT 用户访问网站时,表现为连接不上,技术一点说,就是建立不了tcp 握手。

很奇怪吧?同一个网络的用户,我可以访问,旁边的同学就不能访问。难道是RPWT 吗?

在网上可以搜到一个很普遍的系统优化方法,修改/etc/sysctl.conf ,添加

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

sysctl -p 让内核参数生效。

以前大家通常会遇到netstat 看到很多 TIME-WAIT 状态的连接,于是就会添加以上两句,加速回收TIME-WAIT 的资源。

但是这个优化现在已经行不通了。

为了提高TCP的性能,“RFC1323 – TCP Extensions for High Performance”提出了 一个机制(http://tools.ietf.org/html/rfc1323#page-29)来替代TIME- WAIT状 态的功能。linux 实现了它。这个机制通过记录来自每台主机的每个连接的分组时间戳来实现,要求 来自同一主机的同一连接的分组所携带的时间戳要比之前记录 的时间戳新,以便 “防止回绕的序号PAWS机制“ (http://tools.ietf.org/html/rfc1323#page-17) 丢弃接收属于旧连接的延时分组。这依赖于来自每个主机的每个 TCP连接分组所携 带的时间戳要单调递增才能实现。然而经过NAT的连接,其分组携带时间戳每个用户都不同的(甚至有人写了个论文,利用这个分组的时间戳来计算NAT 后端有多少台主机 http://phrack.org/issues.html?issue=63&id=3#article),也就是说同一个ip ,携带的时间戳不会单调递增。服务器端对同一个ip 过来的包的timestamp 做一个验证,导致这些连接分组被认为是属于旧 连接的延时分组而被丢弃。

具体有多少被drop 的包呢??请看 netstat -s 的其中一行

7439 packets rejects in established connections because of timestamp

为了防止这种情况呢,也很简单,修改一下内核参数,把 /proc/sys/net/ipv4/tcp_tw_{reuse,recycle} 的值都置为 0 吧。

为了纪念我连续工作超过24 小时

本周的第一天起床,多美好的一天啊,天清气爽的。9 点起床,10点半来到公司,恶梦才开始!!

服务器连续down 机,极其不稳定,由于各类服务我还没有上手,无奈,大部分情况下是眼睁睁地看着服务器down 的。晚上8 点到机房,12 点才把服务器装好上架。弄服务等东西,一直到了周二晚上的9 点左右,才把任务完成。服务器算是冷静下来了,算是过渡到一个较为稳定的状态了。打车回家,12 点躺下!共计39 小时,中间只是稍微趴了一下,大概就10+ 分钟。

为了纪念我连续工作超过24 小时,整整一天没有睡觉,我写下了这篇blog 。

虽然苦和累,但这段时间学习到的东西,在我旧东家可能得一个月了,因为时间都花费在和不懂技术的人的沟通去了,不错不错,哈哈。列几个遇到的问题和解决方案吧。

1,ubuntu server 的启动

装完以后,竟然开机启动后,载入到USB 的时候,会出现以下错误:

Gave up waiting for root device. Common problems:
-Boot args (cat /proc/cmdline)
-Check rootdelay= (did the system wait long enough?)
-Check root= (did the system wait for the right device?)
-Missing modules (cat /proc/modules; ls /dev)
/dev/disk/by-uuid/34e5c1 … does not exist …

然后就在 (initramfs) 这个提示符下了。

其实在这里,不算开不了机,exit 退出,就ok 了,继续linux 的启动过程,login 画面。

我的猜想嘛,内核没载入?也不是。不认 uuid ?也不是。本来不是大事情,exit 一下就好,但如果没有人在机器身边,那就无法重启了。

原因:initramfs 在载入到USB 驱动的时候,没载入完毕!必须等待其载入完毕,在内核里加一个rootdelay 就好了。

/boot/grub/grub.cfg 里,找到

linux   /vmlinuz-2.6.35-22-server root=UUID=541215f0-c868-40ec-b1d7-c7d083f18b80 ro   quiet

修改为
linux   /vmlinuz-2.6.35-22-server root=UUID=541215f0-c868-40ec-b1d7-c7d083f18b80 ro   quiet rootdelay=60
rootdelay 的时间,随意,30 或 60 应该都ok ,看自己机器的载入快慢吧,10 就太快了,呵呵。

2,ubuntu 的用户家目录加密

安装ubuntu 千万别加这个吧,哈哈。

encrypted home directory , 安装的时候,加上的话,用户的家目录就很安全了。会有以下情况出现。

/home/hello 是我的家目录,我没有登陆的话,如果有另一个用户想访问我的家目录,他会看不见我的家目录的所有被加密的所有文件,空空如也,简直好像被黑了!!

安全吧??但是,如果我有程序跑在我的家目录下呢??好吧,404 了,也爽歪歪了。

暂时没解决这个问题,因为太困了。也不敢贸然把 .Private 这类目录删了,以后在测试环境下弄。

3,DELL 的iDRAC6 远程控制卡

旧东家就是不帮我们弄一个远程控制卡,不搞无人值守机房。

我总算是玩到了这个东西了,不过因为连接的是内网,需要搭建一个vpn ,拨入vpn 以后,通过内网地址访问远程控制卡。

一个web 界面,我只是初玩,没时间细玩,have fun 。

4,DBA 了。

旧东家分工细了一点,有专门的DBA 。于是,我的DBA 技术到了09 年后,就没增长了。很多知识都落后了。

重新拾回来,实操了一下,充实!

5,nosql 了。

mongodb 更细致地看了一下,爽!

还有一些吧,忘了。第一次跨越一天的工作,累,但很爽,哈哈。

再见,网易

在这个开玩笑的节日,我做了一个艰难的决定,不是开玩笑,我要离开我工作了三年的网易了。

离职的原因,说到底是环境。三年前,我所在的部门是一个比较懒散的部门,没有统一的规章制度,没有统一的开发流程,没有太多的技术分工,但是部门的人相处起来很开心,就像一家人。其实,这不是一个做事情的部门,单纯从公司的角度去看,这是不好的。但从个人来说,挺开心的。从 09 年7 月部门搬迁到北京以后,一切都开始改变。部门进来很多新人,能力就不评价了,呵呵,我只能说性价比不高。整个部门现在看起来,更像是一个做事情的部门了,也确实做了不少事情出来了。但是,工作环境却越来越压抑。最重要的是,部门已经不再是搞技术的了,搞政治的。但不能不承认,现在的部门是一个做事情的部门,确实做出来不少事情。但一直没有改变的是,这个部门开发出来的东西,一直都是大学生都做得出来的,完全没有一个平台的思想在里面,这一点我讲了无数次,从今天开始,不再需要讲了。我在这个职位做下去,越来越不搞技术了,都是在处理繁杂的事务和需求。或许吧,我会升为一个小组长,但我觉得我仍然需要继续积累。在这个部门,除了处事方式不够成熟,其它方面,我做个小领导足够有余,但是,我仍然钟爱技术,不想搞政治,也不懂,所以,我离开吧。

我再也不用重复地向同一个人解释缓存是什么了。我再也不用面对这种情况:需求方发了邮件后,im 上对我说hi ,然后我还没回复就一个电话打过来对我说,“我给你发了一个邮件”。我再也不用面对着一堆截图,我不能复制上面的文字啊老大。我再也不用担心迟到的问题了!做IT 尤其是做运维竟然有严格的考勤制度!!我再也不用使用windows 了!我解脱了,哈哈

本来,我想离职后,在咖啡店享受一下小人生,写写代码的。还想着一个人去旅行,第一次一个人旅行呢,或者可以改变一下人生观呢。还想着,可能要练一下ios 开发了,现在够热门的嘛,把我的SA 技术放一下,转型去赚钱玩玩。做完这一切再去找工作。不过,貌似这些都会停留在计划了,因为貌似有事情等着我去做了。。。

坦白说,我是充满了怨念地离开的,但是,当离开在即,没有怨念,有点不舍。离开之际,三年的回忆又涌上心头,一幕一幕,虽然周围的同事基本完全换了一批,但不乏可爱的同事,我还是会经常想你们的。我毕业后就一直在网易工作,即使它已经不是我喜欢的当初那个网易了,我仍然会在心里留了一个位置给它,仍然会不时留意它的发展。

再见,网易。