Archive for the ‘Unix/Linux’ Category

临近五一节日,估计所有的运维都一样,会紧张服务器的假期表现,并在节前的这些天里为此做许多的准备,以求尽可能能够实实在在的享用这个假期。其实每个假期都是这样的。我也不例外,虽然不是专职运维。不过有时候就这样,最担心什么事就会出什么事。这不,刚去机房加了机器,然后故障就来了。
Dell PowerEdge2950 II机器,当加到6块硬盘的时候,服务器就会出现报警,dmesg一下,发现硬盘报警,系统报Input/Output Error,重启后message文件里有如下内容:
[attach=21]
网上查了查,这种故障通常出现在USB设备上,我这台2950是内置了PERC 5i的Raid卡,出这种故障着实不明白。后来有朋友提醒到他们曾经遇到过类似的问题,同样是2950,当时是加了6块盘,只认出3块来,相比之下我这种情况还属于好的呢。Dell官方也没有给出类似问题的解决方法,先去机房把新加的硬盘拆下来换到柜子上试试,重启,OK了。
来不及细想了,先放心一下,启动机器,启动服务,回来慢慢再查这个问题吧。
如果你也曾遇到过类似的问题,或者有好的解决方案,请共享一下。

       郁闷的Nginx,现在文档还是比较少,官方的wiki里虽然有不少资料,不过还是不够全。
       好了,回归正题,今天在做一个小项目的时候,再次遇到Nginx经常会出现499状态的问题,表现是页面第一次能打开,第二次就打不开了。Nginx的日志里报如下错误:
             client closed prematurely connection, so upstream connection is closed too
        而且这个问题,在Firefox下不存在,只有在IE的时候才会出现。
        HTTP状态码是499,查了查Nginx的源代码,如下:
             #define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
        网上搜索到的情况不少,不过没有一个说到正确的解释的。于是还是自己来试吧。修改了好多地方,不见效果,后来对比另外一台机器的配置,增加了个 charset的设置,然后奇迹般的OK了。老实说,到现在也没搞明白到底是为什么。我猜的是:因为小项目,页面编码设置可能不是太规范,所以可能会有这 个问题,导致IE6在识别不正确的情况下,会用非正确编码(当时我是UTF-8)之外的编码来处理,因为长度不同,所以可能就提前关闭了连接。好像在 Apache下还没有遇到过这种情况。也不知道应该说IE6的不是呢?还是说Nginx的不是呢?

Installation
To get this running, I followed the documents @ the bottom of this post. Here’s the condensed version:
## note that the following just enables mailwrapper in ssmtp ## this is "to allow multiple MTAs to be installed". So if one is already using ssmtp one shant need that use flag.# echo "mail-mta/ssmtp mailwrapper" [...]

在UNIX中用sar命令进行系统维护
   在使用UNIX操作系统的过程中,我们常常会用到各种各样的问题,比如系统运行速度
突然变慢,系统容易死机或者主机所带的终端常出现死机,这时我们常常猜测,是硬
盘空间太小,还是内存不足?I/O出现瓶颈,或者是系统的核心参数出了问题?这时,
我们应该考虑使用系统给我们提供的sar命令来对系统作一个了解,该命令是系统维护
的重要工具,主要帮助我们掌握系统资源的使用情况,特别是内存和CPU 的使用情况,
是UNIX系统使用者应该掌握的工具之一。
sar 命令行的常用格式:
sar [options] [-A] [-o file] t [n]
在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有
的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式
存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项,sar命令
的选项很多,下面只列出常用选项:
      -A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:没有使用的内存页面和硬盘块。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况。
-w:系统交换活动。
下面将举例说明。
例一:使用命令行 sar -u t n
例如,每60秒采样一次,连续采样5次,观察CPU 的使用情况,并将采样结果以二进制
形式存入当前目录下的文件zhou中,需键入如下命令:
# sar -u -o zhou 60 5
屏幕显示:
  SCO_SV   scosysv 3.2v5.0.5 i80386   10/01/2001
14:43:50   %usr   %sys  %wio    %idle(-u)
14:44:50   0     1    4      94
14:45:50   0     2    4      93
14:46:50   0     2    2      96
14:47:50   0     2    5      93
14:48:50   0     2    2      96
Average    0     2    4      94
在显示内容包括:
  %usr:CPU处在用户模式下的时间百分比。 [...]

