Archive for 02月, 2009

Feb 11 2009

linux 下优化编译参数参考

Published by David under Unix|Linux

http://en.gentoo-wiki.com/wiki/Safe_Cflags
访问此地址可以查看详细信息。

Xeon w/EM64T (also Pentium 4 P6xx or Celeron M 5xx)
vendor_id : GenuineIntel
cpu family : 15
model : 4,6
model name : Intel(R) Xeon(R) CPU XXXXMHz
model name : Intel(R) Celeron(R) M CPU 5xx @ XXXGHz
32-bit profile (x86):

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=prescott -O2 -pipe -fomit-frame-pointer”
CXXFLAGS=”${CFLAGS}”
64-bit profile (amd64):

CHOST=”x86_64-pc-linux-gnu”
CFLAGS=”-march=nocona -O2 -pipe -fomit-frame-pointer”
CXXFLAGS=”${CFLAGS}”

No responses yet

Feb 10 2009

MySQL的性能调优工具

Published by David under 数据库管理|DBA

年初的时候收藏过一篇关于mysqlreport的报表解读,和内置的show status,和show variables相比mysqlreport输出一个可读性更好的报表;但Sundry MySQL提供的脚本相比mysqlreport更进一步:除了报表还进一步提供了修改建议。安装和使用非常简单:
Continue Reading »

No responses yet

Feb 10 2009

解决TIME_WAIT过多问题

Published by David under Unix|Linux

#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

——————————————————————

先来看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。

——————————————————————

再来看看awk:

/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。

state[]
相当于定义了一个名叫state的数组

NF
表示记录的字段数,如上所示的记录,NF等于6

$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT

state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数

++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一

END
表示在最后阶段要执行的命令

for(key in state)
遍历数组

print key,”\t”,state[key]
打印数组的键和值,中间用\t制表符分割,美化一下。

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

下面附上TIME_WAIT状态的意义:

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT

是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?

主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。

也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的,除非受到攻击。

还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

No responses yet

Feb 10 2009

TCP 相关参数解释

Published by David under 网络|Network

tcp_syn_retries :INTEGER
默认值是5
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

tcp_synack_retries :INTEGER
默认值是5
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的tcp_syn_retries来决定这个值)
Continue Reading »

No responses yet

Feb 09 2009

[转帖]apache升级到了nginx的几个注意事项

Published by David under 应用|Application

最近把整站从apache升级到了nginx,客户的站点大概有30台服务器大部分架构位tomcat+apache,只有一个php页面
一下是我升级遇到的几个问题的注意点

1.
当我们去访问服务器上的一个目录时候,他不会自动加上一个/ ,浏览器会给出改页无法打开的错误,这个时候浏览器去取的地址实际上是upstream中所写的地址和端口或如果没有使用upstream时 当使用localhost做servername时候 浏览器会去访问http://127.0.0.1/dir。
解决办法
在每个虚拟主机的server定义中加上
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
注意 root字段的定义也一定要出现在server中 如果server中没有定义root 错误还将存在
例子:
server {
listen 800;
server_name www.1.com;
root /opt/1-index; //这边定义了 就会在目录访问的时候加上/ 如果这边没有定义这个 上面的url重写依然不会生效
include vhost/alias.conf;
include vhost/proxy.conf;
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
error_page 405 =200 @405;
location @405 {
proxy_pass http://PROXY_STATIC;
}
location / {
root /opt/1-index; //只在这边定义是没有用的,这边甚至可以不做定义
rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
index index.html index.htm;
}
Continue Reading »

No responses yet

Close
E-mail It