我曾经听到这么一个故事: 一个年轻的程序员问一个老程序员(一个比较牛逼的公司的CTO) 年轻程序员: 你为什么这么牛X., 就好像没有你不会的。老程序员: 积累的。年轻程序员: 怎么才能积累到您的程度呢。我每天都在积累。但是似乎都没有感觉到进步。老程序员: 我从20岁开始做到了一件事情,直到今天,而且尽可能地保证不间断。年轻程序员: 到底是什么? 老程序员: 我每天保证自己有2个小时在学习新的东西。

发布新日志

  • Ant之build.xml详解

    2013-10-21 16:57:55

    关键字: ant build.xml
    Ant的概念 
    可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令。当编译Linux内核及一些软件的源程序时,经常要用这个命令。Make命令其实就是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷。最初Ant开发者在开发跨平台的应用时,用样也是基于这些缺陷对Ant做了更好的设计。 

    Ant 与 makefile 
    Makefile有一些不足之处,比如很多人都会碰到的烦人的Tab问题。最初的Ant开发者多次强调”只是我在Tab前面加了一个空格,所以我的命令就不能执行”。有一些工具在一定程度上解决了这个问题,但还是有很多其他的问题。Ant则与一般基于命令的工具有所不同,它是Java类的扩展。Ant运行需要的XML格式的文件不是Shell命令文件。它是由一个Project组成的,而一个Project又可分成可多target,target再细分又分成很多task,每一个task都是通过一个实现特定接口的java类来完成的。 

    Ant的优点 
    Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是存Java语言编写的,所示具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。 

    Ant 开发Ant的构建文件当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。 
    (1) src存放文件。 
    (2) class存放编译后的文件。 
    (3) lib存放第三方JAR包。 
    (4) dist存放打包,发布以后的代码。 
    Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。 
    (1) 核心任务。核心任务是Ant自带的任务。 
    (2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。 
    (3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。 

    1.<project>标签 
    每个构建文件对应一个项目。<project>标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。 
    (1) default表示默认的运行目标,这个属性是必须的。 
    (2) basedir表示项目的基准目录。 
    (3) name表示项目名。 
    (4) description表示项目的描述。 
    每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。 

    2.<target>标签 
    一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。 
    (1) name表示标明,这个属性是必须的。 
    (2) depends表示依赖的目标。 
    (3) if表示仅当属性设置时才执行。 
    (4) unless表示当属性没有设置时才执行。 
    (5) description表示项目的描述。 
    Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执行的顺序是prepare->compile->run。一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总会被执行。 

    3.<mkdir>标签 
    该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,其代码如下:<mkdir dir=”${class.root}”/>通过以上代码就创建了一个目录,这个目录已经被前面的property标签所指定。 

    4.<jar>标签 
    该标签用来生成一个JAR文件,其属性如下。 
    (1) destfile表示JAR文件名。 
    (2) basedir表示被归档的文件名。 
    (3) includes表示别归档的文件模式。 
    (4) exchudes表示被排除的文件模式。 

    5.<javac>标签 
    该标签用于编译一个或一组java文件,其属性如下: 
    (1).srcdir表示源程序的目录。 
    (2).destdir表示class文件的输出目录。 
    (3).include表示被编译的文件的模式。 
    (4).excludes表示被排除的文件的模式。 
    (5).classpath表示所使用的类路径。 
    (6).debug表示包含的调试信息。 
    (7).optimize表示是否使用优化。 
    (8).verbose 表示提供详细的输出信息。 
    (9).fileonerror表示当碰到错误就自动停止。 

    6.<java>标签 
    该标签用来执行编译生成的.class文件,其属性如下。 
    (1).classname 表示将执行的类名。 
    (2).jar表示包含该类的JAR文件名。 
    (3).classpath所表示用到的类路径。 
    (4).fork表示在一个新的虚拟机中运行该类。 
    (5).failonerror表示当出现错误时自动停止。 
    (6).output 表示输出文件。 
    (7).append表示追加或者覆盖默认文件。 

    7.<delete>标签 
    该标签用于删除一个文件或一组文件,去属性如下: 
    (1).file表示要删除的文件。 
    (2).dir表示要删除的目录。 
    (3).includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。 
    (4).failonerror 表示指定当碰到错误是否停止,默认值是自动停止。 
    (5).verbose表示指定是否列出所删除的文件,默认值为不列出。 

    8.<copy>标签 
    该标签用于文件或文件集的拷贝,其属性如下。 
    (1).file 表示源文件。 
    (2).tofile 表示目标文件。 
    (3).todir 表示目标目录。 
    (4).overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。 
    (5).includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。 
    (6).failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。 
    (7).verbose 表示制定是否显示详细信息,默认值不显示。 

    Ant的数据类型 
    在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在 
    org.apache.tool.ant.types包中。下面简单介绍构建文件中一些常用的数据类型。 

    1. argument 类型 
    由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。 
    (1).values 是一个命令参数。如果参数种有空格,但又想将它作为单独一个值,则使用此属性。 
    (2).file表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。 
    (3).line表示用空格分隔的多个参数列表。 
    (4).path表示路径。 

    2.ervironment 类型 
    由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。 
    (1).file表示环境变量值得文件名。此文件名要被转换位一个绝对路径。 
    (2).path表示环境变量的路径。Ant会将它转换为一个本地约定。 
    (3).value 表示环境变量的一个直接变量。 
    (4).key 表示环境变量名。 
    注意  file path 或 value只能取一个。 

    3.filelist类型Filelist 是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。 
    (1).dir是用于计算绝对文件名的目录。 
    (2).files 是用逗号分隔的文件名列表。 
    (3).refid 是对某处定义的一个<filelist>的引用。 
    注意  dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。 

    4.fileset类型 
    Fileset 数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。 
    (1).dir表示fileset 的基目录。 
    (2).casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true。 
    (3).defaultexcludes 用来确定是否使用默认的排除模式,默认为true。 
    (4).excludes 是用逗号分隔的需要派出的文件模式列表。 
    (5).excludesfile 表示每行包含一个排除模式的文件的文件名。 
    (6).includes 是用逗号分隔的,需要包含的文件模式列表。 
    (7).includesfile 表示每行包括一个包含模式的文件名。 

    5.patternset 类型 
    Fileset 是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。<patternset>支持4个属性:includes excludex includexfile 和 excludesfile,与fileset相同。Patternset 还允许以下嵌套元素:include,exclude,includefile 和 excludesfile。 

    6.filterset 类型 
    Filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。 
    主要属性如下: 
    (1).begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。 
    (2).endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。 
    (3).id是过滤器的唯一标志符。 
    (4).refid是对构建文件中某处定义一个过滤器的引用。 

    7.Path类型 
    Path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作揖个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。 
    (1).location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。 
    (2).refid 是对当前构建文件中某处定义的一个path的引用。 
    (3).path表示一个文件或路径名列表。 

    8.mapper类型 
    Mapper类型定义了一组输入文件和一组输出文件间的关系,其属性如下。 
    (1).classname 表示实现mapper类的类名。当内置mapper不满足要求时,用于创建定制mapper。 
    (2).classpath表示查找一个定制mapper时所用的类型路径。 
    (3).classpathref是对某处定义的一个类路径的引用。 
    (4).from属性的含义取决于所用的mapper。 
    (5).to属性的含义取决于所用的mapper。 
    (6).type属性的取值为identity,flatten glob merge  regexp  其中之一,它定义了要是用的内置mapper的类型。 

    Ant 的运行 
    安装好Ant并且配置好路径之后,在命令行中切换到构建文件的目录,输入Ant命令就可以运行Ant.若没有指定任何参数,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为构建文件。如果使用了 –find 选项,Ant 就会在上级目录中找构建文件,直至到达文件系统得跟目录。如果构建文件的名字不是build.xml ,则Ant运行的时候就可以使用 –buildfile file,这里file 指定了要使用的构建文件的名称,示例如下: 
    Ant如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。 
    Ant –buildfile  test.xml使用当前目录下的test.xml 文件运行Ant ,执行默认的目标
  • 如何写build.xml

    2013-10-21 16:53:59

    <?xml version="1.0"  encoding="GB2312" ?> 
    <project name="projectname" default="war" basedir="."> 
    <!-- 
      =================================================================== 
      定义属性(property tasks) 
      最好把用到的路径呀,名称呀都在这里定义成全局变量 
      例:定义 
      <property name="a" value="hello"/> 
      以后就可以这样用它: 
      <property name="b" value="${a}/b"/> 
      现在:b=="hello/b" 
      =================================================================== 
    --> 
    <!--主要的系统环境属性--> 
    <property environment="env" /><!--取window,unix...的环境变量--> 
    <property name="java.home" value="${env.JAVA_HOME}" /> 
    <!--主要的app环境属性--> 
    <property name="app.name" value="yourappname" /> 
    <property name="app.jar" value="${app.name}.jar" /> 
    <property name="app.war" value="${app.name}.war" /> 
    <property name="app.copyright" 
      value=" Copyright (c) 2010 GLOBAL-SAFETY Software Foundation.  All rights reserved." /> 
    <!--app中src的属性--> 
    <property name="src.dir" value="src" /> 
    <property name="classSavePath" value="web/WEB-INF/classes" /> 
    <!--app用到的lib--> 
    <property name="lib.dir" value="web/WEB-INF/lib" /> 
    <!--app的build目录中--> 
    <property name="build.dir" value="./output" /> 
    <property name="build.classes" value="${build.dir}/classes" /> 
    <property name="build.lib" value="web/WEB-INF/lib" /> 
    <property name="war.dir" value="${build.dir}/war" /> 
    <property name="warsource.dir" value="web" /> 
    <!-- 
      定义一组路径以后可以通过id重用这组路径 ,例: 
      <javac srcdir="src/main" destdir="build/classes"> 
      <classpath refid="classpath"/> 
      </javac> 
    --> 
    <path id="classpath"> 
      <fileset dir="${lib.dir}"> 
       <include name="**/*.jar" /> 
       <include name="*.zip" /> 
      </fileset> 
      <fileset dir="${java.home}/lib"> 
       <include name="**/*.jar" /> 
       <include name="*.zip" /> 
      </fileset> 
    </path> 
    <!-- 
      =================================================================== 
      init 准备目录(File Tasks) 
      主要的目录结构通常是不会变的,一起生成他们 
      =================================================================== 
    --> 
    <target name="init"> 
      <echo message="环境信息:" /> 
      <echo message="JAVA_HOME:${java.home}" /> 
      
      <!--清除以前目录--> 
      <delete dir="${build.dir}" failonerror="false" /> 
      <delete dir="${classSavePath}" failonerror="false" /> 
      <!--准备目录--> 
      <mkdir dir="${build.dir}" /> 
      <mkdir dir="${classSavePath}" /> 
    </target> 
    <!-- 
      =================================================================== 
      Build the code (Compile Tasks,File Tasks) 
      =================================================================== 
    --> 
    <target name="build" depends="init"> 
      <!--编译--> 
      <javac srcdir="${src.dir}" destdir="${classSavePath}" 
       encoding="UTF-8" fork="true" memoryMaximumSize="1024m"> 
       <classpath refid="classpath" /> 
      </javac> 
      <copy todir="${classSavePath}" includeemptydirs="false"> 
       <fileset dir="${src.dir}"> 
        <include name="**/*.properties" /> 
        <include name="**/*.xml" /> 
        <include name="**/*.xsl" /> 
       </fileset> 
      </copy> 
    </target> 
    <!-- 
      =================================================================== 
      打war包 
      =================================================================== 
    --> 
    <target name="war" depends="build" description="生成war包"> 
      <echo message="正在打war包,请稍候..." /> 
      <war destfile="${build.dir}/${app.war}" encoding="gb2312" 
       webxml="${warsource.dir}/WEB-INF/web.xml"> 
       <fileset dir="${warsource.dir}"> 
        <exclude name="build.xml" /> 
        <exclude name="**/web.xml" /> 
       </fileset> 
      </war> 
      <echo message="打war包结束" /> 
    </target> 

    <!-- 
      =================================================================== 
      快速(依靠原工程编译文件)打war包 
      =================================================================== 
    --> 
    <target name="quick-war" depends="" description="生成war包"> 
      <echo message="非重新build打war包(请保证您的工程$/web/WEB-INF/classes已有下编译类),请稍候..." /> 
      <war destfile="${build.dir}/${app.war}" encoding="gb2312" 
       webxml="${warsource.dir}/WEB-INF/web.xml"> 
       <fileset dir="${warsource.dir}"> 
        <exclude name="build.xml" /> 
        <exclude name="**/web.xml" /> 
       </fileset> 
      </war> 
      <echo message="打war包结束" /> 
    </target> 

    </project>
  • AIX性能监控topas命令的详细解析

    2013-10-10 11:06:25

    操作系统的最全面动态,而又查看方便的性能视图就是topas命令了,下面以topas输出为例,对AIX系统的性能监控做简要描述,供运维工程师和系统管理员们参考。

      另:1.操作系统报错信息errpt查看。2.磁盘空间使用率采用df查看。这里主要分析性能问题。

      执行topas命令后如图所示:

      #topas

      点击查看原图

      区域1:反映CPU使用率和工作状况。

      Kernel:

      说明:操作系统的内核占用的CPU时间比率。

      操作系统作为基础软件,为应用程序支持和服务的同时,本身的运行也需要一定的CPU和内存资源(顺便提到内存资源,后面不再阐述这个内容了),特别是内存资源,系统负载越重,相应的内核占用的CPU和内存资源也会越多。一般来说,内核占用的CPU时间不会太多的。一般小于应用的CPU使用率。

      User:

      说明:用户进程占用的CPU时间比率。

      这个为CPU使用率的关键数值。该使用率反映了用户在操作系统基础上运行的各种软件占用的CPU时间比率的总和。一般来说,如果User+Kernel连续大于70%,即可以认为系统可能存在CPU上的严重性能问题。

      Wait

      说明:CPU处于等待状态占CPU时间的比率。

      CPU的等待一般都为等待IO的响应,众所周知,目前计算机的主要瓶颈都在IO。应用程序执行的时候,需要读写磁盘等外部存储的数据,进程就会发起IO请求后等待IO完成。这个等待的过程占用CPU时间就是wait。当这个值很高的时候,就说明IO来不及响应很多的IO请求,这个时候,就只能从IO层面想办法优化了。

      Idle:

      说明:CPU空闲时间比率,这个就不用说了吧。就是CPU多少时间比率在闲着。

      CPU占用率出问题的主要可能原因:数据库服务器执行某一个SQL或者存储过程(存储过程就是封装起来的sql程序包而已)需要大量的运算(一般为软件设计不合理)。或者应用程序中存在异常的地方,比如死循环,或者其他写程序时的逻辑错误导致。一般程序出错会导致一个CPU被全部占用,比如上述的20%占用的原因就是一个交易程序长期占用一个CPU全部时间片(系统共计5个CPU)。

    区域2:反映网络使用率的状况。

      Netwok;列出了网卡接口,KBPS即每秒钟多少KB(千字节) I-Pack每秒钟输入的数据包个数, O-Pack 每秒钟输出的数据包个数 KB-In每秒钟输入的字节数 KB-Out每秒钟输出的字节数。

      当我们发现网络拥堵时(出现网卡传输失效的报错,即网卡发送数据包失败。或者网络响应明显变慢的时候,如果CPU没有问题,那么请检查网络流量)发现某一个网卡的KBPS持续大于四位数,甚至五位数时(这个值要是网卡千兆还是百兆而定)。就要看看这个网卡是什么网卡,在处理什么业务了。在命令行执行netstat –in 查看对应en*接口的ip地址,通过ip地址看看是带官网卡还是生产服务网卡流量高。然后通过netstat –v en* 看看网卡的详细工作状态,出现了多少错包,冲突包,crc校验错或者网络重置过等信息。上述信息请详细看netstat –v en*的输出.如果出现大量crc,错包的话,可能网线有问题或者接触不良。

      如果上述均正常,而网络反应慢,则有可能是交换机拥堵。

      网络出现问题的可能原因:通过百兆的带管网加载大量数据(以前出现过),大量队列的长时间的ftp传输,或者网线,交换机问题等。

      区域3:反映磁盘使用率的状况。

      Disk Busy%磁盘繁忙的百分比,即磁盘能满足的最大IOPS(每秒IO操作数)和当前IO数量的比率。其他的参数不再解释。望文生义即可。

      一般主要看磁盘的Busy%,当磁盘的Busy%持续大于85%时,即认为磁盘相当繁忙,已经可能要出问题了。当然,自己知道已经确定要产生大量IO操作的内容则不必在意,等其完成即可。

      出现问题的原因:应用服务器上面写日志进程或者查询日志的进程大量读写日志,导致磁盘繁忙率高,或者其他程序频繁读写磁盘导致。系统中hdisk0,hdisk1一般为系统盘,内置SCSI磁盘的相对IOPS是较低的。很容易满负荷运行。

      区域4:反映进程信息的状况。

      Name:进程的名称,即进程被执行时启动的二进制文件的名称。

      PID,进程的ID,进程的ID在系统中唯一,是我们了解跟踪进程信息重要数值。

      跟踪进程的CPU使用,磁盘IO读写,进程的内存和pagingspace占用等等均需要使用。

      CPU%进程占用CPU时间的比率。

      PgSp,进程占用的pagingspace的空间大小。

      Owner进程的属主,即由哪个操作用户用户启动了这个进程。

      在topas中,默认是列出占用cpu最高的前几个的进程信息供参考,如果前面第一区域的的CPU使用率持续高,就要看看这里是那个进程占用了大量的CPU资源,看看是哪个用户的进程,如果自己执行的,则杀掉或者找项目组解决即可。

      区域5:反映内存页面和换页空间信息的状况。

      换页空间即磁盘上的空间,在AIX操作系统中用来做内存空间使用。具体的理论就不再阐述了,详细信息请参阅操作系统内容。磁盘空间的速度当然相比内存,慢了不止10倍。所以,只是内存页面的一个暂时存放地,存放的还是那些长期不怎么用到的内存页面而已。如果paging大量出现,这时候就有麻烦了,说明:内存不够用了!

      该区域主要关注PageIn,PageOut如果这两个数值均大于三位数,并且长期大于这个数值,在技术上叫做内存颠簸,即不停的把内存页面换到磁盘空间上,又从磁盘空间把内存页面读进来,系统的内存使用效率变的极差,系统响应性能也变慢了。

      这个信息也可以用vmstat来看,pi和po列即与这里相对应。当然,如果只是有页面出,或者只有页面入,或者短时间的一些页面换入换出,则没有什么问题,关注一下即可。

    区域6:反映内存使用的信息。

      Real,MB操作系统实际拥有的内存的总量,单位是MB。

      %Comp,计算型内存占用比率,%Noncomp非计算型内存占用的比率。

      %Client也为非计算型内存,Noncomp包涵Client型内存,jfs文件系统使用的内存为noncomp,为了区分,jfs2和nfs使用的内存为Client。

      计算型内存就是进程实际使用的内存,例如我们写程序的时候malloc内存,或者在排序中使用了堆栈,进程中变量数值都需要在内存中保存,这部分内存为计算型内存(阐述不全面,仅供参考)。而操作系统在进行文件读写,需要的io缓冲区,或者我们在写程序的时候,打开文件,读写文件,均在文件缓冲区进行。(裸设备例外,CCCC的数据库采用RAC,数据的存储全部使用裸设备,在数据库服务器上,数据文件的缓冲在oracle的sga区的data buffer中(这个区域系统认为是计算型内存),是不会占用非计算内存的。)

      导致内存出问题的可能原因很多。主要有:进程使用了更多的内存,例如,CCCC数据库服务器大量的oracle连接使用了很多内存,或者数据库中执行的某一个sql脚本或者存储过程的执行需要大量的内存来完成其操作(特例库中出现过这个情形,一个存储过程的执行导致操作系统内存被耗尽,pg也随之耗尽,操作系统自动执行PGSP_KILL,把该进程给干掉了,我也是第一次知道aix系统还有这个功能,呵呵)。第二个主要的问题就是内存泄漏,内存泄漏最简单的来说,就是申请了内存空间,使用后不再使用了,但是也没有释放。我们写程序的时候malloc,却没有free。这就导致了严重的问题,随着程序的执行,可用物理内存越来越少,最后就挂了,只好定期重启应用来解决。

      操作系统的内存换页机制导致了程序中不用的内存页面最后都跑到pg上面去了,换页空间会持续增长的。因应用导致系统问题就是这么产生的。

      区域7反映的是换页空间的使用率。

      如果换页空间的使用率长期增长,就说明系统内存不足,已经开始使用磁盘空间来缓冲内存了,如果PG使用率持续增长,或者大于50%,需要警惕(到50%在监控平台已经是主要告警啦!),并马上提交系统管理员分析内存增长原因。如果该数值持续增长,系统一定会挂掉的!

  • [转]Ubuntu下Samba服务器的搭建

    2009-12-16 16:27:23

     
    Samba服务在Ubuntu服务器版本中默认并没有安装。

    1.Samba软件包的安装
    在Ubuntu的终端中输入一下命令:
    #sudo apt-get install samba
    #sudo apt-get install smbclient


    2.Samba服务器的启动与关闭

    启动Samba服务器只需执行如下命令:
    #sudo /etc/init.d/samba start
    启动Samba服务器后,可以使用ps命令查看进程:
    #ps -aux

    可以看到Samba服务会同时启动两个服务,其中smbd主要用来管理共享出来的目录,nmbd主要用来解析NetBIOS名。在Windows系统中,主机可以被加入一个组中,这样每个主机都必须有一个名字,这个名字是用于在网上被标志的名,并非机器的主机名,将其称为NetBIOS名。其中nmbd进程是随着smbd进程启动而启动。

    关闭Samba服务,使用命令:
    #/etc/init.d/samba stop
    或者:
    #smbcontrol smbd shutdown    -----------此命令只关闭smbd

    重新启动Samba服务器:
    #/etc/init.d/samba restart

    3.配置Samba服务

    Samba服务器主要配置文件为/etc/samba/smb.conf,并且可以将NetBIOS名与主机的对应关系写在/etc/samba/lmhosts文件中。

    (1)在Windows系统中不用输入密码访问Linux共享目录
    在Linux共享一个目录,将建立好的目录的设置信息写入/etc/smb.conf文件即可。如:若共享/home/share目录,要在Windows系统中访问这个共享的目录,假设Windows主机的IP为192.168.0.11,Linux主机的IP为192.168.10,进行如下操作:
    #mkdir /home/share
    #vi smb.conf
    将文件中的内容做如下相应修改:
    security=user 改为security=share
    在文件结尾添加如下行:
    [share]
    comment=this is Linux share directory
    path=/home/share
    public=yes
    writable=yes

    保存退出,启动Samba服务:
    #/etc/init.d/samba start

    设置完成!

    在Windows 下访问共享目录,可点击运行,输入
    \\192.168.0.10\share
    这样就能以匿名用户访问共享目录share了。

    其中配置文件smb.conf主要可以分为两部分:前一部分为Global Settings(全局部分),全局部分能够对主机的相关信息进行配置,而且能够配置访问时是否需要密码。常用选项有:

    workgroup=MSHOME

    这部分是Windows主机的工作组明,Windows主机必须在同一个工作组中,

    server string=%h server(Samba,Ubuntu)

    这个选项是显示在Windows上的信息,可以自定义,其中%h为Samba配置文件中的变量,代表了主机名,即使用hostname命令得到的主机名。

    log file=/var/log/samba/log.%m

    这里指定了Samba服务的日志文件所在位置,其中%m也是samb.conf文件的变量,代表了登录主机的NetBIOS名。Windows主机的NetBIOS命令可以通过鼠标右键打开“我的电脑/属性/计算机明/更改/其他“来查看。

    max log size=1000

    设置日志文件的最大尺寸,大小为KB。

    需要注意的是在smb.conf文件中“#”和“;”都是注释。

    在smb.conf文件中跌入部分就是共享部分,在此部分中需要将共享的目录添加到此文件中。此部分的格式和主要选项如下:
    [share]           ----------在Windows主机中看到的共享文件名,不一定与Linux中共享的文件名一致,

    comment=this is Linux share directory ----------对此目录的说明
    path=/home/share -------Linux系统真实的共享目录,必须为绝对路径
    public=yes -------是否允许所有人都能够看到此目录,no为看不到
    writable=yes -------是否允许用户在此目录下可写,no为不可些,如果可写,还需要目录具有w权限
    read nly=yes --------设置用户是否只读
    create mode=0700 --------如果有可写权限,建立的文件默认的权限掩码
    directory mode=0755 --------如果有可写权限,建立的目录默认的权限掩码


    (2)在Windows系统之需要输入密码才能访问Linux共享目录

    在smb.conf文件中,默认行是:

    security=user

    这行设置了Samba的安全等级,Samba一共可以设置四个安全登记,由底到高分别为:

    share:这个选项表示任何人都可以不需要输入密码登录。

    user:这个是Samba的默认级别,要求每个用户必须输入密码才能登录。

    server:user级别的密码都是保存在本机上,而server级别的密码和用户名都保存在另一台主机上。

    domain:这个级别要求网络里必须有一台Windows的域控制器,验证工作由域控制器来完成。

    需要注意:只要输入用户名和密码的级别,其用户名一定首先也是Linux系统内的用户。

    如果将Samba的安全级别设置了user级别,那么用户登录Samba主机必须输入密码,此用户必须是Linux中的/etc/passwd文件存在的用户,smb.conf文件的配置如下:

    在smb.conf文件中的security=user下加入:
    smb passwd file= /etc/samba/smbpasswd

    在共享部分添加:

    [homes]
    comment=Home Directories
    valid users=%S

    其中%S为一个变量,它代表了登录用户的用户名,既认证的用户登录后就能进入自己的宿主目录。然后在 /etc/samba下建立smbpasswd文件并加入用户:

    #touch /etc/samba/smbpasswd
    #smbpasswd -a user1
    NEW SMB password:
    Retype new SMB password:

    这样就可以让user1登录Samba主机了。其中smbpasswd命令的格式为:

    #smbpasswd [-选项] 用户名

    常见选项有:

    -a:新添加一个Samba用户。

    -d:禁用一个Samba用户。

    -e:使禁用的Samba用户解禁。

    如果需要对设置进行检测,我们可以直接使用testparm命令。

    (3)在Linux中访问Windows的共享目录
    在Linux中,可以直接将Windows中的共享目录挂在到本机中,然后就像操作自己主机上的文件一样进行操作。我们可以使用smbclient命令查看指定主机的共享目录信息。

    # smbclient -L //[目标主机IP地址]

    当查看到Windows系统中的共享目录后,可以使用smbmount命令来进行挂载共享的目录,smbmount命令的格式为:

    #smbmount '\\Windows主机IP\共享的目录名' 挂载点 -O username

    (4)在Linux中访问Linux主机的共享目录

    跟访问Windows中的共享目录一样,用自己的共享目录测试如下:



    ===================================================
    Samaba常见的故障排除

    1.限定用户访问无效
    管理员限定了只有用户user1才可以访问共享目录/sharedoc,测试时却发现用户user2也可以访问,甚至所有的用户都可以访问!这是一个很容易出错的问题,我们看看在Samba配置文件/etc/samba/smb.conf中的相应设置段:
    [sharedoc]
    path=/sharedoc
    valid user=user1
    writable=yes
    乍一看没什么问题,用testparm工具测试一下看看:

    #testparm

    Load smb config files from /etc/samba/smb.conf

    Processing section "[homes]"

    Processing section "[sharedoc]"

    Unknown parameter encountered: "valid user"

    Ignoring unknown parameter "valid user"

    .......

    [sharedoc]

    path=/sharedoc

    read nly=No

    testparm是Samba提供的一个十分有用的测试工具,它除显示Samba所有配置参数默认值外,还能检测参数的实际取值,并与Samba管理员所设置的取值进行对比,检测smb.conf文件有没有包含任何无效参数。

    通过测试发现,设置共享资源时,参数“valid users”少写了个"s“ ,变成了"valid user",结果在读取配置文件时检测为未知参数并忽略了它,这样这条参数就无效了,也就相当于没有设置有效用户,则默认共享目录为所有用户都可以访问,就出现了前面提到的问题。可见如果不小心设置错误,后果是相当严重的。

    Samba的配置选项语法要求严格,建议配置好后用testparm检测一下看看是否有语法错误,以免发生此种现象。

    2.用户权限设定无效

    在解决了限定用户的问题,又发现明明设置了"writable=yes",赋予user1写权限,但user1在Windows客户端却无法对这个共享目录进行写操作。

    这里有个概念问题,尽管Samba授予用户user1对共享资源具有写权限,但底层Linux系统许可不允许user1在共享资源上添加文件或目录。这时,唯有更改该目录的Linux文件权限设置,更改完成后,才可以进行前述的写入操作。也就是说,Linux系统中用户user1对此目录的权限与Samba服务中授予用户user1对此目录的操作权限要取一个交集!

    观察共享目录/sharedoc的权限:

    #ls -ld /sharedoc

    drwxr-xr-x 2 root root 4096 2月 6 23:54 /sharedoc

    在根目录下只有root只有写操作,root创建的目录/sharedoc自然所有者为root,所属组为root管理员,看到用户user1并不是所属组的成员更不是所有者,属于其他人(others),其他成员只具备"r-x"即可读可执行的权限,并不具备写权限,所以即便Samba中授权用户user1有写权限也无济于事。

    如果要授予user1可以进行写操作,最简单的办法就是赋予其他人对目录具备写权限:

    #chmod o+w /sharedoc

    正确的解决方法最好是将设置权限的用户加入到目录对应的组中,对组授权,进行统一管理。

    3.解决中文乱码问题

    在Windows中看到Linux的共享文件和目录中文都显示乱码。

    要解决这个问题,首先执行命令locale查看一下系统的字符集:

    #locale

    LANG=zh_CN.GB18030

    LC_CTYPE="zh_CN.GB18030"

    LC_NUMERIC="zh_CN.GB18030"

    LC_TIME="zh_CN.GB18030"

    .........

    然后根据locale查到的字符集设置,修改配置文件smb.conf中的"[Global]"全局参数设置段:

    (1)如果locale是zh_CN.UTF-8,添加如下三行设置:

    display charset=UTF-8

    unix charset=UTF-8

    dos charset=UTF-8

    (2)如果locale是zh_CN.GBK、zh_CN.gb2312或zh_CN.GB18030,添加如下三行设置:

    display charset=cp936

    unix charset=cp936

    dos charset=cp936

    重新启动Samba服务,则无论从Windows网上邻居还是直接用DOS命令查询,均可显示正常中文。

    4.如何不显示隐藏文件

    如果访问宿主目录,那些以"."开头的隐藏文件都显示得一清二楚,那么就有可能一个误操作把重要的配置文件删除了,这是很危险的。

    要让隐藏文件不显示,需要在Samba配置文件的[homes]段添加如下设置:

    veto files=/.*/

    "veto files"参数为设定禁止文件,指定了既看不见又不能访问的文件和目录列表,列表中每个条目必须用斜杠(/)分开,星号(*)和问号(?)通配符能够用于指定多个文件和目录。所以"/.*/"就表示禁止所有以"."开头的文件。

    同时还可以做其他一些限定,如Samba所有共享目录中都禁止显示包含词Windows的任何文件,以".exe"结尾的任何文件和包含词bill的任何目录,可以在[Global]段添加如下行:

    veto files=/*Windows*/*.exe/*bill/

    需要注意的是:

    (1)如果要禁止显示隐藏文件和包含词newfile的文件,不能用如下的书写方式:

    veto files=/.*/

    veto files=/*newfile*/

    这样设置,第一行的禁止显示隐藏文件将不能生效,必须写成:

    veto files=/.*/*newfile*/

    (2)设置"veto files"参数会影响Samba的性能,因为在列出文件和查询期间,扫描文件和目录时,为了匹配,Samba将被迫搜寻检查所有的文件和目录。

    Samba的故障一般排除方法如下(参考):

    1.确定故障的症状。可能会有人告诉你症状或你观察到第一手的症状。

    2.因为涉及的是网络系统,确定故障发生在本地还是远程,症状经常会帮助你做决定,或建议能够先进行测试,以便决定。

    3.决定了故障所在的位置后,就集中用一套标准测试来确定故障的原因,并尝试消除症状,反复进行,直到解决问题。

    有关诊断Samba和Windows客户之间故障的工具:

    smbclient:检验可以访问的Samba服务器以及要求的共享已被定义。

    smbstatus:检查水正对Samba服务器打开连接,在访问什么共享。

    nmblookup:检测网络上的注册名称。

    DOS net view命令:从Windows系统检查服务器上都提供哪些共享。

    DOS netstat:检查NetBIOS名称、适配器状态信息等。

    tcpdump:捕获网络文件信息包,检查Windows客户端和服务器的对话。

    Ethereal:详细分析信息包,检查Windows客户端和Samba之间出现的故障。

  • 测试职业生涯(摘)

    2009-08-19 14:25:40

        由于国内软件测试行业目前的发展迅速、需求旺盛,在国内的软件测试职位晋升一般要比国外快,但因行业本身太年轻,大家对软件测试中软件测试职业的发展了解不够,从而导致许多有志在此发展的年轻人举步不前。所以下面介绍一下海外公司成熟的软件测试行业职位分布情况,我国一些在软件测试行业中处于前端的公司与之也相仿,这可以作为软件测试职业规划的参考,给新人一个导向。
       第一阶段:(测试员)初级测试工程师
       自身条件:初入行具备计算机专业学位或一些手工测试经验的个人。
    具体
    工作:执行测试用例,记录bug,并回归测试,通过qtp等测试工具录制回归测试脚本,并执行回归测试脚本。
      
    学习方向:开发测试脚本并且开始熟悉测试生存周期和测试技术。
      第二阶段:(测试工程师)程序分析员
      自身条件:有1~2年工作经验的测试工程师或程序员。具有初步的
    自动化测试能力,完善自动化测试脚本。

      具体工作:设计和编写测试用例,编写自动测试脚本程序且担任测试编程初期的领导工作。

      学习方向:拓展编程语言、操作系统、网络与数据库方面的技能 。
        第三阶段:(高级测试工程师)程序分析员

        自身条件:有3~4年经验的测试工程师或程序员。具有一定的行业业务知识,储备系统分析员的能力。

      具体工作:帮助开发或维护测试或编程标准与过程,分析软件需求,获得测试需求。确定测试需求相应的测试方法,获得测试策略方案。参与同行的评审(软件需求,软件测试计划等),并为其它初级的测试工程师或程序员充当顾问。
       学习方向:继续拓展编程语言、操作系统、网络与数据库方面的技能。

      第四阶段:测试组负责人

      自身条件:有4~6年经验的测试工程师或程序员。具有丰富的行业业务知识,具有系统分析员的能力,专长性能测试
       具体工作:负责管理1~3名测试工程师或程序员。集中于技能方面,担负一些进度安排和工作规模/成本估算职责。分析性能瓶颈的原因,为开发团队提供bug解决策略。
      学习方向:性能测试,测试技能
       第五阶段:(资深安全或性能测试工程师)测试/编程高级负责人
        自身条件:有6~10年经验的测试工程师或程序员。

       具体工作:负责管理8~10名技术人员。性能测试整体方案设计,软件系统性能问题定位和性能优化,内存优化及分析数据溢出等,分析系统的安全漏洞等。 负责进度安排、工作规模/成本估算、按进度表和预算目标交付产品。负责开发项目的技术方法。为一些用户提供支持与演示。

      学习方向:开发一些特定领域的技术专长
       第六阶段:测试/质量保证/开发(项目)、经理
        自身条件:有10多年的工作经验。
        具体工作:管理8名或更多的人员参加的1个或多个项目。负责这一领域(测试/质量保证/开发)内的整个开发生存周期业务。为一些用户提供交互和大量演示。负责项目成本、进度安排、计划和人员分工
        第七阶段:(公司级质量总监)计划经理
        自身条件:有15年以上开发与支持(测试/质量保证)活动方面的经验。
       具体工作:管理从事若干项目的人员以及整个开发生存周期。负责把握项目方向与盈亏责任。

  • 如何编写测试计划

    2009-03-04 11:16:05

    测试计划的编写提示(参考件)


    .1引言

     1.1编写目的
       本测试计划的具体编写目的,指出预期的读者范围。
     1.2背景
       说明:
       a 测试计划所从属的软件系统的名称;
       b.该开发项目的历史,列出用户和执行此项目测试的计算中心,说明在开始执行本测试计划之前必须完成的各项工作。
     1.3定义
       列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
     1.4参考资料
       列出要用到的参考资料,如:
       a.本项目的经核准的计划任务书或合同、上级机关的批文;
       b.属于本项目的其他已发表的文件;
       c.本文件中各处引用的文件、资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
     2计划
      2.1软件说明
       提供一份图表,并逐项说明被测软件的功能、输入和输出等质量指标,作为叙述测试计划的提纲。
      2.2测试内容列出组装测试和确认测试中的每一项测试内容的名称标识符、这些测试的进度安排以及这些测试的内容和目的,例如模块功能测试、接口正确性测试、数据文卷存取的测试、运行时间的测试、设计约束和极限的测试等。
      2.3测试1(标识符)
       给出这项测试内容的参与单位及被测试的部位。
      2.3.1进度安排
       给出对这项测试的进度安排,包括进行测试的日期和工作内容(如熟悉环境。培训、准备输入数据等)。
      2.3.2条件
       陈述本项测试工作对资源的要求,包括:
       a.设备所用到的设备类型、数量和预定使用时间;
       b.软件列出将被用来支持本项测试过程而本身又并不是被测软件的组成部分的软件,如测试驱动程序、测试监控程序、仿真程序、桩模块等等;
       c.人员列出在测试工作期间预期可由用户和开发任务组提供的工作人员的人数。技术水平及有关的预备知识,包括一些特殊要求,如倒班操作和数据键入人员。
      2.3.3测试资料 
       列出本项测试所需的资料,如:
       a.有关本项任务的文件;
       b.被测试程序及其所在的媒体;
       c.测试的输入和输出举例;
       d.有关控制此项测试的方法、过程的图表。
      2.3.4测试培训
       说明或引用资料说明为被测软件的使用提供培训的计划。规定培训的内容、受训的人员及从事培训的工作人员。
      2.4测试2(标识符)
       用与本测试计划K.2.3条相类似的方式说明用于另一项及其后各项测试内容的测试工作计划。
     3测试设计说明
      3.1测试1(标识符)
       说明对第一项测试内容的测试设计考虑。
      3.1.1控制
       说明本测试的控制方式,如输入是人工、半自动或自动引入、控制操作的顺序以及结果的记录方法。    
      3.1.2输入
       说明本项测试中所使用的输入数据及选择这些输入数据的策略。
      3.1.3输出
       说明预期的输出数据,如测试结果及可能产生的中间结果或运行信息。
      3.1.4过程
       说明完成此项测试的一个个步骤和控制命令,包括测试的准备、初始化、中间步聚和运行结束方式。    
      3.2测试2(标识符)
       用与本测试计划K.3.l条相类似的方式说明第2项及其后各项测试工作的设计考虑。
     4评价准则
      4.1范围
       说明所选择的测试用例能够接查的范围及其局限性。
      4.2数据整理
       陈述为了把测试数据加工成便于评价的适当形式,使得测试结果可以同,已知结果进行比较而要用到的转换处理技术,如手工方式或自动方式;如果是用自动方式整理数据,还要说明为进行处理而要用到的硬件、软件资源。
      4.3尺度
       说明用来判断测试工作是否能通过的评价尺度,如合理的输出结果的类型、测试输出结果与预期输出之间的容许偏离范围、允许中断或停机的最大次数。
Open Toolbar