• 一、背景描述

    如图,LINUX是一台网关服务器,内有3块网卡
    eth1绑定172.17.0.0/16的IP,该网段IP可以通过172.17.1.1上网
    eth0绑定192.168.10.0/24的IP,该网段IP可以通过192.168.10.1上网
    eth2绑定192.168.1.1,是内网用户的网关



    二、需求分析

    内网用户应该走172.17.1.1这个路由上网
    但由于工作需要,部分用户应该有访...
  • 2007-09-04

    linux 策略路由

    linux策略路由应用 http://www.52wyx.com/Article/Linux/200606/16172.html
  • 这是兄弟我将近一个星期的心血,终于做成了,现整理一下,拿出来和大家分享一下吧!
    有哪些地方说的不对,请各位指出来,共同学习.

    参考文档:
    http://iptables-tutorial.frozent ... rial-cn-1.1.19.html
  • 2007-08-07

    test

    l;dsmff;lasdfmfda;lsm;a;mlafdsl;m

  • 0.分析过程
    首先,分析了DOS的类型、特征、攻击方法。

    使用netstat -na|grep SYN_RECV|wc,发现当前存在大量SYN_RECV状态连接,源地址
    都是伪造的,netstat -na|grep SYN_RECV|wc显示数量为1024个,这个是当然,Linux
    默认的Syn_Backlog对列就是1024,超过的SYN都丢弃了。

    针对的攻击端口是80:WWW服务,当然,Web服务器也已经无法访问了。

    在打开SYN_Cookie防护之后,攻击得到了一些缓解,但随后攻击流量又增大了,情况也好
    不到哪儿去,而Linux的Iptables又不能做syn_proxy的,那么只好从其他方面下手,用
    tcpdump -w抓下了当时的数据流量,计数分析流量大...

  • [root@web02 ~]# vi /etc/sysctl.conf
    新增如下内容:
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_syncookies=1
    使内核参数生效:
    [root@web02 ~]# sysctl -p
    readme:
    n...
  • Tunning settings in sysctl.conf really help speeding things up under heavy usage..

    Basically just edit your /etc/sysctl.conf file (you will need to be root)...

    Here are my settings (you may or may not have some of these already), I tried to put a short comment for each, you can google them if you need more info:


    # Disables packet forwa...

  •   
  • 2007-07-12

    ntp配置

    There is a wonderful net standard called NTP that can synchronize system clocks. You may already have followed someone's advice and used 'ntpdate' or 'rdate' to set the time on your server. But NTP is really designed to keep a large network of clocks perfectly synchronized. Not just accurate to the second, but to the millis...
  • 2007-07-11

    my.cnf说明

    在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL
  • 2007-07-11

    my.cnf配置

    port                = 3306
    socket                = '/var/lib/mysql/mysql.sock'
    skip-locking
    key_buffer = 512M
    max_allowed_packet = 8M
    table_cache = 512
    sort_buffer_size = 2M
    read_buffer_size = 2M
    read_rnd_buffer_size = 8M
    myisam_sort_buffer_size = 64M
    thread_ca...
  • 2007-07-11

    mysql参数意义


    (1)、back_log:
            要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
            back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
    &nb...
  • 2007-07-10

    wekl;jwjewfekop

    ;lmdsvamklmdml;mlfsdmvsdm;lfdsml;vdsmldfml;
  • web服务器用了一段时间,总结了以下一些经验供大家参考


    一、够用就好
    可以理解为web服务器是一条高速公路,如果出现让每一条车道都足够宽,那么消耗了很多的路面资源,能跑的车就少了。同样web服务器也是这样,不是所有的配置调整的越大越好,一般php+mysql+apache的架构,因为老碰到mysql连接数满的问题,所以把mysql连接数设置的非常高,同时加大mysql cache结果导致负载很高的时候,内存被大量消耗导致服务器频繁死机。
    后来检查了下程序,发现mysql连接数过高是由于程序编写不合理造成了,调整了下,服务器连接数就下来了:很多人可能跟我一样写php数据库查询完以后没有立即关闭数据库的习惯,让进程终止后系统自动回收打开的数据连接,但是如果系统非常慢的时候...
  • 2007-04-13

    SSH 指南


    最近不少网友问关于 SSH 的问题, 我在工作中经常用这个东西, 整理过一些文档,
    拿出来和大家共享一下.  

    OpenSSH

    OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支...
  • 2007-04-13

    安装集群LVS

    create in 20060812 by ghbspecial
    环境描述:本文在配置LVS时使用三台linux,一台做Directorserver(192.168.0.25) ,两台做realserver(192.168.0.127 192.168.0.12,在配置lvs+heartbeat时又添加了一台(192.168.0.12...
  • 2007-04-13

    RPM制作宝典



    (上)
    http://www.linuxfans.org/nuke/modules.php?name=News&file=article&sid=909&mode=&order=0&thold=0

    (中)
    http://www.linuxfans.org/nuke/modules.php?name=News&file=article&sid=910&mode=&order=0&thold=0

    (下)
    http://www.linuxfans.org/nuke/modules.php?name=News&file=article&sid=9...


  • Linux 启动时需要哪些步骤呢?本文将详细描述不同的运行级在启动中的作用。
    对于那些在DOS/Win9x/NT 平台下的高级用户而言,Linux 似乎是一个怪物。没有confi
    g.sys ,没有
    autoexec.bat,具有个人特色的机器配置不知道从何开始。
    需要说明的是,很多人认为Linux 是Unix 的一个克隆,但是,这种说法对于Linux 是不
    公平的。Linux
    比Unix更加开放,功能更强大。我们应该称之为GNU/Linux 。
    Linux 启动时,运行一个叫做init 的程序,然后由它来启动后面的任务,包括多用户环
    境,网络等。
    那么,到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的...
  • 标题列表项目:  (一般本机的 firewall 配置问题)

    1. 如何查询我目前 iptables 的配置组态设定 ?
    2. 如何关闭 Linux Distro 本身的 firewall 配置并让规则清空不启用?
    3. 关于 RedHat 9, Fedora 与 RHEL 的 firewall 配置问题
    4. 如何使用手动方式清空与重置 iptables firewall rule?
    5. iptables firewall 本身封包比对判断流程图为何?
    6. iptables firewall 本身封包比对规则方式为何?
    7. 使用 -P INPUT DROP 引起的主機本身對外連線不通问题?
    8. 使用 -P INPUT DROP 导致本机存取自己服务也受到限制?
  • [mysql]在用limit查询的同时取得总的记录数

    通常我们都用如下的sql来进行列表

    SELECT COUNT(*) FROM users WHERE name LIKE ‘a%’;
    SELECT name, email FROM users WHERE name LIKE ‘a%’ LIMIT 10;

    但是从Mysql4.0.0开始,我们可以选择使用另外一个方式:

    SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE ‘a%’ LIMIT 10;
    SELECT FOUND_ROWS();

    其中SQL_CALC_FOUND_ROWS 告诉Mysql将sql所处理的行数记录下来,FOUND_ROWS() 则取到了这个纪录。

    虽然也是两个语句,但是只执行了一次主查询,所以效率比原来要高很多。

    详细信息见这里 http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#id2890708

  • 2007-01-23

    nfs配置

    NFS server可以看作是一个FILE SERVER,它可以让你的PC通过网络将远端得NFS SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样。
    NFS协议从诞生到现在为止,已经有多个版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。
    二、各NFS协议版本的主要区别
    V3相对V2的主要区别:
    1、文件尺寸
    V2最大只支持32BIT的文件大小(4G),而NFS V3新增加了支持64BIT文件大小的技术。
    2、文件传输尺寸
    V3没有限定传输尺寸,V2最多只能设定为8k,可以使用-rsize and -wsize 来进行设定。
    3、完整的信息返回
    V3增加和完善了许多错误和成功信息的返回,对于服务器的设置和管理能带来很大好处。
    4、增加了对TCP传输协议的支持
    V2只提供了对UDP协议的支持,在一些高要求的网络环境中有很大限制,V3增加了对TCP协议的支持
    *5、异步写入特性
    6、改进了SERVER的mount性能
    7、有更好的I/O WRITES 性能。
    9、更强网络运行效能,使得网络运作更为有效。
    10、更强的灾难恢复功能。

    异步写入特性(v3新增加)介绍:
    NFS V3 能否使用异步写入,这是可选择的一种特性。NFS V3客户端发发送一个异步写入请求到服务器,在给客户端答复之前服务器并不是必须要将数据写入到存储器中(稳定的)。服务器能确定何时去写入数据或者将多个写入请求聚合到一起并加以处理,然后写入。客户端能保持一个数据的copy以防万一服务器不能完整的将数据写入。当客户端希望释放这个copy的时候,它会向服务器通过这个操作过程,以确保每个操作步骤的完整。异步写入能够使服务器去确定最好的同步数据的策略。使数据能尽可能的同步的提交何到达。与V2比较来看,这样的机制能更好的实现数据缓冲和更多的平行(平衡)。而NFS V2的SERVER在将数据写入存储器之前不能再相应任何的写入请求。

    V4相对V3的改进:
    1:改进了INTERNET上的存取和执行效能
    2:在协议中增强了安全方面的特性
    3:增强的跨平台特性
    三、CLIENT和SERVER的具体操作和设置
    在讲NFS SERVER的运作之前先来看一些与NFS SERVER有关的东西:
    RPC(Remote Procedure Call)
    NFS 本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议勇士用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER.所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

    NFS需要启动的DAEMONS
    pc.nfsd:主要复杂登陆权限检测等。
    rpc.mountd:负责NFS的档案系统,当CLIENT端通过rpc.nfsd登陆SERVER后,对clinet存取server的文件进行一系列的管理
    NFS SERVER在REDHAT LINUX平台下一共需要两个套件:nfs-utils和PORTMAP
    nfs-utils:提供rpc.nfsd 及 rpc.mountd这两个NFS DAEMONS的套件
    portmap: NFS其实可以被看作是一个RPC SERVER PROGRAM,而要启动一个RPC SERVER PROGRAM,都要做好PORT的对应工作,而且这样的任务就是由PORTMAP来完成的。通俗的说PortMap就是用来做PORT的mapping的。

    一:服务器端的设定(以LINUX为例)
    服务器端的设定都是在/etc/exports这个文件中进行设定的,设定格式如下:
    欲分享出去的目录 主机名称1或者IP1(参数1,参数2) 主机名称2或者IP2(参数3,参数4)
    上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。
    可以设定的参数主要有以下这些:
    rw:可读写的权限;
    ro:只读的权限;
    no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。
    root_squash:在登入 NFS 主?C使用分享之目?的使用者如果是 root ?r,那????使用者的?嘞?⒈?嚎s成?槟涿褂谜撸ǔK?UID ? GID 都??成 nobody 那??身份;
    all_squash:不管登陆NFS主机的用户是什么都会被重新设定为nobody。
    anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。
    anongid:同 anonuid ,但是?成 group ID 就是了!
    sync:资料同步写入存储器中。
    async:资料会先暂时存放在内存中,不会直接写入硬盘。
    insecure 允许从这台机器过来的非授权访问。

    例如可以编辑/etc/exports为:
    /tmp     *(rw,no_root_squash)
    /home/public 192.168.0.*(rw)   *(ro)
    /home/test  192.168.0.100(rw)
    /home/linux  *.the9.com(rw,all_squash,anonuid=40,anongid=40)
    设定好后可以使用以下命令启动NFS:
    /etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)
    /etc/rc.d/init.d/nfs start

    exportfs命令:
    如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
    exportfs [-aruv]
    -a :全部mount或者unmount /etc/exports中的内容
    -r :重新mount /etc/exports中分享出来的目录
    -u :umount 目录
    -v :在 export 的?r候,将详细的信息输出到屏幕上。
    具体例子:
    [root @test root]# exportfs -rv <==全部重新 export 一次!
    exporting 192.168.0.100:/home/test
    exporting 192.168.0.*:/home/public
    exporting *.the9.com:/home/linux
    exporting *:/home/public
    exporting *:/tmp
    reexporting 192.168.0.100:/home/test to kernel

    exportfs -au <==全部都卸载了。



    客户段的操作:
    1、showmout命令对于NFS的操作和查错有很大的帮助,所以我们先来看一下showmount的用法
    showmout
    -a :这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机nfs目录的cline机器。
    -e :显示指定的NFS SERVER上export出来的目录。
    例如:
    showmount -e 192.168.0.30
    Export list for localhost:
    /tmp *
    /home/linux *.linux.org
    /home/public (everyone)
    /home/test 192.168.0.100
    2、mount nfs目录的方法:
    mount -t nfs hostname(orIP):/directory /mount/point
    具体例子:
    Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
    Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs
    BSD: mount 192.168.0.1:/tmp /mnt/nfs

    3、mount nfs的其它可选参数:
    HARD mount和SOFT MOUNT:
    HARD: NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。
    SOFT:会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
    例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
    对于到底是使用hard还是soft的问题,这主要取决于你访问什么信息有关。例如你是想通过NFS来运行X PROGRAM的话,你绝对不会希望由于一些意外的情况(如网络速度一下子变的很慢,插拔了一下网卡插头等)而使系统输出大量的错误信息,如果此时你用的是HARD方式的话,系统就会等待,直到能够重新与NFS SERVER建立连接传输信息。另外如果是非关键数据的话也可以使用SOFT方式,如FTP数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。

    rsize和wsize:
    文件传输尺寸设定:V3没有限定传输尺寸,V2最多只能设定为8k,可以使用-rsize and -wsize 来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响
    bg:在执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止。(通常在设定/etc/fstab文件时都应该使用bg,以避免可能的mount不上而影响启动速度)
    fg:和bg正好相反,是默认的参数
    nfsvers=n:设定要使用的NFS版本,默认是使用2,这个选项的设定还要取决于server端是否支持NFS VER 3
    mountport:设定mount的端口
    port:根据server端export出的端口设定,例如如果server使用5555端口输出NFS,那客户端就需要使用这个参数进行同样的设定
    timeo =n:设置超时时间,当数据传输遇到问题时,会根据这个参数尝试进行重新传输。默认值是7/10妙(0.7秒)。如果网络连接不是很稳定的话就要加大这个数值,并且推荐使用HARD MOUNT方式,同时最好也加上INTR参数,这样你就可以终止任何挂起的文件访问。
    intr 允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。
    udp:使用udp作为nfs的传输协议(NFS V2只支持UDP)
    tcp:使用tcp作为nfs的传输协议
    namlen=n:设定远程服务器所允许的最长文件名。这个值的默认是255
    acregmin=n:设定最小的在文件更新之前cache时间,默认是3
    acregmax=n:设定最大的在文件更新之前cache时间,默认是60
    acdirmin=n:设定最小的在目录更新之前cache时间,默认是30
    acdirmax=n:设定最大的在目录更新之前cache时间,默认是60
    actimeo=n:将acregmin、acregmax、acdirmin、acdirmax设定为同一个数值,默认是没有启用。
    retry=n:设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是10000 minutes
    noac:关闭cache机制。
    同时使用多个参数的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
    请注意,NFS客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。比如说服务器以只读的方式导出,客户端却以可写的方式mount,虽然可以成功mount上,但尝试写入的时候就会发生错误。一般服务器和客户端配置冲突的时候,会以服务器的配置为准。


    4、/etc/fstab的设定方法
    /etc/fstab的格式如下:
    fs_spec   fs_file  fs_type   fs_options  fs_dump fs_pass 
    fs_spec:该字段定义希望加载的文件系统所在的设备或远程文件系统,对于nfs这个参数一般设置为这样:192.168.0.1:/NFS
    fs_file:本地的挂载点
    fs_type:对于NFS来说这个字段只要设置成nfs就可以了
    fs_options:挂载的参数,可以使用的参数可以参考上面的mount参数。
    fs_dump - 该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0
    fs_pass - 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0 。

    5、与NFS有关的一些命令介绍
    nfsstat:
    查看NFS的运行状态,对于调整NFS的运行有很大帮助
    rpcinfo:
    查看rpc执行信息,可以用于检测rpc运行情况的工具。



    四、NFS调优
    调优的步骤:
    1、测量当前网络、服务器和每个客户端的执行效率。
    2、分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和CPU占用、已经高的磁盘使用时间
    3、调整服务器
    4、重复第一到第三步直到达到你渴望的性能


    与NFS性能有关的问题有很多,通常可以要考虑的有以下这些选择:

    WSIZE,RSIZE参数来优化NFS的执行效能
    WSIZE、RSIZE对于NFS的效能有很大的影响。
    wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参数的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如LINUX KERNEL、网卡,交换机等等)。
    下面这个命令可以测试NFS的执行效能,读和写的效能可以分别测试,分别找到合适的参数。对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试。在每次测试的时候最好能重复的执行一次MOUNT和unmount。
    time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
    用于测试的WSIZE,RSIZE最好是1024的倍数,对于NFS V2来说8192是RSIZE和WSIZE的最大数值,如果使用的是NFS V3则可以尝试的最大数值是32768。
    如果设置的值比较大的时候,应该最好在CLIENT上进入mount上的目录中,进行一些常规操作(LS,VI等等),看看有没有错误信息出现。有可能出现的典型问题有LS的时候文件不能完整的列出或者是出现错误信息,不同的操作系统有不同的最佳数值,所以对于不同的操作系统都要进行测试。

    设定最佳的NFSD的COPY数目。
    linux中的NFSD的COPY数目是在/etc/rc.d/init.d/nfs这个启动文件中设置的,默认是8个NFSD,对于这个参数的设置一般是要根据可能的CLIENT数目来进行设定的,和WSIZE、RSIZE一样也是要通过测试来找到最近的数值。

    UDP and TCP
    可以手动进行设置,也可以自动进行选择。
    mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
    UDP 有着传输速度快,非连接传输的便捷特性,但是UDP在传输上没有TCP来的稳定,当网络不稳定或者黑客入侵的时候很容易使NFS的 Performance 大幅降低甚至使网络瘫痪。所以对于不同情况的网络要有针对的选择传输协议。nfs over tcp比较稳定, nfs over udp速度较快。在机器较少网络状况较好的情况下使用UDP协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用TCP协议(V2只支持UDP协议)。在局域网中使用UDP协议较好,因为局域网有比较稳定的网络保证,使用UDP可以带来更好的性能,在广域网中推荐使用TCP协议,TCP协议能让NFS在复杂的网络环境中保持最好的传输稳定性。可以参考这篇文章:http: //www.hp.com.tw/ssn/unix/0212/unix021204.asp

    版本的选择
    V3作为默认的选择(RED HAT 8默认使用V2,SOLARIS 8以上默认使用V3),可以通过vers= mount option来进行选择。
    LINUX通过mount option的nfsvers=n进行选择。

    五、NFS故障解决
    1、NFSD没有启动起来
    首先要确认 NFS 输出列表存在,否则 nfsd 不会启动。可用 exportfs 命令来检查,如果 exportfs 命令没有结果返回或返回不正确,则需要检查 /etc/exports 文件。
    2、mountd 进程没有启动
    mountd 进程是一个远程过程调用 (RPC) ,其作用是对客户端要求安装(mount)文件系统的申请作出响应。mountd进程通过查找 /etc/xtab 文件来获知哪些文件系统可以被远程客户端使用。另外,通过mountd进程,用户可以知道目前有哪些文件系统已被远程文件系统装配,并得知远程客户端的列表。查看mountd是否正常启动起来可以使用命令rpcinfo进行查看,在正常情况下在输出的列表中应该象这样的行:
    100005 1 udp 1039 mountd
    100005 1 tcp 1113 mountd
    100005 2 udp 1039 mountd
    100005 2 tcp 1113 mountd
    100005 3 udp 1039 mountd
    100005 3 tcp 1113 mountd
    如果没有起来的话可以检查是否安装了PORTMAP组件。
    rpm -qa|grep portmap
    3、fs type nfs no supported by kernel
    kernel不支持nfs文件系统,重新编译一下KERNEL就可以解决。
    4、can't contact portmapper: RPC: Remote system error - Connection refused
    出现这个错误信息是由于SEVER端的PORTMAP没有启动。
    5、mount clntudp_create: RPC: Program not registered
    NFS没有启动起来,可以用showmout -e host命令来检查NFS SERVER是否正常启动起来。
    6、mount: localhost:/home/test failed, reason given by server: Permission denied
    这个提示是当client要mount nfs server时可能出现的提示,意思是说本机没有权限去mount nfs server上的目录。解决方法当然是去修改NFS SERVER咯。
    7、被防火墙阻挡
    这个原因很多人都忽视了,在有严格要求的网络环境中,我们一般会关闭linux上的所有端口,当需要使用哪个端口的时候才会去打开。而NFS默认是使用111端口,所以我们先要检测是否打开了这个端口,另外也要检查TCP_Wrappers的设定。


    六、NFS安全
    NFS的不安全性主要体现于以下4个方面:

    1、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现
    2、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制
    3、较早的NFS可以使未授权用户获得有效的文件句柄
    4、在RPC远程调用中,一个SUID的程序就具有超级用户权限.

    加强NFS安全的方法:
    1、合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash。
    2、使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围
    iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
    3、为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目。
    4、修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的
    /etc/hosts.allow
    portmap: 192.168.0.0/255.255.255.0 : allow
    portmap: 140.11***4.125 : allow

    /etc/hosts.deny
    portmap: ALL : deny
    5、改变默认的NFS 端口
    NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性。
    6、使用Kerberos V5作为登陆验证系统

  • 1.什么是NFS(Network FileSystem)
     NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun 所发展出来的。他最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 ( share file ),所以,也可以简单的将他看做是一个 file server 呢!这个 NFS Server 可以让你的 PC 来将网络远程的 NFS 主机分享的目录,挂载到本地端的机器当中,所以,在本地端的机器看起来,那个远程主机的目录就好象是自己的 partition 一般!
     虽然 NFS 有属于自己的协议与使用的 port number ,但是在资料传送或者其它相关讯息传递的时候, NFS 使用的则是一个称为远程过程调用( Remote Procedure Call, RPC )的协议来协助 NFS 本身的运作!

    2.RPC
     当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的IP、服务的 port number、与对应到的服务之 PID 等等,都需要管理与对应!这些管理 port 的对应与服务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了
     NFS 本身的服务并没有提供资料传递的协议,但是 NFS 却能让我们进行档案的分享,这其中的原因,就是 NFS 使用到一些其它相关的传输协议!而这些传输的协议,就是使用到这个所谓的 RPC 的功能啰!这也就是说, NFS 本身就是使用 RPC 的一个 program 就是了!说的更白话一点, NFS 也可以视作是一个 RPC server 啦!同时要注意到的是,在某些状况中,不但跑 NFS 的 Server 需要激活 RPC 的服务,连带的,要挂载 NFS partition 的 Client 机器,也需要同步激活 RPC 才行!这样 Server 端与 Client 端才能藉由 RPC 的协议来进行 program port 的对应喔!NFS 主要在管理分享出来的目录,而至于资料的传递,就直接将他丢给 RPC 的协议来运作就是了!

    3.NFS 激活的 RPC daemons
     o rpc.nfsd:这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其中还包含这个登入者的 ID 的判别
     o rpc.mountd:这个 daemon 主要的功能,则是在管理 NFS 的档案系统!当 Client 端顺利的通过 rpc.nfsd 而登入主机之后,在他可以使用 NFS server 提供的档案之前,还会经过档案使用权限 ( 就是那个 -rwxrwxrwx 与 owner, group 那几个权限啦 ) 的认证程序!他会去读 NFS 的设定档 /etc/exports 来比对 Client 的权限,当通过这一关之后, Client 就可以取得使用 NFS 档案的权限啦!(注:这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方哩)

    4.NFS需要有两个套件才行,分别是:
     nfs-utils
     就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其它相关 documents 与说明文件、执行档等的套件!这个就是 NFS 的主要套件
     portmap
     就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC server program,而要激活任何一个 RPC server program 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才行,这个工作其实就是『 portmap 』这个服务所负责的!也就是说,在激活任何一个 RPC server 之前,我们都需要激活 portmap 才行呢!那么这个 portmap 到底在干嘛呢?就如同这个服务的名称,哈哈!就是作 port 的 mapping 啊!举个例子来说:当 Client 端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的 port 才能够使用 RPC server 所提供的服务,因此, Client 首先就会去跟 portmap 讲『喂!可不可以通知一下,给我个 port number ,好让我可以跟 RPC 联络吧!』这个时候 portmap 就自动的将自己管理的 port mapping 告知 Client ,好让他可以连接上来 server 呢!所以啰:『激活 NFS 之前,请先激活 portmap !』

    5.NFS server端的设定:
     a)./etc/exports
     分享的目录 主机名称1或IP1(参数1,参数2) 主机名称2或IP2(参数3,参数4)
     b).参数
     rw: 可擦写的权限
     ro: 只读的权限
     no_root_squash: 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
     root_squash: 在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个身份;
     all_squash: 不论登入 NFS 的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是 nobody 啦!
     anonuid: 前面关于 *_squash 提到的匿名使用者的 UID 设定值,通常为 nobody,但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中!
     anongid: 同 anonuid ,但是变成 group ID 就是了
     sync: 资料同步写入到内存与硬盘当中
     async: 资料会先暂存于内存当中,而非直接写入硬盘

    6.设置的实例:
     a). /tmp *(rw,no_root_squash)  //*号表示所有的IP都可以访问
     b). /tmp *(rw)
      /home/public 192.168.0.*(rw) *(ro)  //下面两行作用一样
      /home/public 192.168.0.0/24(rw) *(ro)
     c). /home/test 192.168.0.100(rw) //只对某部机器设置权限
     d). /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) //当*.linux.org登陆此NFS主机,并且在/home/linux下面写入档案时,该档案的所有人与所有组,就会变成/etc/passwd里面对应的UID为40的那个身份的使用者了.
     
    7.权限问题
    假设/etc/exports里面的内容为
     #vi /etc/exports
     /tmp *(rw,no_root_squash)
     /home/public 192.168.0.*(rw) *(ro)
     /home/test 192.168.0.100(rw)
     /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)
     假设我们在192.168.0.100这个client端登陆此NFS主机(192.168.0.2),那么
     情况一:在192.168.0.100的帐号为test这个身份,同时,NFS主机上也有test这个帐号
      a).由于NFS主机的/tmp权限为-rwxrwxrwt,所以我(test在192.168.0.100上)在/tmp下面具有存取的权限,并且写入档案的所有人为test.
      b).在/home/public中,由于我有读写的权限,如果NFS主机在/home/public这个目录的权限对于test开放写入的话,那么就可以读写,并且写入档案的所有人是test。如果NFS主机的/home/public对于test这个使用者并没有开放写入权限时,那就无法写入,虽然/etc/exports里面是rw,也不起作用.
      c).在/home/test中,权限与/home/public有相同的状态,需要NFS主机的/home/test对于test有开放的权限.
      d).在/home/linux当中,不论是何种的user,身份都会被变成UID=40的这个帐号
     情况二:如果我们在192.168.0.100的身份为test2,但是NFS主机却没有test2这个帐号时
      a).在/tmp下还是可以写入,但是写入的档案所有人变成nobody.
      b).在/home/public与/home/test里面是否可以写入,还需要看/home/public的权限而定,不过身份就被变成nobody了
      c)/home/linux下的身份还是变成UID=40的帐号.
     情况三:在192.168.0.100的身份为root
      a).在/tmp里面可以写入,但是由于no_root_squash的参数,改变了预设的root_squash的设定值,所以在/tmp写入档案的所有人为root了.
      b).在/home/public底下的身份被压缩成了nobody,因为预设的属性都具有root_squash,所以档案所有人就变成了nobody.
      c)./home/test情况与/home/public相同.
      d)./home/linux中,root的身份也被压缩成UID=40的那个使用者了.

    8.启动服务portmap,nfs
     #/etc/rc.d/init.d/portmap start  (or:#service portmap start)
     #/etc/rc.d/init.d/nfs start   (or:#service nfs start)
     可以到/var/log/messages里面查看是否正确激活
    9.exportfs的用法
     如果我们修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可
     语法: exportfs [-aruv]
     -a: 全部挂载(或卸载) /etc/exports档案内的设定
     -r: 重新挂载/etc/exports里面的设定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的内容
     -u:卸载某一目录
     -v:在export的时候,将分享的目录显示到荧屏上.
     例子
     #exportfs -rv //重新export一次
     #exportfs -au //全部卸载

    10./var/lib/nfs/xtab里面可以查看每个目录的分享权限(但是我怎么也没有找到,靠,找到了,原来要有人mount上nfs后才会出现内容),如:
    /tmp    node3(ro,sync,wdelay,hide,secure,root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
     为什么anonuid=-2呢?呵呵!其实它说的是将 65536 - 2 的值,也就是 65534 的那个 UID 啦!对照一下 /etc/passwd ,你就会发现,哇!原来那就是 nobody 的啦

    11.showmount命令
     语法: showmount [-ae] hostname
     -a: 显示目前主机与client所连上来的使用目录的状态
     -e: 显示hostname的/etc/exports里面共享的目录

    12.查看激活的portnumber
     #netstat -utln
     nfs 自己所开启的 port ,就是那个 2049 的 port 啦!就是 NFS 主要产生的 port NFS server 在前面我们就提过了,他是 RPC server 的一种,而 NFS 由于提供了多个 program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... ) ,因此就需要激活多个 port 了!而且这些 port 是『随机产生的』,也就是那个 port number 不会是固定的啦!每次 restart nfs 都会得到不一样的 port number 呢!那么 Client 端怎么知道要连接上那个 port 来呼叫需要的 program 呢?呵呵!那就是 sunrpc ( port 111 ) 那个 portmap 服务所产生的 port number 的功用啦!Client 会先连接到 sunrpc 那个 port 去知道应该到那个 port 去呼叫所需要的程序!所以啰, rpc.xxxx 等之类的 daemon 自然就不需要有固定的 port number 啰!

    ***********************************************
    NFS客户端的设定
     #mount -t nfs hostname(orIP):/directory /mountpoint   搞定,就这么简单
     为了担心会不小心将 NFS 端挂进来的具有 SUID 权限档案的程序执行,root可以将NFS 所分享的目录以较为安全的情况挂载进来,可以
     #mount -t nfs -o nosuid,ro hostname:/directory /mountponit

    可能出问题的地方:
    1.权限的设定不符合
    2.忘记了激活portmap,此时会报错:
     mount: RPC: Port mapper failure - RPC: Unable to receive 或者
     mount: RPC: Program not registered
     那么,启动portmap,并且重新启动nfs
     #service portmap start
     #service nfs restart
    3.被防火墙搞掉
     重新设置防火墙,包括iptables与TCP_Wrappers,因为激活了portmap,所以port 111必须提供出去.因此在iptables rules中,要增加:
     iptables -A INPUT -p TCP --dport 111 -j ACCEPT
     iptables -A INPUT -p UDP --dport 111 -j ACCEPT
     如果还不行,那就是TCP_Wrappers的问题,检查/etc/hosts.deny,如果有一行是:
      ALL: ALL: deny
     那就必须在/etc/hosts.allow中增加:
      portmap: ALL: allow
     如果我们的NFS针对内部网络开发,对于外部网络只对学术网络开发(140.0.0.0/8),可以:
      iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
      iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
     还可以使用TCP_Wrappers,在/etc/hosts.allow里面规定连上 NFS 主机的主机 IP 与名称,例如
     #vi /.etc/hosts.allow
     portmap: 192.168.0.0/255.255.255.0 :allow
     portmap: 140.113.23.23    :allow
     portmap: .sdu.edu.cn    :allow
     
    RPC Server的相关命令
     rpcinfo
     #rpcinfo -p hostname(orIP)
     
    要注意的问题:
     需要注意的是,由于 NFS 使用的这个 RPC 在 client 端连上主机时,那么你的主机想要关机,那可就会成为『不可能的任务』!我还不知道正确的原因是什么,但是,如果你的 Server 上面还有 Client 在联机,那么你要关机,可能得要等到数个钟头才能够正常的关机成功!嗄!真的假的!不相信吗?不然您自个儿试试看! ^_^!所以啰,建议您的 NFS Server 想要关机之前,能更先『关掉 portmap 与 nfs 』这两个东西!如果无法正确的将这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!
     
     在TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS时候报错为:
      portmap: server localhost not responding, timed out
     解决办法:
      mount -t nfs -o nolock node1:/public /public
     即增加-o nolock参数,原因:
     Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started (which again requires the portmapper to be installed etc.)
     
     

  • 2007-01-22

    nfs优化

    1.设置块大小
    mount命令的risize和wsize指定了server端和client端的传输的块大小。如果没有指定,那么,系统根据nfs的版本来设置缺省的risize和wsize大小。大多数情况是4K(4096bytes),对于nfs v2,最大是8K,对于v3,在server端设置risize和wsize的限制,最大块大小在kernel的常量NFSSVC_MAXBLKSIZE,该常量在usr/src/linux2.4/include/linux/nfsd/const.h.所有的2.4的的client都支持最大32K的传输块。系统缺省的块可能会太大或者太小,这主要取决于你的kernel和你的网卡,太大或者太小都有可能导致nfs速度很慢。具体的可以使用Bonnie,Bonnie++,iozone等benchmark来测试不同risize和wsize下nfs的速度。当然,也可以使用dd来测试。
     #time dd if=/dev/zero of=/testfs/testfile bs=8k count=1024这是来测试nfs写
     #time dd if=/testfs/testfile of=/dev/null bs=8k 这是测试nfs读
    测试时文件的大小至少时系统RAM的两倍,每次测试都使用umount 和mount对/testfs进行挂载,通过比较不同的块大小,得到优化的块大小。
    2.网络传输包的大小
    网络在包传输过程,对包要进行分组,过大或者过小都不能很好的利用网络的带宽,所以对网络要进行测试和调优。可以使用ping -s 2048 -f hostname进行 ping,尝试不同的package size,这样可以看到包的丢失情况。同时,可以使用nfsstat -o net 测试nfs使用udp传输时丢包的多少。
    因为统计不能清零,所以要先运行此命令记住该值,然后可以再次运行统计。如果,经过上面的统计丢包很多。那么可以看看网络传输包的大小。使用下面的命令:
    #tracepath node1/端口号
    #ifconfig eth0
    比较网卡的mtu和刚刚的pmtu,使用#ifconfig eth0 mtu 16436设置网卡的mtu和测试的一致。

    当然如果risize和wsize比mtu的值大,那么的话,server端的包传到client端就要进行重组,这是要消耗client端的cpu资源。此外,包重组可能导致网络的不可信和丢包,任何的丢包都会是的rpc请求重新传输,rpc请求的重传有会导致超时,严重降低nfs的性能。可以通过查看/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4/ipfrag_low_thresh了解系统可以处理的包的数目,如果网络包到达了ipfrag_high_thresh,那么系统就会开始丢包,直到包的数目到达ipfrag_low_thresh。
    3.nfs挂载的优化
     
    timeo:如果超时,客户端等待的时间,以十分之一秒计算。
    retrans:超时尝试的次数。
    bg:后台挂载,很有用
    hard:如果server端没有响应,那么客户端一直尝试挂载。
    wsize:写块大小
    rsize:读块大小
    intr:可以中断不成功的挂载
    noatime:不更新文件的inode访问时间,可以提高速度。
    async:异步读写。
    4.nfsd的个数
    缺省的系统在启动时,有8个nfsd进程。
    #ps -efl|grep nfsd
    通过查看/proc/net/rpc/nfsd文件的th行,第一个是nfsd的个数,后十个是线程是用的时间数,第二个到第四个值如果很大,那么就需要增加nfsd的个数。
    具体如下:
    #vi /etc/init.d/nfs
    找到RPCNFSDCOUNT,修改该值,一般和client端数目一致。
    然后,重启服务。
    #service nfs restart
    #mount -a
    5.nfsd的队列长度
    对于8个nfsd进程,系统的nfsd队列长度是64k大小,如果是多于8个,就要相应的增加相应的队列大小,具体的在/proc/sys/net/core/【rw】mem_default和/proc/sys/net/core/【rw】mem_max。队列的长度最好是每一个nfsd有8k的大小。这样,server端就可以对client的请求作排队处理。如果要永久更改此值
    #vi /etc/sysctl.conf
    加入
    net.core.【rw】mem_max=数目
    net.core.【rw】mem_default=数目
    #service nfs restart

  • 1、让tail不停地读地最新的内容

    tail -n 10 -f /etc/httpd/logs/access.log

    2、查看文件中间的第五行(含)到第10行(含)的内容
    sed -n '5,10p' /etc/httpd/logs/access.log

    3、使系统对ping没反应
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

    4、使tcp syn cookie保护生效
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies

    5、find命令使用参数
    格式: find [path...] [expression]
    find / -name access_log 2>/dev/null 不显示错误信息
    find /-amin n ##查找系统中最后N分钟访问的文件
    find /-atime n ##查找系统中最后n*24小时访问的文件
    find /-cmin n ##查找系统中最后N分钟被改变状态的文件
    find /-ctime n ##查找系统中最后n*24小时被改变状态的文件
    find /-empty ##查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
    find /-false ##查找系统中总是错误的文件
    find /-fstype type ##查找系统中存在于指定文件系统的文件,例如:ext2 .
    find /-gid n ##查找系统中文件数字组 ID 为 n的文件
    find /-group gname ##查找系统中文件属于gnam文件组,并且指定组和ID的文件
    find / -mmin n # 查找在系统中最后n分钟里修改过的文件
    find / -mtime n #查找在系统中最后24*n小时里修改过的文件
    find / -nouser #查找在系统中属于作废用户的文件
    find / -size nc #查找在系统中长度为n字节的文件
    find / -size +nc #查找在系统中长度大于n字节的文件
    find / -daystart ##测试系统从今天开始24小时以内的文件,用法类似-amin
    find / -depth ##使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
    find / -follow ##遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
    find / -help ##显示命令摘要
    find / -maxdepth levels ##在某个层次的目录中按照递减方法查找
    find / -mount ##不在文件系统目录中查找, 用法类似 -xdev.
    find / -noleaf ##禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
    find / -version ##打印版本数字
    -exec command; ##查找并执行命令
    -fprint file ##打印文件完整文件名
    -fprint0 file ##打印文件完整文件名包括空的文件
    -fprintf file format ##打印文件格式
    -ok command; ##给用户命令执行操作,根据用户的Y 确认输入执行
    -printf format ##打印文件格式
    -ls ##打印同种文件格式的文件.
    几个参数之间可以用-and,-or连接,某个参数取反可用!.
  • eAccelerator和memcached,是目前较为主流的两个可使用在PHP之中的缓存加速工具.

        eAccelerator专门为PHP开发,而memcached不仅仅用在PHP之中,其他所有的语言都可以使用.

     eAccelerator的主要功能:
        1. 缓存PHP文件的执行代码:在被缓存的代码再次被调用时,将直接从内存读取,从而在很大程度了PHP运行的速度.
        2. 提供了共享内存操作函数:用户可以将自己的常见非资源对像,保存到内存之中,并可以随时读取出来.

     memcached的主要功能:
     提供共享内存操作函数,可以保存和读取数据

     两者的共同点:
     共同点:都提供了共享内存操作函数,可以用来保存和读取自己的数据

     两者的区别:
     eAccelerator作为PHP的扩展库存在,那么仅在PHP运行时,可以操作和读写共享内存,一般情况,只能由操作共享内存的程序自己调用.
        同时,eAccelerator可以缓存PHP程序的执行代码,提升程序的调入和执行速度.
     memcached主要作为一个共享内存服务器,其PHP扩展库仅仅作为PHP到memcached的连接库存在,类似MySQL扩展库.因而,memcached可以完全脱离PHP,其共享的数据,可以被不同的程序调用.

     根据两者的不同,我们将他们使用在真真需要的地方:
     eAccelerator主要用于单机PHP提速,缓存中间数据.对于实时性高,但数据操作量小的情况下,非常实用.
     memcached用于分布式或者集群系统,多台服务器可以共享数据.对于实时性高,同时数据操作量大的情况下,非常实用.
  • 了解如何将用户抱怨与系统活动报告程序 (SAR) 关联,并使用 SAR 日志针对趋势建立性能基准。SAR 是系统管理员的理想工具。它以周期性的间隔捕获系统性能度量。

    用户总是在出现性能问题之后才想到它们。“为什么有些问题以前并不重要,而现在却变得重要了呢?”,如果忽略这样的问题,那么问题就变成了“系统在出现所谓的问题时状态如何呢?”。通过周期性地获取性能快照和查看数据,您就离确定问题的原因并创建相应的解决方案更近了一步。

    收集数据

    您的系统捆绑了 SAR 实用程序套件(事实上,大多数版本的 UNIX® 都安装了 SAR),但可能还没有启用。要启用 SAR,必须通过 cron 工具以周期性的间隔运行某些实用程序。在以 root 用户身份运行时,使用 crontab -e 命令,然后提供如清单 1 所示的配置。



    清单 1. 以 root 用户运行 crontab 来启用 SAR 集合
    # Collect measurements at 10-minute intervals
    0,10,20,30,40,50   * * * *   /usr/lib/sa/sa1
    # Create daily reports and purge old files
    0                  0 * * *   /usr/lib/sa/sa2 -A
    

    第一个命令 sa1,是调用 sadc 以将性能数据收集到二进制日志文件中的一个 Shell 脚本。sa1 命令还确保了每天都使用不同的文件,我将在时间是最重要的部分中对这一点进行解释。每隔十分钟运行一次该命令,这是粒度和系统性能影响之间的折衷办法。

    第二个命令 sa2,是将当日二进制日志文件中所有的数据转储到文本文件的另一个 Shell 脚本,然后它将清除七天之前的所有日志文件。参数 -A 指定了从二进制文件中提取哪些数据转储到文本文件中。尽管可以阅读文本文件以查看系统该日的状态,但我将介绍如何更精确地查询二进制日志文件。





    回页首


    提取有用的信息

    已经收集到了相应的数据,但是必须通过查询才能使其更有价值。不带选项运行 sar 命令,这将生成关于当日 CPU 使用情况的基本统计信息。清单 2 显示了不带任何选项的 sar 命令的输出结果。(在不同的平台中,可能会看到不同的列名。在一些 UNIX 版本中,sadc 命令将根据可用的信息来收集不同的数据。)这里的示例来自于 Sun Solaris 10,无论使用什么平台都是类似的,但列名可能会稍有不同。



    清单 2. sar 的缺省输出(显示了 CPU 使用情况)
    -bash-3.00$ sar
    
    SunOS unknown 5.10 Generic_118822-23 sun4u    01/20/2006
    
    00:00:01    %usr    %sys    %wio   %idle
    00:10:00       0       0       0     100
    . cut ...
    09:30:00       4      47       0      49
    
    Average        0       1       0      98
    

    sar 命令输出中的每一行都是一项单独的度量,并且在最左边的列中显示了时间戳。其他列中则存放了相应的数据。(根据命令行所使用参数的不同,这些列也会有所不同。)在清单 2 中,CPU 使用情况被分解为四种类别:

    • %usr: CPU 花费在用户进程(如应用程序、Shell 脚本或与该用户进行的交互)上的时间的百分比。
    • %sys: CPU 用来执行核心任务的时间的百分比。在本示例中该数字比较大,这是因为我正从核心随机数生成器获取数据。
    • %wio: CPU 等待块设备(如磁盘)输入或输出的时间的百分比。
    • %idle: CPU 未进行任何有用操作的时间的百分比。

    最后一行是所有数据点的平均值。然而,因为大多数系统都会在忙时间段后经历空闲时间段,所以平均值并不能反映完整的情况。

    监视磁盘活动

    同时,对磁盘活动也进行了监视。高磁盘使用率意味着,从磁盘请求数据的应用程序更有可能会被阻塞(暂停),直到磁盘为该进程做好准备。通常,解决方案涉及到将文件系统拆分到不同的磁盘或阵列。然而,第一步是要知道出现了问题。

    sar -d 的输出显示了一个度量时间段内各种与磁盘相关的统计数据。为了更加简洁,清单 3 仅显示了硬盘驱动器的活动。



    清单 3. sar -d 的输出(显示了磁盘活动)
    $ sar -d
    
    SunOS unknown 5.10 Generic_118822-23 sun4u    01/22/2006
    
    00:00:01   device       %busy   avque   r+w/s  blks/s  avwait  avserv
    . cut ...
    14:00:02   dad0             31     0.6      78   16102     1.9     5.3
               dad0,c            0     0.0       0       0     0.0     0.0
               dad0,h           31     0.6      78   16102     1.9     5.3
               dad1              0     0.0       0       1     1.6     1.3
               dad1,a            0     0.0       0       1     1.6     1.3
               dad1,b            0     0.0       0       0     0.0     0.0
               dad1,c            0     0.0       0       0     0.0     0.0
    

    和前面的示例一样,最左边的是时间。其他列如下:

    • device: 这是指正在进行测量的磁盘或磁盘分区。在 Sun Solaris 中,必须通过查找 /etc/path_to_inst 中所报告的名称将该磁盘转换为物理磁盘,然后将该信息交叉引用到 /dev/dsk 中的项目。在 Linux® 中,使用了磁盘设备的主从设备号。
    • %busy: 这是读取或写入设备的时间的百分比。
    • avque: 这是用来串行化磁盘活动的队列的平均深度。avque 的值越大,发生的阻塞就越多。
    • r+w/s、blks/s:这分别是用每秒的读或写操作和磁盘盘块来表示的磁盘活动。
    • avwait:这是磁盘读或写操作等待执行的平均时间(单位为毫秒)。
    • avserv:这是磁盘读或写操作所执行的平均时间(单位为毫秒)。

    其中的一些数值,如 avwaitavserv 值,直接关系到用户体验。磁盘的高等待时间可能表示多个人正在竞争使用该磁盘,这一点可以通过高 avque 数值来证实。高 avserv 值表示磁盘的速度较慢。

    其他度量

    同时还收集了许多其他的项目,可使用相应的参数来查看它们:

    • -b 参数显示了缓冲区信息和使用缓冲区与必须写磁盘的比率。
    • -c 参数显示了系统调用分解为一些常用的调用,如 fork()exec()read()write()。高进程创建会导致较差的性能,并且这是可能需要将一些应用程序转移到其他计算机的信号。
    • -g-p-w 参数显示了分页(交换)活动。高分页操作是内存缺乏的信号。特别地,-w 选项显示了进程切换的次数:高的数值表示计算机上运行的内容过多,该计算机在切换任务上花费了比实际工作更多的时间。
    • -q 参数显示了运行队列的大小,它与当时的平均负载相同。
    • -r 参数显示了一段时间的可用内存和交换空间。

    每种 UNIX 版本都对 sar 实现了自己的度量集合和命令行参数。我介绍的这些都是比较常见的,并且代表了更加有用的元素。





    回页首


    时间是最重要的

    到此为止,示例显示了当日的数据,它虽然具有相应的作用,但也存在着两个问题:

    • 感兴趣的是一个小时内的数据,但获得的是一整天的。
    • 需要返回到不同的日期。

    正如前面看到的,sa1 将每天的数据保存到不同的文件中。查看 sa1 脚本,会发现所使用的目录,如果是 Sun Solaris 10,该目录为 /var/adm/sa。该目录中有一些文件,它们以“sa”或“sar”开头,后跟一个数字。这个数字表示一个月中的第几天,以“sar”开头的文件是该日数据的文本转储(由夜间运行的 sa2 所创建),而以“sa”开头的文件保存着数据的二进制版本。实际上,包含当前日期的文件是启动 sar 时所读取的文件。

    sar 命令指定 -f 以选择要读取的文件。如果今天是一个月中的第 23 日,可以使用命令 sar -f /var/adm/sa/sa22 来读取 sa22 以查看昨天的数据。还可以传递介绍过的其他参数以访问不同类型的数据。

    可以做的第二件事情是,通过使用 -s-e 参数(即开始结束)来指定具体时间以缩小查询的范围。请注意,-s 并不是包含性的,所以必须从所选择的开始时间中多减去十分钟。继续前面的示例,清单 4 显示了交换文件的使用情况和从第 22 天的 2:30 p.m. 到 3:00 p.m 的运行队列。



    清单 4. 指定了日期、时间和多数据集的复杂 sar 查询
    # sar -f /var/adm/sa/sa22 -s 14:20 -e 15:00 -w -q -i 4
    
    SunOS unknown 5.10 Generic_118822-23 sun4u    01/22/2006
    
    14:20:00 swpin/s bswin/s swpot/s bswot/s pswch/s
    14:30:00    0.00     0.0    0.00     0.0     140
    14:40:01    0.00     0.0    0.00     0.0     144
    14:50:01    0.00     0.0    0.00     0.0     140
    15:00:00    0.00     0.0    0.00     0.0     139
    
    Average     0.00     0.0    0.00     0.0     140
    
    14:20:00 runq-sz %runocc swpq-sz %swpocc
    14:30:00    10.5     100     0.0       0
    14:40:01    10.5     100     0.0       0
    14:50:01    10.4     100     0.0       0
    15:00:00    10.5     100     0.0       0
    
    Average     10.5     100     0.0       0
    





    回页首


    了解它的所有含义

    简单查看一下清单 4,它显示出交换活动为零,每秒大约发生 140 次进程切换,并且平均负载略高于 10。假设您当时正在调查较差性能的要求,那么从这些数据中可以得到什么结论呢?

    • 因为没有发现交换过程,无论在运行什么进程,它们并没有消耗大量的内存。
    • 该问题可能是由一组长时间运行的进程所导致,因为运行队列和进程切换相对稳定。如果以前并不是这样,那么可以怀疑是应用程序级的问题,如繁忙的 Web 服务器。
    • 由于了解到清单 3 的输出显示了同一时间段的其他数据,您可以查看某块使用频繁的磁盘(根据 sar -b 为百分之 31,同时每秒 16,000 个盘块)。该磁盘是 home 目录分区,根据用户想要完成的任务不同,他/她可能会遇到较慢的响应。

    快速查看该时间段内的 CPU 使用情况,显示出系统大约占用了百分之 80 的 CPU,剩下的用于用户任务。作为系统管理员,可以通过下面三种方式使用这一信息:

    • 回到前几天的日志中。在本例中,我发现问题开始于 1:00 p.m.,并于第二天早上结束。
    • 尝试将该活动与任何可能在该日开始的 cron 工作关联。
    • 尝试找到其趋势。查看另外几天的数据,我发现性能是正常的,这并不表示系统已经达到其上限。

    在本例中,看来已经将问题隔离出来了,出于该原因,我有意地使用 Shell 脚本来运转磁盘以创建一些有趣的 sar 报告!然而发现了一个趋势,如在工作时间内 home 驱动器比较繁忙,关于该问题可能存在完成某项任务的调用。可能的解决方案包括,将 home 目录拆分到其他磁盘、安装高速磁盘或将其转移到其他地方,如 Network Attached Storage (NAS)。





    回页首


    结束语

    以周期性的间隔获取关于系统的定性数据,这是查找性能瓶颈并确定是否需要进一步操作的有效方法。可以使用 SAR 及其相关实用程序来完成这项任务,每隔十分钟获取一次快照并使用前端工具来访问这些数据。尽管实际上需要一定的策略,但系统管理员可以使用所提供的大量信息来发现系统中出现的问题,以及确定是否需要进行进一步的调查工作。

  • 一、几个问题

    开始正题之前,我们先看几个问题:什么是稳定性和可靠性?什么是压力测试?为什么要进行压力测试?

    什么是稳定性和可靠性?
    稳定性反映的是系统不会出现异常情况;可靠性反映的是系统能够保持正常运行而不受外界影响的能力。
    系统的稳定性和可靠性通常以连续运转时间和系统的可靠运行时间来度量。

    什么是压力测试?
    压力测试是一种破坏性的测试,即系统在非正常的、超负荷的条件下的运行情况 。用来评估在超越最大负载的情况下系统将如何运行,是系统在正常的情况下对某种负载强度的承受能力的考验 。

    为什么要进行压力测试?
    通常我们用压力测试来判断系统的稳定性和可靠性。


    了解了上面的问题之后,我们来看看该如何进行压力测试的设计。

    二、压力测试的设计

    在对Linux内核版本稳定性的测试中,需要明确地声明并证明为什么该版本是稳定的或者是不稳定的。不同的 Linux 开发者、 用户和发行商会使用他们自己的方法来测试内核的稳定性,但是,如果他们对运行了哪些测试、覆盖的代码、达到的压力级别等的基础信息都没有发布,那么这就会大大降低了结果的价值。

    为此要有一个合适的测试方法来规范Linux内核稳定性的测试,以系统资源的利用率统计为基准制定了一个组合的测试方法,这一组合测试方法的四个步骤是:测试选择、系统资源利用率评价、内核代码覆盖分析以及最终的压力测试评价。


    1 测试选择
      测试选择包括达成两方面目的的测试:
      - 测试应该可以得到 CPU(s)、内存、I/O 和网络等主要内核区域的高水平的资源利用率。
      - 测试应该充分地覆盖内核代码,以帮助支持自其结果中生成的稳定性声明。


    2 评价系统资源利用率
      所选择的测试的组合必须给系统的资源带来足够的压力。Linux 内核的四个主要方面可以影响系统的 响应和执行时间:
      - CPU:用于在机器的 CPU(s)上处理数据的时间。
      - Memory:用于自真实存储器中读写数据的时间。
      - I/O:用于自磁盘存储器读写数据的时间。
      - Networking:用于自网络读写数据的时间。

    系统资源利用率评价阶段通常需要多次尝试才能得到合适的测试组合,并得到期望水平的利用率。当确定测试组合时,过度利用总是一个至关重要的问题。例如,如果选择的组合过于受 I/O 所限,可能会 导致 CPU 的测试结果不好,反之亦然。方法的这一部分主要是大量的试验和出错,直到所有资源达到期望水平。
    当选定一个组合后,测试必须长时间运行以准确评价资源的利用率。测试运行的时间长短取决于每个测试的长度。假如多个测试同时运行,则时间必须足够长以使得这些测试中最长的那个可以完成。在这个评价过程中,sar 工具也应该在运行。在评价运行的结论中,您应该收集并评价所有四种资源的利用率水平。


    3 分析内核代码覆盖率
      获得足够的内核覆盖率是系统压力测试的另一个职责。尽管所选的测试组合充分地利用了四种主要资源,它也有可能只是执行了内核的一小部分。因而,应该对覆盖率进行分析以确保组合可以成为一个系统压力测试,而不是一个系统负载生成器。


    4 评价最终压力测试
      之所以要执行方法中的这最后一步,是为了对系统压力测试进行核实。在一个被认为是稳定的内核上执行压力测试; 通常,发行版本中的内核可以满足这一要求,但不总是如此。要长时间地执行压力测试,同时运行sar 工具,原因有以下两点:
      - 长时间运行有助于发现组合中的所有问题,否则,在短时间的“取样测试(sniff test)”中这些问题可能会被忽略。
      - sar 生成的数据构成以后测试运行中进行比较的基线。
      
      长时间运行结束后,现在可以基于收集的所有数据来决定这个测试组合是否是系统压力测试的合适候选者。

    三、LTP(Linux Test Project)

    LTP工作组在设计Linux 内核压力测试脚本 ltpstress.sh 时使用了这一设计方法,为给系统提供足够的压力,LTP工作组对这个组合测试进行了分析,以确定 Linux 内核的哪些部分在测试执行中得到了使用。然后,修改了组合测试,在保持期望的高强度系统压力的同时提高代码覆盖率的百分比。最终得到的压力测试涵盖了Linux 内核的足够多部分,有助于稳定性声明,并且有系统使用情况和内核代码覆盖情况的数据来支持它。

    有两个开放源代码工具可以帮助进行 Linux 内核的代码覆盖率分析:
      - gcov:一个由 LTP 维护的开放源代码工具。这个工具分析内核代码的覆盖率,并报告哪些行、函数和分支被覆盖以及它们被访问了多少次。
      - lcov:另一个由 IBM 开发,由 LTP 维护的开放源代码工具。 这个工具由一组构建于基于文本的 gcov 输出之上的 Perl 脚本构成,以实现基于 HTML 的输出。输出包括覆盖率百分比、图表以及概述页,可以快速浏览覆盖率数据。可以自LTP主页找到这两个工具。
    lcov 工具会生成一棵完整的 HTML 树,其中包含有内核中代码的每一行以及关于每一行执行了 多少次的数据(如果有的话)。这个工具会量化覆盖率数据并生成关于内核中每一部分和 文件覆盖率的百分比数字。
    内核的代码覆盖率分析只是在ltpstress.sh的设计和开发过程中用到,目的是保证lptsress.sh的可用性,我们在实际测试的时候就不需要再做内核的代码覆盖率分析了。

    1 LTP的ltpstress.sh目标
    ltpstress.sh的目标,是使用 LTP 测试套件对Linux 操作系统进行超长时间的测试,重点在于Linux 用户环境相关的工作负荷,而并不是致力于证明缺陷。这个应用程序组合了来自 LTP 的测试套件不同方面的多个测试以及内存和网络传输负载生成器。在执行之前,测试会根据系统中存在多少物理和虚拟内存来调整其总的内存使用情况。


    2 ltpstress.sh的测试方法
    测试方法有两个的阶段:一个是“初始测试”,一个是“压力测试”。通过初始测试是开始测试的必要条件。初始测试包括 LTP 测试套件在硬件和操作系统上成功运转,这些硬件和操作系统将用于可靠性运转。LTP 测试套件包附带的驱动程序脚本 runalltest.sh 用于验证内核。这个脚本串行地运行一组成包的测试,并报告全部结果。也可以选择同时并行地运行几个实例。默认地,这个脚本执行:

    - 文件系统压力测试。
    - 硬盘 I/O 测试。
    - 内存管理压力测试。
    - IPC 压力测试。
    - SCHED测试。
    - 命令功能的验证测试。
    - 系统调用功能的验证测试。

    压力测试可以验证产品在系统高使用率时的健壮性。作为 runalltest.sh 的补充,特别设计了一个名为 ltpstress.sh 的测试场景,在使用网络与内存管理的同时并行地运行大范围的内核组件,并在测试系统上生成高压力负荷。ltpstress.sh 也是 LTP 测试套件的一部分。这个脚本并行地运行相似的测试用例,串行地运行不同的测试用例,这样做是为了避免由于同时访问同一资源或者互相干扰而引起的间歇性故障。默认地,这个脚本执行:

    - NFS 压力测试。
    - 内存管理压力测试。
    - 文件系统压力测试。
    - 数学 (浮点) 测试。
    - 多线程压力测试。
    - 硬盘 I/O 测试。
    - IPC (pipeio, semaphore) 测试。
    - 系统调用功能的验证测试。
    - 网络压力测试。


    3 系统监控
    LTP 测试套件附带的 top 工具是经过修改的,用作系统监控工具。使用 top 可以实时地观察处理器的行为。改进的 top 工具具有附加的功能,可以将 top 结果的快照保存到文件中,并给出结果文件的平均总结,包括 CPU、内存和交换空间利用率等信息。

    在我们的测试中,sar工具每 10 秒钟截取一次系统利用率的快照,并保存到结果文件。

    测试之前所有选定的测试系统的硬件配置尽可能相同。去掉额外的硬件以减少潜在的硬件故障。在映像安装过程中选择最低的安全选项。预留至少 2 GB 的硬盘空间以保存 top 数据文件和 LTP 日志文件。

    在测试期间系统不要受到干扰。偶尔访问一下系统以确认测试仍在进行是可以接受的。确认的手段包括使用 ps 命令、检查 top 数据和检查 LTP 日志数据。


    4 LTP的结构
    LTP的目录结构基本上分为文档目录(doc)、测试驱动程序目录(pan)、测试脚本目录(testscripts)、测试用例库(testcase)、测试命令文件目录(runtest)、头文件目录(include)、库目录(lib)等。
    Doc:该目录是说明文件和帮助文档的所在地,这个目录中对LTP的内容和每个工具都有详细的说明。
    Pan:该目录存储的是LTP测试套件的测试驱动程序pan。
    Testscripts:该目录中存储的是可执行的测试脚本,不同方面的测试脚本的集合。
    Testcase:该目录存储了所有LTP测试套件中所使用的测试用例的源码。
    Runtest:该目录中的每个文件都是要执行的测试用例的命令集合,每个文件针对测试的不同方面。
    Include:LTP测试套件的头文件目录,定义了LTP自身的数据结构和函数结构。
    Lib:LTP测试套件运行时自身需要的库文件,定义了LTP自身的各种函数。


    5 LTP 的测试方法

    LTP测试套件有一个专门的测试驱动程序pan,具体的测试用例的执行都是由pan来调用执行,它可以跟踪孤儿进程和抓取测试的输出信息。它的工作方式是这样的:
    从一个测试命令文件中读取要测试的条目的要执行的命令行,然后等待该项测试的结束,并记录详细的测试输出。默认状态下pan会随机的选择一个命令行来运行,可以指定在同一时间要执行测试的次数。
    pan会记录测试产生的详细的格式复杂的输出,但它不进行数据的整理和统计,数据整理统计的工作由scanner来完成,scanner是一个测试结果分析工具,它会理解pan的输出格式,并输出成一个表格的
    形式来总结那些测试passed或failed。

    6 LTP的实际运行
    实际运行当中,您还需要配置一些必要的服务才可以正确的运行LTP的测试套件,以ltprunall.sh为例,它是不需要配置其他服务就可以运行的,但是对于ltpstress.sh,是需要配置一些相关服务之后才可以正确运行的,需要您配置的服务如下:

    配置rsh和rlogin服务,使用户能以root身份不需密码验证直接登录本机。
    开启xinetd服务。
    在用户主目录下建立一个名为.rhosts的文件,文件内容是允许对本机进行rsh和rlogin操作的主机名和IP地址。一个相应的例子如下:
    # vi .rhosts
    test.my.domain
    192.168.1.11
    localhost.localdomain
    127.0.0.1

    配置工作最后要做的就是重启xinetd服务,因为rsh和rlogin是受xinetd服务控制的:
    /etc/init.d/ xinetd restart
    或service xinetd restart

    然后您就可以运行ltpstress.sh的脚本了。通常用到的参数是 [-d outputfile] [-l logfile] [-t run-time] [-S],-S 选项用来在测试运行过程中使用sar工具来采样系统的性能输出。

    四、top和sar的一点使用说明

    最后,我们在讨论一下top工具和sar工具的一些用法。

    Top : 显示系统当前的进程和其他状况

    使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
    说明:即时显示 process 的动态

    -d 改变显示的更新速度,或是在交谈式指令列( interactive command)按d。
    -q 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行。
    -c 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称。
    -S 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来。
    -s 安全模式,将交谈式指令取消, 避免潜在的危机。
    -i 不显示任何闲置 (idle) 或无用 (zombie) 的行程。
    -n 更新的次数,完成后将会退出 top。
    -b 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内。

    范例:
    显示更新十次后退出 ;
    top -n 10

    将更新显示二次的结果输入到名称为 top.log 的档案里 :
    top -n 2 -b > top.log


    sar:收集、报告、保存系统的活动信息

      使用方式:sar [options] [-A] [-o file] t [n]
      说明:在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,sar命令的选项很多,下面只列出常用选项:

    -a 报告文件读写使用情况
      -b 报告缓存的使用情况
      -c 报告系统调用的使用情况
      -d 报告磁盘的使用情况
      -h 报告关于buffer使用的统计数据
      -m 报告IPC消息队列和信号量的使用情况
      -q 报告运行队列和交换队列的平均长度
      -R 报告进程的活动情况
      -r 报告没有使用的内存页面和硬盘块
      -u 报告CPU的利用率
      -v 报告进程、i节点、文件和锁表状态
      -w 报告系统交换活动状况

    范例:
    查看CPU的利用率,以2s为间隔,采样5次。
    Sar -u 2 5
  • 一、 PS
    我们可以用ps 的 – l 选项,得到更详细的进程信息.
    ; F(Flag):一系列数字的和,表示进程的当前状态。这些数字的含义为:
    00:若单独显示,表示此进程已被终止。
      01:进程是核心进程的一部分,常驻于系统主存。如:   
        sched、 vhand 、bdflush 等。
    02:Parent is tracing process.
      04 :Tracing parent's signal has stopped the process; the parent is waiting ( ptrace(S)).
      10:进程在优先级低于或等于25时,进入休眠状态,而且不能用信号唤醒,例如在等待一个inode被创建时   
       20:进程被装入主存(primary memory)
       40:进程被锁在主存,在事务完成前不能被置换   e
    ; S(state of the process )
    O:进程正在处理器运行 
      S:休眠状态(sleeping)
    R:等待运行(runable)   
    I:空闲状态(idle)
      Z:僵尸状态(zombie)   
      T:跟踪状态(Traced)
    B:进程正在等待更多的内存页
    ; C(cpu usage):cpu利用率的估算值 
    二、 Sar:统计单CPU系统的系统活动情况
    Cpusar:多处理器系统中单个处理器的活动情况
    Mpsar:多处理器系统中处理器的总体活动情况
    ; Sar -u:检查是否有逃逸进程大量占用CPU
    此命令的显示有四个字段,含义如下:
    %usr:执行用户进程的时间
    %sys:执行系统进程的时间
    %wio:等待完成I/O的时间
    %idle:空闲时间
    显示结果分析说明:
    1) 一般情况下,%usr与%sys的值基本相等
    2) 在一般的多用户系统中,%idle通常大于40%
    3) 若%wio经常>15%,意味着硬盘有可能会造成瓶颈
    4) 若%idle经常小于30%,意味着处理器能力较弱
    5) 若%idle经常小于10%,表明处理器负担过重,或者存在逃逸进程
    6) 若%idle接近于0,并且%sys又远远高于%usr,则可能是因为内存短缺引起了大量的swapping和paging
    ; Sar -p:检查系统中是否有过多的等待进程
    此命令有四个相关字段:
    runq-sz:内存(memory)中可以运行的进程数
    %runocc:进程进入内存等待的概率
    swpq-sz:对换区(swap)中等待运行的进程数
    %swpocc:进程进入swap等待的概率
    显示结果分析汇总如下:
    1) 若runq-sz经常大于2并且%runocc经常大于90%,意味着处理器负载过重
    2) 若%swpocc不为0,表示系统已经置换出了进程。可以采用增加内存或减少缓冲的方法来减少swap和paging。
    ; 自动统计程序:
    对系统运行状况的判断不能依赖于某个特定时期的数据,它需要一个长期的积累和收集的过程。Unix5提供了两个基于月的自动统计程序sa1(以二进制形式收集、存放于目录/usr/adm/sa中,以sadd为文件名,dd是一个数字,表示当月第几天)、sa2(以可读文本形式存放在目录/usr/adm/sa中,文件名为:sardd)。这两个命令可以通过crontab启动。相关文件位于/usr/spool/cron/crontabs下sys和 root。
    ; 激活自动记录:
    /usr/lib/sa/sar_enable -y
    ; 显示记录内容:
    sar –q -f /usr/adm/sa/sa10
  • 1、关于 Sysstat;

    Sysstat 是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如CPU使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手;


    Sysstat 软件包集成如下工具:

        * iostat 工具提供CPU使用率及硬盘吞吐效率的数据;
        * mpstat 工具提供单个处理器或多个处理器相关数据;
        * sar 工具负责收集、报告并存储系统活跃的信息;
        * sa1 工具负责收集并存储每天系统动态信息到一个二进制的文件中。它是通过计划任务工具cron来运行,
            是为sadc所设计的程序前端程序;
        * sa2 工具负责把每天的系统活跃性息写入总结性的报告中。它是为sar所设计的前端 ,要通过cron来调用
        * sadc 是系统动态数据收集工具,收集的数据被写一个二进制的文件中,它被用作sar工具的后端;
        * sadf 显示被sar通过多种格式收集的数据;


    2、安装 Sysstat和运行;

    对于大多数系统,都有这个软件包,软件名以sysstat开头。我们可以通过网络安装它;


    2.1 对于Debian或deb软件包为基础的系统;

    [root@localhost ~]# apt-get install sysstat


    2.2 Fedora 系统或以RPM包管理的系统;

    [root@localhost ~]# yum install sysstat

    如果是RPM包,请用下面的命令来安装;

    [root@localhost ~]#rpm -ivh sysstat*.rpm

    如果您想了解yum 和rpm 软件包管理工具,请参考:《Fedora / Redhat 软件包管理指南》


    2.3 Slackware 系统,对于Slackware系统;

    [root@localhost ~]# installpkg sysstat*.pkg


    2.4 通过源码包编译安装;

    如果您是通过源码包安装,请到官方下源源码包 http://perso.wanadoo.fr/sebastien.godard,目前最新版本是 sysstat-6.1.2;

    如果您想了想一下什么是源码包,请参考:《如何编译安装源码包软件》

    [root@localhost ~]# tar zxvf sysstat-6.1.2.tar.gz
    [beinan@localhost ~] $ cd sysstat-6.1.2
    [beinan@localhost sysstat-6.1.2]#
    [beinan@localhost sysstat-6.1.2]# make config
    [beinan@localhost sysstat-6.1.2]# make
    [beinan@localhost sysstat-6.1.2]# make install


    2.5 关于 Sysstat 计划任务;

    如果您想得到Sysstat工具集所收集的系统信息自动存为某个文件中,你必须通过cron 为 sa1 和sa2 做计划任务。我们可以通过修改用户的crontab。在默认的情况下,Sysstat历史信息将被存放在/var/log/sa文件中。如果想定义自己的计划任务,请参考:《计划任务工具 cron 的配置和说明》

    在root用户,通过 crontab -e 来添加下面的一段;

    # 8am-7pm activity reports every 10 minutes during weekdays
    0 8-18 * * 1-5 /usr/lib/sa/sa1 600 6 &
    # 7pm-8am activity reports every hour during weekdays
    0 19-7 * * 1-5 /usr/lib/sa/sa1 &
    # Activity reports every hour on Saturday and Sunday
    0 * * * 0,6 /usr/lib/sa/sa1 &
    # Daily summary prepared at 19:05 5 19 * * * /usr/lib/sa/sa2 -A &

    创建Sysstat的启动脚本;

    [root@localhost ~]# touch /etc/rc.d/init.d/sysstat
    [root@localhost ~]# vi /etc/rc.d/init.d/sysstat

    #!/bin/sh
    # Begin  $rc_base/init.d/sysstat
    # Based on sysklogd script from LFS-3.1 and earlier.
    # Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org
    . /etc/sysconfig/rc
    .  $rc_functions
    case " $1" in
            start)
                    echo "Calling the system activity data collector (sadc)..."
                    /usr/lib/sa/sadc -F -L -
                    evaluate_retval
                    ;;
            *)
                    echo "Usage:  $0 start"
                    exit 1
                    ;;
    esac
    # End  $rc_base/init.d/sysstat

    [root@localhost ~]# chmod 755 /etc/rc.d/init.d/sysstat
    [root@localhost ~]# ln -sf /etc/rc.d/init.d/sysstat /etc/init.d/sysstat

    有了Sysstat的守护进程,这样我们开机后,Sysstat的守护进程,就时时刻刻的为我们服务了。sa 、sa1或sa2自动把信息存在 /var/log/sa目录的二进制文件中,我们可以通过sar工具来提取这些系统信息的历史;

    当然我们也可以通过手动的方法来打开Sysstat的守护程序,也就是我们前面所制作的sysstat;

    [root@localhost ~]# /etc/rc.d/init.d/sysstat start
    下面的方法也行;
    [root@localhost ~]# /usr/lib/sa/sa1
    [root@localhost ~]# /usr/lib/sa/sa2


    3.Sysstat 工具集介绍;


    3.1 sadc 工具,

    sadc 位于 /usr/lib/sa目录中,如果你没有设置可执行路径,要用绝对路径来运行比较方便 ,/usr/lib/sa/sadc;sadc 是把数据写在一个二进制的文件中,如果想查看数据内容,需要用sadf工具来显示;


    sadc 的用法;

    /usr/lib/sa/sadc [ -d ] [ -F ] [ -I ] [ -L ] [ -V ] [ interval [ count ] ] [ outfile ]

    参数说明:

    -d 报告硬盘设置的相关统计;
    -F 强制把数据写入文件;
    -I 报告所有系统中断数据;
    interval 表示时间间隔,单位是秒,比如3 ;
    count 统计数据的次数,也是一个数字;
    outfile 输出统计到outfile文件;

    注意:此工具中的参数都是可选的,如果没有指定任何参数,比如 /usr/lib/sa/sadc - ,则会输出数据到 /var/log/sa/ 目录下的一个文件中。我们要通过sadf 或sar工具来查看;

    [root@localhost beinan]# /usr/lib/sa/sadc -
    [root@localhost beinan]# ls /var/log/sa 注:列出所有sa目录下的文件,根据文件的时间来判断哪个文件是最新的;
    [root@localhost beinan]# sar -f /var/log/sa/sa12

    [root@localhost beinan]# sadf /var/log/sa/sa12

    举例:我们想把sadc收集到的数据写到一个指定的文件中;

    [root@localhost ~]# /usr/lib/sa/sadc  1 10 sa000
    [root@localhost ~]# sar -f sa000

    Linux 2.6.15-1.2054_FC5 (localhost.localdomain)         2006年05月12日

    09时15分30秒       CPU     %user     %nice   %system   %iowait     %idle
    09时15分31秒       all      3.00      0.00      0.00      1.00     96.00
    09时15分32秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分33秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分34秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分35秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分36秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分37秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分38秒       all      0.00      0.00      0.00      0.00    100.00
    09时15分39秒       all      0.00      0.00      0.00      0.00    100.00
    Average:          all      0.33      0.00      0.00      0.11     99.56


    注解:我们用sadc 收集系统动态数据,让它收集1秒之内的10次动态信息; 然后通过sar 工具来查看系统的状态。也可以用 sadf 来查看所收集的数据,但不是太直观。您自己尝试一下看看。查看sa000文件,用 sadf sa000 ;


    3.2 sar 工具;

    sar 工具比较强大,既能收集系统CPU、硬盘、动态数据,也能显示动态显示,更能查看二进制数据文件;sar 的应用比较多,而且也比较复杂,数据更为精确。我们只了解一下常用的内容就行,大多数内容我们了解就行;

    用法:

    sar [参数选项]

    参数说明:

    -A 显示所有历史数据,通过读取/var/log/sar 目录下的所有文件,并把它们分门别类的显示出来;
    -b 通过设备的I/O中断读取设置的吞吐率;
    -B 报告内存或虚拟内存交换统计;
    -c 报告每秒创建的进程数;
    -d 报告物理块设备(存储设备)的写入、读取之类的信息,如果直观一点,可以和p参数共同使用,-dp
    -f 从一个二进制的数据文件中读取内容,比如 sar -f filename
    -i interval 指定数据收集的时间,时间单位是秒;
    -n 分析网络设备状态的统计,后面可以接的参数有 DEV、EDEV、NFS、NFSD、SOCK等。比如-n DEV
    -o 把统计信息写入一个文件,比如 -o filename ;
    -P 报告每个处理器应用统计,用于多处理器机器,并且启用SMP内核才有效;
    -p 显示友好设备名字,以方便查看,也可以和-d 和-n 参数结合使用,比如 -dp 或-np
    -r 内存和交换区占用统计;
    -R
    -t 这个选项对从文件读取数据有用,如果没有这个参数,会以本地时间为标准 读出;
    -u 报告CPU利用率的参数;
    -v 报告inode, 文件或其它内核表的资源占用信息;
    -w 报告系统交换活动的信息; 每少交换数据的个数;
    -W 报告系统交换活动吞吐信息;
    -x 用于监视进程的,在其后要指定进程的PID值;
    -X 用于监视进程的,但指定的应该是一个子进程ID;

    sar 应用举例;

    实例一: 如果只用sar 命令,sar就是读取 /var/log/sa目录下最近系统状态文件。

    [root@localhost ~]# sar
    [root@localhost ~]# sar -A 注:读取/var/log/sa目录下所有文件数据;

    如果我们想知道CPU的利用率;动态更新;下面的例子是每秒更新一次数据,总共更新五次;

    [root@localhost ~]# sar -u  1 5
    Linux 2.6.15-1.2054_FC5 (localhost.localdomain)         2006年05月12日

    时间              CPU    利用率    nice值    系统占用    IO占用  空闲
    11时19分34秒       CPU     %user     %nice   %system   %iowait     %idle
    11时19分35秒       all      2.97      0.00      0.00      0.00     97.03
    11时19分36秒       all     11.11      0.00      9.09      0.00     79.80
    11时19分37秒       all     21.78      0.00      6.93      0.00     71.29
    11时19分38秒       all     15.00      0.00      0.00      0.00     85.00
    11时19分39秒       all      8.00      0.00      0.00      0.00     92.00
    Average:          all     11.78      0.00      3.19      0.00     85.03

    注解:

    CPU:表示机器内所有的CPU;
    %user 表示CPU的利用率;
    %nice 表示CPU在用户层优先级的百分比,0表示正常;
    %system 表示当系统运行时,在用户应用层上所占用的CPU百分比;
    %iowait 表示请求硬盘I/0数据流出时,所占用CPU的百分比;
    %idle 表示空闲CPU百分比,值越大系统负载越低;

    您可以CPU利用率的动态信息输出到一个文本文件中,然后通过more 来查看。

    [root@localhost ~]# sar -u 1 5 > sar000.txt
    [root@localhost ~]# more sar000.txt

    也可以输出到一个二进制的文件中,然后通过sar来查看;

    [root@localhost ~]# sar -u 1 5 -o sar002
    [root@localhost ~]# sar -f sar002

    注:如果您把数据通过-o filename 输出到一个二进制的文件中,是不能用文件内容查看工具more 、less或cat来查看的,应该用sar工具来查看,要加-f参数;

    实例二:查看网络设备的吞吐情况;

    比如我们让数据每秒更新一次,总共更新十次;

    [root@localhost ~]# sar -n DEV 2 5
    时间 IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s

    第一字段:时间;
    IFACE:设备名;
    rxpck/s:每秒收到的包;
    rxbyt/s:每秒收到的所有包的体积;
    txbyt/s:每秒传输的所有包的体积;
    rxcmp/s:每秒收到数据切割压缩的包总数;
    txcmp/s :每秒传输的数据切割压缩的包的总数;
    rxmcst/s: 每秒收到的多点传送的包;

    如果我们从事提取eth0设备(也就是网卡eth0)的信息;我们应该用grep 来过滤。然后再显示出来;

    [root@localhost ~]# sar -n DEV 2 5 |grep eth0
    11时52分37秒 eth0 1.00 1.00 97.51 97.51 0.00 0.00 0.00
    11时52分39秒 eth0 1.01 1.01 98.49 98.49 0.00 0.00 0.00
    11时52分41秒 eth0 1.00 1.00 98.00 98.00 0.00 0.00 0.00
    11时52分43秒 eth0 1.00 1.00 98.00 98.00 0.00 0.00 0.00
    11时52分45秒 eth0 1.00 1.00 98.00 98.00 0.00 0.00 0.00
    Average: eth0 1.00 1.00 98.00 98.00 0.00 0.00 0.00

    如果想知道网络设备错误报告,也就就是用来查看设备故障的。应该用EDEV;比如下面的例子;

    [root@localhost ~]# sar -n EDEV 2 5


    3.3 iostat

    iostat 是用来显示 系统即时系统,比如CPU使用率,硬盘设备的吞吐率;

    [root@localhost ~]# iostat
    Linux 2.6.15-1.2054_FC5 (localhost.localdomain)   2006年05月12日

    avg-cpu:  %user   %nice %system %iowait   %idle
               7.24    0.00    0.99    0.35   91.43

    Device:   tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    hda      1.46        28.43        21.43     710589     535680


    3.4 mpstat

    mpstat 提供多处理器系统中的CPU的利用率的统计;mpstat 也可以加参数,用-P来指定哪个 CPU,处理器的ID是从0开始的。下面的例子是查看两个处理器,每二秒数据更新一次,总共要显示10次数据;

    [root@localhost ~]# mpstat -P 0 2 10 注:查看第一个CPU
    [root@localhost ~]# mpstat -p 1 2 10 注:查看第二个CPU


    [root@localhost ~]# mpstat 2 10 注:查看所有CPU;


    3.5 sdaf

    sdaf 能从二进制文件中提取sar所收集的数据;这个大家知道就行了。显示的并不是友好的格式;

    [root@localhost ~]# sar -u 2 5 -o sar003
    [root@localhost ~]# sadf sar003

    相对来说,用sar来读取输出文件的内容更好;比如下面的;

    [root@localhost ~]# sar -f sar003


    4、 与Sysstat相似工具;


    4.1 进程管理工具;

    进程管理工具,包括ps 、pgrep、top、kill 、killall、pkill 等,请参考 《 Linux 进程管理》


    4.2 内存使用率查看工具;

    内存使用量 free

    free 工具既能查看物理内存,也能查看虚拟内存的用量;

    [root@localhost ~]# free

    如果显示以单位M,则加-m参数;

    [root@localhost ~]# free -m
                 total used free shared buffers cached
    Mem: 724 713 11 0 24 290
    -/+ buffers/cache: 398 326
    Swap: 800 0 800


    vmstat 即时显示内存工具;

    vmstat 是一个即时显示内存使用情况的工具;

    vmstat 使用方法:

    vmstat [-V] [-n] [delay [count]]
                  -V 显示vmstat的版本;
                  -n causes the headers not to be reprinted regularly.
                  -a 显示所有激活和未激活内存的状态;print inactive/active page stats.
                  -d 显示硬盘统计信息;prints disk statistics
                  -D 显示硬盘分区表;prints disk table
                  -p 显示硬盘分区读写状态等;prints disk partition statistics
                  -s 显示内存使用情况;prints vm table
                  -m prints slabinfo
                  -S 定义单位,k K
                  delay 是两次刷新时间间隔;
                   单位体积: k:1000 K:1024 m:1000000 M:1048576 (默认是 K)
                  count 刷新次数;
  •    Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
      在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。

      用vmstat监视内存使用情况

      vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

      vmstat的语法如下:

      vmstat [-V] [-n] [delay [count]]


      其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

      用iostat监视I/O子系统情况

      iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

      iostat的语法如下:

    iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval  [ count ] ]


      其中,-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。

      iostat一般的输出格式如下:

    Linux 2.4.18-18smp (builder.linux.com)  2003年03月07日
    
    avg-cpu:  %user   %nice    %sys   %idle
               4.81    0.01    1.03   94.15
    
    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    dev3-0           30.31      1117.68       846.52   16104536   12197374
    dev3-1            7.06       229.61        40.40    3308486     582080


      对于输出中各字段的含义,iostat的帮助中有详细的说明。

      使用sar进行综合分析

      表1 sar参数说明

      选项 功能

      -A 汇总所有的报告

      -a 报告文件读写使用情况

      -B 报告附加的缓存的使用情况

      -b 报告缓存的使用情况

      -c 报告系统调用的使用情况

      -d 报告磁盘的使用情况

      -g 报告串口的使用情况

      -h 报告关于buffer使用的统计数据

      -m 报告IPC消息队列和信号量的使用情况

      -n 报告命名cache的使用情况

      -p 报告调页活动的使用情况

      -q 报告运行队列和交换队列的平均长度

      -R 报告进程的活动情况

      -r 报告没有使用的内存页面和硬盘块

      -u 报告CPU的利用率

      -v 报告进程、i节点、文件和锁表状态

      -w 报告系统交换活动状况

      -y 报告TTY设备活动状况



      sar是System Activity Reporter(系统活动情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

      sar的语法如下:

    sar [-option] [-o file] t [n]


      它的含义是每隔t秒取样一次,共取样n次。其中-o file表示取样结果将以二进制形式存入文件file中。

      另一种语法如下:

    sar [-option] [-s time] [-e time] [-i sec] [-f file]


      含义是表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件/var/adm/sa/sadd取数据,其中dd表示当前天。另外,-s time表示起始时间;-e time表示停止时间;-i sec表示取样的时间间隔,如果不指定则表示取文件中所有的数据。对于具体的选项参见表1。

      一般它与-q和-u联合使用,以便对每个CPU的使用情况进行分析,比如运行如下命令:

    sar  -q -u 5 1


      将输出如下:

    Linux 2.4.18-18smp (builder.linux.com) 	2003年03月07日
    
    09时46分16?      CPU     %user     %nice   %system     %idle
    09时46分21?      all      0.20      0.00      0.00     99.80
    
    09时46分16?  runq-sz  plist-sz   ldavg-1   ldavg-5
    09时46分21?        0        91      0.00      0.00
    
    Average:          CPU     %user     %nice   %system     %idle
    Average:          all      0.20      0.00      0.00     99.80
    
    Average:      runq-sz  plist-sz   ldavg-1   ldavg-5
    Average:            0        91      0.00      0.00


      由于sar命令太复杂,只有通过熟练使用才能了解每个选项的含义,对于sar输出中每个字段的含义运行man sar命令可以得到详细的解释。