From: http://uw713doc.sco.com/en/FS_admin/_Time_and_Space_Optimization.html
If you are using a ufs filesystem, the system attempts to optimize the time it takes to perform operations on the filesystem. In certain circumstances, the system attempts to optimize the space on the storage media being used by the filesystem.
Space optimization occurs when file fragmentation exceeds: (free – 2) % of free disk [...]

转载自: 彭勇华的Squid中文Blog
客户端的连接,可被client-side模块接收和解析,也可以由clientBeginRequest()函数主动创建一个到客户端的连接。
 
检查访问控制规则。客户端请求会建立一个ACL数据结构,并且注册一个回调函数,用于在访问控制完成时,通知相关结果。
 
在访问控制通过后,请求可能被重定向。
 
客户端请求转交到GetMoreData()函数,该函数在缓存里查找请求目标,和相应的Vary:版本号。假如缓存命中,client-side模块注册其自身信息到StoreEntry里。否则,请求被转发,并可能带一个If-Modified-Since头部。
 
请求转发过程以rotoDispatch()函数开始。该函数启动peer选择算法,可能包含发送和接受ICP消息的调用。peer选择算法也会检查相关配置选项例如never_direct和always_direct。
 
假如有ICP响应抵达,选择过程就终止在protoStart()函数。该函数调用相应的协议级函数,用以转发请求。我们假设这里是一个HTTP请求。
 
HTTP模块首先打开到原始WEB服务器或cache peer的连接(cache peer仅在配置了cache集群时才存在)。假如没有持久socket可用,就发起一个到Network Communication模块的连接请求,并包含一个回调函数。comm.c程序负责建立连接,并处理连接异常。
 
当TCP连接建立后,HTTP建立写缓存,并将请求写入socket。然后它建立相应的socket读缓存,用以接受和处理HTTP响应。
 
响应一旦接受,HTTP响应头部(header)被解析,并被放在一个响应数据结构里。在响应数据(data)被读取时,它被追加到StoreEntry里。每次数据追加到StoreEntry时,会通过一个回调函数,通知client-side模块有新的数据。读取速率取决于延迟池(delay pools,如果配置了的话)。
 
当client-side模块接收到通知后,它从StoreEntry里拷贝出数据,并写往客户端socket。
 
当数据追加到StoreEntry里,并被客户端读取后,数据可能被写往磁盘。
 
当HTTP模块完成了从上流服务器读取数据后,它把StoreEntry标记为“完成”。到服务器的socket可能被关闭,或被放入持久连接池,以备将来使用。
 
当client-side模块写完所有目标数据后,它从StoreEntry里注释掉其自身。同时它要么等待客户端的下一个请求,要么关闭客户端连接。

Copy From : http://hi.baidu.com/haigang/blog/item/aa8b9123ba760341ac34de69.html
选择最小安装完成后
如果没有安装内核源代码
可以直接从光盘复制内核源代码到系统安装。
install-sh all
更新ports树
/usr/local/bin/cvsup -g -L 2 /etc/ports-supfile
需要安装cvsup 和更新ports-supfile
pkg_add -r cvsup-without-gui
cp /usr/share/examples/cvsup/ports-supfile /etc/
fastest_cvsup -c CN 测试速度
 

 
Step 4 FreeBSD升级系统源代码.
 

 
 
 

 

 
 
FreeBSD下升级系统src:

 
创建/root/scripts/src-update.sh文件
进入/root/scripts目录,创建src-update.sh文件
 
Shell:
 

 
cd /root/scripts/
 
 
vi /root/scripts/src-update.sh
 

内容如下:
 
Editor:
 

 
#!/bin/sh
 
 
# updating source
 
 
echo "Beginning Source Update"
 
 
/usr/local/bin/cvsup -g -L 2 /etc/stable-supfile
 
 
echo "Source Update Complete"
 

对/root/scripts/src-update.sh文件添加执行权限
 
Shell:
 

 
cd /root/scripts/
 
 
chmod +x /root/scripts/src-update.sh
 

复制/usr/share/examples/cvsup/stable-supfile到/root/
 
Shell:
 

 
cd /root
 
 
cp /usr/share/examples/cvsup/stable-supfile /root/
 

修改stable -supfile文件,选择最近的CVS服务器。(以上测试得知最近的是cvsup4.cn.freebsd.org)
 
Shell:
 

 
cd /root
 
 
vi /root/stable-supfile
 

修改以下部分
 
 
 

 
修改前:
 
 
*default host=CHANGE_THIS.FreeBSD.org
 
 
修改后:
 
 
*default host=cvsup4.cn.FreeBSD.org
 
 
 
 
 
修改前:
 
 
*default release=cvs tag=RELENG_6
 
 
修改后:
 
 
*default release=cvs tag=RELENG_6_2
 
 
 
 

复制修改好的stable-supfile文件,到/etc/ stable-supfile。并且改权限为640只有root用户才可以读写
 
Shell:
 

 
cd /root
 
 
cp /root/stable-supfile /etc/stable-supfile
 
 
chmod 640 [...]

在FreeBSD里设置第二块网卡为内网网卡,同时又不经过路由器连接另一台机器的话,dmesg经常会收到如下的信息:
System: arp: [ip] is on [if 0] but got reply from [mac] on [if 1]。
其意思就是IP地址本来在网卡if0上,但返回的MAC地址却是if1的MAC地址。这种情况也是受到arp病毒攻击时的会表现出来的状况。对这种情况,解释是这样的:
A switch works on a low level: it only knows MAC addresses. When it receives a broadcast message it will send that message to all of its ports (like it is supposed to do). Your machine maneges an arp table (try [...]

Linux服务器前台常出现的错误提示及含意
  一般类的提示
  eth1: Too much work at interrupt, IntrStatus=0×0001
  这条提示的含意为. 某网卡的中断请求过多. 如果只是偶尔出现一次可忽略. 但这条提示如果经常出现或是集中出现,那涉及到的可能性就比较多有可能需要进行处理了.。可能性比较多,如网卡性能;服务器性能;网络攻击..等等。
  一般类的提示
  IPVS: incoming ICMP: failed checksum from 61.172.0.X!
  服务器收到了一个校验和错误的ICMP数据包。 这类的数据包有可能是非法产生的垃圾数据.但从目前来看服务器收到这样的数据非常多.一般都忽略。
  一般代理服务器在工作时会每秒钟转发几千个数据包.收到几个错误数据包不会影响正常的工作.这是问我最多的一类提示了。
  一般类的提示
  NET: N messages suppressed.
  服务器忽略了 N 个数据包.和上一条提示类似.服务器收到的数据包被认为是无用的垃圾数据数据. 这类数据多是由攻击类的程序产生的。
  这条提示如果 N 比较小的时候可以忽略.但如果经常或是长时间出现3位数据以上的这类提示.就很有可能是服务器受到了垃圾数据类的带宽攻击了。
  一般类的提示
  UDP: bad checksum. From 221.200.X.X:50279 to 218.62.X.X:1155 ulen 24
UDP: short packet: 218.2.X.X:3072 3640/217 to 222.168.X.X:57596
218.26.131.X sent an invalid ICMP type 3, code 13 error to a broadcast: 0.1.0.4 on eth0
  服务器收到了一个错误的数据包.分别为 UDP校验和错误; [...]

转载自:http://mindream.wang.blog.163.com/blog/static/23251222200741432519112/
进程无法启动,软件运行速度突然变慢,程序的"Segment Fault"等等都是让每个Unix系统用户头痛的问题,本文通过三个实际案例演示如何使用truss、strace和ltrace这三个常用的调试工具来快速诊断软件的"疑难杂症"。
truss和strace用来 跟踪一个进程的系统调用或信号产生的情况,而 ltrace用来 跟踪进程调用库函数的情况。truss 是早期为System V R4开发的调试程序,包括Aix、FreeBSD在内的大部分Unix系统都自带了这个工具;而strace最初是为SunOS系统编写的,ltrace 最早出现在GNU/Debian Linux中。这两个工具现在也已被移植到了大部分Unix系统中,大多数Linux发行版都自带了strace和ltrace,而FreeBSD也可通 过Ports安装它们。
你不仅可以从命令行调试一个新开始的程序,也可以把truss、strace或ltrace绑定到一个已有的PID上来调试一个正在运行的程序。三个调试工具的基本使用方法大体相同,下面仅介绍三者共有,而且是最常用的三个命令行参数:

-f :除了跟踪当前进程外,还跟踪其子进程。-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。

使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行例子:

truss -o ls.truss ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。strace -f -o vim.strace vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。ltrace -p 234: 跟踪一个pid为234的已经在运行的进程。

三个调试工具的输出结果格式也很相似,以strace为例:

brk(0) [...]