




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录提 要第一章 绪 论11 研发背景12 开发环境13 相关技术介绍第二章 基于Mailserver性能监视系统建模21 可行性分析22 需求分析23 总体设计231 功能模块设计232 数据库设计第三章 监视器设计31 进程概念的应用311 多进程的引入312 守护进程的实现32 信号量的使用32 共享内存的使用第四章 Mailserver性能信息收集设计41 CPU和内存信息收集的设计42 硬盘和进程信息收集的设计43 网络流量信息收集的设计第五章 Mailserver性能信息采集设计51 CPU和内存信息采集的设计52 硬盘和进程信息采集的设计53 网络流量信息采集的设计第六章 编译、测试及总结61 编译62 测试63 总结摘 要电子邮件是整个互联网行业重要的组成部分。据统计,四分之三以上的用户上网的主要目的是收发邮件,每天有十数亿封电子邮件在全球传递。电子邮件已成为用户不可或缺的需要。用户对电子邮件安全性、可靠性以及功能上的要求也在不断提高。因此,服务供应商必须提供更安全、更可靠、功能更丰富的服务,才能发展业务、吸引用户,从众多竞争者中脱颖而出。为了使邮件服务器架构者能够在服务器投入使用前对服务器性能进行必要的测试,确保系统的性能和可靠性能够满足现有状况和预期情况下的使用,以及服务器运行过程中可以随时了解服务器运行的信息。我们构建本系统来针对邮件服务器性能进行监视,本系统提供了以下几种功能: CPU监视 Memory监视 Disk监视 Network监视 Process监视此外,本系统预留了很好的可扩展性,为以后监视对象的增加提供了更大的便利。系统由用户输入start命令来启动,stop命令来停止系统的运行,为此stop进程必须了解start进程中的一些信息,系统中通过使用共享内存来完成这两个进程间的通信,确保程序的正常退出。为与Linux其他服务相统一,系统中还提供了restart(重新启动监视器)命令。系统要求对五个监视对象进行并发监视,多进程概念的引入恰好完成了该功能。另外当系统运行后,为了不挂起终端,我们必须将程序放在后台执行,系统中通过使用守护进程来完成该任务。下面是本文各章节的一些简要概括: 第一章讲述了本系统的研发背景以及用到的一些技术。 第二章对系统做了一些必要的分析,同时给出系统的用况图和类图。 第三章对本系统的的主体部分进行了详细设计,并针对难点进行了详细的讲解。 第四章分别对以上五种对象的信息收集,包括使用Shell取得相关对象信息、采集我们需要的数据(由第五章描述)以及信息的存储进行了详细设计,并给出了相应的顺序图。 第五章分别对五种对象的信息采集(为信息收集的一部分)进行了详细设计,同时给出各自的顺序图。 第六章讲述了本系统中Makefile文件的编写方法,同时对系统进行了一些必要的测试,并进行了总结。关键词:邮件服务器性能监视,多进程,守护进程,共享内存,信号量,PRO*CAbstract第一章 绪 论11 研发背景111 问题的提出曾经有位IT名人说:“互联网对于他就是电子邮件。”这句话可能是太偏激了一点,但是至少表达出一个重要信息: “电子邮件”是互联时代的一种典型应用。随着信息社会的不断发展,电子邮件已经成为了各个行业和企业对外沟通联系的重要工具。据统计,四分之三以上的用户上网的主要目的是收发邮件,每天有十数亿封电子邮件在全球传递。电子邮件已成为用户不可或缺的需要。用户对电子邮件安全性、可靠性以及功能上的要求在不断提高。因此,服务供应商必须提供更安全、更可靠、功能更丰富的服务,才能发展业务、吸引用户,从众多竞争者中脱颖而出。这就需要邮件服务器系统具有较强的并发处理能力和处理效率,能够724小时稳定运行。因此,有必要在系统投入实际运行前,对邮件服务器系统进行必要的性能测试,确保系统的性能和可靠性能够满足现有状况和预期情况下的使用。另一方面,当邮件服务器投入使用后,邮件服务器搭建者(企业或个人)往往需要与服务器保持不间断的联系,知道服务器任一时间段内运行的相关状况,以便进行必要的改善,使服务器性能得以更好的发挥。本系统便是在这种前提下,针对以上问题设计开发而成,对邮件服务器性能进行监视。管理学第一原理告诉我们:You Cant Manage What You Dont Measure (如果没有测量,就很难管理),著名的通用电气公司GE和麦肯锡都是量化管理的楷模。对邮件服务器的管理也不例外,长期的监测是稳定的服务质量的唯一保障。因此本系统采用对邮件服务器性能进行实时量化方式监视,并将相关数据信息存入数据库,以便用户进行数据查阅与比较。112 为何选择LINUX在历经几十年的电子邮件系统发展后,如今的电子邮件已成为Internet的重要应用服务之一。电子邮件的服务模式与传统邮件传递模式其实是相同的,它也需要有一个邮局邮件服务器,通过邮件服务器来构建用户邮件通信体系的基础框架,搭建邮件应用基础平台,继而全面实现邮件传输、分发、存储、管理等等各个环节的系列功能,最终将电子邮件发送到互联网络中的任何地方。目前,Linux操作系统作为应用最为广泛的开源操作系统,以其特有的稳定性、高可靠性及价格低廉获得了市场及用户的认可和一致赞许。同时,使用Linux作为邮件服务器,可以与Sendmail、MySQL等开源软件共同使用,在满足用户需求的基础上大大降低了用户的购买成本,因此,Linux邮件服务器已被越来越多的厂商和用户选用为运行企业电子邮件系统。据IDC的调查报告显示,Linux服务器的销售将以每年57%的速度增长,Linux邮件服务器的市场也为广大的服务器厂商及用户展现出一片昂然商机。另外,从Linux邮件服务器产品的市场定位来看,其本身就是一款专门针对中、小型企业用户的产品,它的主要用户群集中于中、小型企业、政府机关、教育等对电子邮件应用需求日益迫切、应用规模中等的用户,这批中、小型邮件系统需求的用户群伍正在随着Internet信息技术的快速发展迅速壮大起来。市场上基于Linux操作系统的邮件服务器主要特点如下:为用户提供功能强大、稳定高效的邮件系统;提供系统级、应用级的全方位的优化,运用缓冲技术提高系统访问速度和吞吐量;分布式网络部署方案,提供对超大容量邮件用户的支持;为企业、政府提供的具有安全增强特性的邮件系统,运用多种系统级、应用级安全手段,为企业、政府应用保驾护航;开放的开发接口,方便邮件系统与企业综合应用的集成。在对Linux邮件服务器的产品性能、发展趋势、用户群等等方面进行全面分析评估后,决定把系统构建为针对Linux邮件服务器进行性能采集和监视的软件。12 开发环境121 LINUXLinux的特点如下:1完全免费Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。2完全兼容POSIX 1.0标准这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。3多用户、多任务Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。4良好的界面Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Windows系统,用户可以使用鼠标对其进行操作。在X-Windows环境中就和在Windows中相似,可以说是一个Linux版的Windows。5丰富的网络功能互联网是在Unix的基础上繁荣起来的,Linux的网络功能当然不会逊色。它的网络功能和其内核紧密相连,在这方面Linux要优于其他操作系统。在Linux中,用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW、FTP、E-Mail等服务。6可靠的安全、稳定性能Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。Linux由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上Linux在这方面也十分出色。7支持多种平台Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。1。2。2 VIM与GCCVi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,也就掌握了一项跨平台的利器。从1999年4月开始,GCC的含义从GNU C Compiler变成了GNU Compiler Collection,支持C、C+、Objective C、Chill、Fortan和Java等语言。本系统代码的编写采用编辑器VIM,代码的编译则使用GCC中的C+编译器G+。123 ORACLEOracle 是以高级结构化查询语言(SQL)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客户/服务器(CLIENT/SERVER)体系结构的数据库之一。特点:1、ORACLE7.X以来引入了共享SQL和多线索服务器体系结构。这减少了ORACLE的资源占用,并增强了ORACLE的能力,使之在低档软硬件平台上用较少的资源就可以支持更多的用户,而在高档平台上可以支持成百上千个用户。2、提供了基于角色(ROLE)分工的安全保密管理。在数据库管理功能、完整性检查、安全性、一致性方面都有良好的表现。3、支持大量多媒体数据,如二进制图形、声音、动画以及多维数据结构等。4、提供了与第三代高级语言的接口软件PRO*系列,能在C,C+等主语言中嵌入SQL语句及过程化(PL/SQL)语句,对数据库中的数据进行操纵。加上它有许多优秀的前台开发工具如 POWER BUILD、SQL*FORMS、VISIA BASIC 等,可以快速开发生成基于客户端PC 平台的应用程序,并具有良好的移植性。5、提供了新的分布式数据库能力。可通过网络较方便地读写远端数据库里的数据,并有对称复制的技术。存储结构:1、物理结构:ORACLE数据库在物理上是存储于硬盘的各种文件。它是活动的,可扩充的,随着数据的添加和应用程序的增大而变化。2、逻辑结构:ORACLE数据库在逻辑上是由许多表空间构成。主要分为系统表空间和非系统表空间。非系统表空间内存储着各项应用的数据、索引、程序等相关信息。13 相关技术介绍131 UML面向对象的分析与设计(OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它溶入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。从应用的角度看,当采用面向对象技术设计系统时,首先是描述需求;其次根据需求建立系统的静态模型,以构造系统的结构;第三步是描述系统的行为。其中在第一步与第二步中所建立的模型都是静态的,包括用例图、类图(包含包)、对象图、组件图和配置图等五个图形,是标准建模语言UML的静态建模机制。其中第三步中所建立的模型或者可以执行,或者表示执行时的时序状态或交互关系。它包括状态图、活动图、顺序图和合作图等四个图形,是标准建模语言UML的动态建模机制。因此,标准建模语言UML的主要内容也可以归纳为静态建模机制和动态建模机制两大类。标准建模语言UML的主要特点可以归结为三点:(1)UML统一了Booch、OMT和OOSE等方法中的基本概念。(2)UML还吸取了面向对象技术领域中其他流派的长处,其中也包括非OO方法的影响。UML符号表示考虑了各种方法的图形表示,删掉了大量易引起混乱的、多余的和极少使用的符号,也添加了一些新符号。因此,在UML中汇入了面向对象领域中很多人的思想。这些思想并不是UML的开发者们发明的,而是开发者们依据最优秀的OO方法和丰富的计算机科学实践经验综合提炼而成的。(3)UML在演变过程中还提出了一些新的概念。在UML标准中新加了模板(Stereotypes)、职责(Responsibilities)、扩展机制(Extensibilitymechanisms)、线程(Threads)、过程(Processes)、分布式(Distribution)、并发(Concurrency)、模式(Patterns)、合作(Collaborations)、活动图(Activitydiagram)等新概念,并清晰地区分类型(Type)、类(Class)和实例(Instance)、细化(Refinement)、接口(Interfaces)和组件(Components)等概念。因此可以认为,UML是一种先进实用的标准建模语言,但其中某些概念尚待实践来验证,UML也必然存在一个进化过程。UML的目标是以面向对象图的方式来描述任何类型的系统,具有很宽的应用领域。其中最常用的是建立软件系统的模型,但它同样可以用于描述非软件领域的系统,如机械系统、企业机构或业务过程,以及处理复杂数据的信息系统、具有实时要求的工业系统或工业过程等。总之,UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模。 此外,UML适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段。在需求分析阶段,可以用用例来捕获用户需求。通过用例建模,描述对系统感兴趣的外部角色及其对系统(用例)的功能要求。分析阶段主要关心问题域中的主要概念(如抽象、类和对象等)和机制,需要识别这些类以及它们相互间的关系,并用UML类图来描述。为实现用例,类之间需要协作,这可以用UML动态模型来描述。在分析阶段,只对问题域的对象(现实世界的概念)建模,而不考虑定义软件系统中技术细节的类(如处理用户接口、数据库、通讯和并行性等问题的类)。这些技术细节将在设计阶段引入,因此设计阶段为构造阶段提供更详细的规格说明。编程(构造)是一个独立的阶段,其任务是用面向对象编程语言将来自设计阶段的类转换成实际的代码。在用UML建立分析和设计模型时,应尽量避免考虑把模型转换成某种特定的编程语言。因为在早期阶段,模型仅仅是理解和分析系统结构的工具,过早考虑编码问题十分不利于建立简单正确的模型。UML模型还可作为测试阶段的依据。系统通常需要经过单元测试、集成测试、系统测试和验收测试。不同的测试小组使用不同的UML图作为测试依据:单元测试使用类图和类规格说明;集成测试使用部件图和合作图;系统测试使用用例图来验证系统的行为;验收测试由用户进行,以验证系统测试的结果是否满足在分析阶段确定的需求。总之,标准建模语言UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。132 Shell坚果的壳保护其内部的核,同样一个UNIX shell提供一个外设的保护层。当你启动一台基于UNIX的计算机时,UNIX的程序被调入计算机的内存里,直到你关机。这个程序叫做内核(kernel),它执行许多底级和系统级的工作。内核有责任解释基本指令并将其送到处理器。内核也负责运行和调度进程,以及执行所有的输入输出。内核是UNIX系统的心脏,内核有且只有一个。内核指令具有复杂和高技术性。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳(shell)。用户向shell提出请求,shell解释并将请求传给内核。shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell 程序设计语言支持在高级语言里所能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。 在Linux 和 UNIX系统里可以使用多种不同的shell可以使用。最常用的几种是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三种shell 都有它们的优点和缺点。Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 并且在每种 UNIX 上都可以使用。Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。 C shell 由 Bill Joy 所写,它更多的考虑了用户界面的友好性。它支持象命令补齐(command-line completion)等一些 Bourne shell 所不支持的特性。普遍认为C shell 的编程接口做的不如 Bourne shell, 但 C shell 被很多 C 程序员使用因为 C shell的语法和 C语言的很相似,这也是C shell名称的由来。 Korn shell (ksh) 由 Dave Korn 所写。它集合了C shell 和 Bourne shell 的优点并且和 Bourne shell 完全兼容。 除了这些 shell 以外,许多其他的 shell 程序吸收了这些原来的 shell 程序的优点而成为新的 shell 。在 Linux 上常见的有 tcsh (csh 的扩展),Bourne Again shell(bash, sh 的扩展), 和Public Domain Korn shell (pdksh, ksh 的扩展)。bash 是大多数Linux 系统的缺省 shell。本系统对邮件服务器性能信息的采集便是使用的bash。133 C+C+是一种现代的高级编程语言。逻辑上,它是从C语言的基础上来发展起来的。是C的超集,与C是兼容的,所以以前开发的C应用程序在C+中都能使用。而C+又发展了高层抽象机制,集成了现代的面向对象的编程技术(OOP或者OO ),使它变成了具有现代意义的编程语言。在计算机编程领域,有一个主题是代码重用,指的是把原有的代码从库中取出来用于新的程序中,OOP可以轻松做到这点,从而使得C+程序的编写变得快捷、划算。在OOP型的语言中,数据和行为被模块化一个类(class)中,其中行为能够通过继承被拷贝到子类中,并可以通过叫做多态的过程被子类改变。只要有合适的编译器,C+几乎能够在任何类型的计算机上编写任何类型的应用程序。一个优秀的C+程序是一个独立的实体,它能把运行它的计算机潜力发挥出来。程序员可以利用C+对机器的底层操作实行控制,从而进行更有弹性的、更高速度的操作。C+与Java语言不一样,Java依靠称为解释器的软件完成与一些计算机的兼容。在机器层次,Java付出了降速和僵硬(没弹性)的代价。134 PRO*C/C+在ORACLE数据库管理和系统中,有三种访问数据库的方法:(1)用SQL*Plus,它有SQL命令以交互的应用程序访问数据库;(2)用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,SQL*Reportwriter,SQL*Menu等;(3)利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。Pro*C/C+就属于第三种开发工具之一,它把过程化语言C和非过程化语言SQL最完善地结合起来,具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言,利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行,还可以实现事务的提交和回滚。 在Pro*C程序中还可以嵌入PL/SQL块,以改进应用程序的性能,特别是在网络环境下,可以减少网络传输和处理的总开销。135 LINUX多进程程序设计由于UNIX系统是分时多用户系统,CPU按时间片分配给各个用户使用,而在实质上应该说CPU按时间片分配给各个进程使用,每个进程都有自己的运行环境以使得在CPU做进程切换时不会忘记该进程已计算了一半的半成品。以DOS的概念来说,进程的切换都是一次DOS中断处理过程,包括三个层次:(1)用户数据的保存:包括正文段(TEXT),数据段(DATA,BSS),栈段(STACK),共享内存段(SHAREDMEMORY)的保存。(2)寄存器数据的保存:包括PC(programcounter,指向下一条要执行的指令的地址),PSW(processorstatusword,处理机状态字),SP(stack pointer,栈指针),PCBP(pointerofprocesscontrolblock,进程控制块指针),FP(framepointer,指向栈中一个函数的local变量的首地址),AP(augumentpointer,指向栈中函数调用的实参位置),ISP(interruptstackpointer,中断栈指针),以及其他的通用寄存器等。(3)系统层次的保存:包括proc,u,虚拟存储空间管理表格,中断处理栈.以便于该进程再一次得到CPU时间片时能正常运行下去。既然系统已经处理好所有这些中断处理的过程,程序中尽可以使用系统提供的多进程的特点,让几个程序精诚合作,简单而又高效地进行编程。另外,UNIX系统本身也是用C语言写的多进程程序,多进程编程是UNIX的特点。多进程程序的一些突出的特点如下:1.并行化一件复杂的事件是可以分解成若干个简单事件来解决的,首先将问题分解成一个个小问题,将小问题再细分,最后在一个合适的规模上做成一个函数。在软件工程中也是如此。一些小问题的计算是可以互不干扰的,可以同时处理,而在关键点则需要统一在一个地方来处理,这样程序的运行就是并行的,至少从人的时间观念上来说是这样的。而每个小问题的计算又是较简单的。2.简单有序这样的程序对程序员来说不亚于管理一班人,程序员为每个进程设计好相应的功能,并通过一定的通讯机制将它们有机地结合在一起,对每个进程的设计是简单的,只在总控部分小心应付,就可完成整个程序的施工。3.互不干扰这个特点是操作系统的特点,各个进程是独立的,不会串位。4.事务化比如在一个数据电话查询系统中,将程序设计成一个进程只处理一次查询即可,即完成一个事务。当电话查询开始时,产生这样一个进程对付这次查询;另一个电话进来时,主控程序又产生一个这样的进程对付,每个进程完成查询任务后消失。这样只要做一次查询的程序就可以了.136 守护进程守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程最重要的特性是后台运行,在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。1。3。7 共享内存和信号量“共享内存(shared memory)”可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据1:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号灯有以下两种类型: 二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。 计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。第二章 基于Mailserver性能监视系统建模21 可行性分析可行性分析(Feasibility Analysis)也称为可行性研究,是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会等各方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。对于系统的实用性与经济性,我们在11节已经进行了充分的说明;另外,由于很多情况下用户不可能经常对邮件服务器进行本地操作,因此系统允许用户远程取得邮件服务器运行状况信息,并存入到用户所在地数据库以方便用户直接查看,大大增强系统的实用性。系统中选择对影响邮件服务器性能的五个最关键因素进行监测:CPU,内存,硬盘,系统进程,网络流量。并提供较好的可扩展性,以方便日后监测对象的增加。bash(Bourne Again shell)是绝大多数Linux操作系统的缺省shell,因此系统中使用bash对邮件服务器性能进行采集,以增强系统的可移植性;面向对象的软件开发和软件复用之间的关系是相辅相成的。一方面,OO方法的基本概念、原则与技术提供了实现软件复用的有利条件;另一方面,软件复用技术也对面向对象的软件开发提供了有力的支持,C+是一种高弹性、高速度的面向对象编程语言,程序主体部分的编写使用C+,增强系统运行效率的同时也大大提高系统的可复用性;Oracle数据库功能的强大及其诸多优点使其成为当今最流行的C/S体系结构的数据库,因此系统中对数据的存储使用Oracle作为数据库,程序中使用PRO*C/C+对数据库进行操作,以增强程序的可读性。由于各个采集对象要有自己的时间间隔,因此系统中使用多进程(对每个对象的监测都建立一个子进程),互不干扰;而对于用户,想结束对某个对象的监视,只须结束该对象所对应的进程即可。程序运行后为了不独占终端,将其放入后台执行;程序运行后使用共享内存存储其相关信息,以便与程序终止进程之间进行通信。从以上分析可见,该系统的构建是完全可行的。22 需求分析软件的需求分析必须要有对原业务的一个深入了解、提取、抽象、升华的过程,管理软件需求分析尤其如此。软件的需求分析是从用户的业务中提取出软件系统能够帮助用户解决的业务问题,通过对用户业务问题的分析,规划出我们的软件产品。这个步骤是对用户业务需求的一个升华,是一个把用户业务管理流程优化,转化为软件产品,从而提升管理而实现的质的飞跃,这一步是否成功,直接关系到开发出来的软件产品能否得到用户认可,顺利交付给客户,客户能否真正运用我们的产品帮助他解决业务或管理问题。本系统为邮件服务器性能监视系统,主要负责对邮件服务器性能进行定期采集并存储到数据库中以便使用者进行查询和使用,因此应具备如下功能:1 系统进行数据库连接。2 系统自动定期从LINUX邮件服务器采集性能信息,包括CPU、内存、硬盘、系统当前进程以及网络流量等的相关信息,要求对五种信息的采集有各自不同的时间间隔,其中CPU、内存和网络流量信息采集时间间隔为15秒,进程信息采集时间间隔为1分钟,硬盘信息采集时间间隔为30分钟。3 采集信息后,通过过滤和计算取得需要的数据信息。4 将得到的数据信息保存到先前连接的数据库中。经过以上分析后,得出系统用况图,如图2-1。图2-1(用况图)23 总体设计231 功能模块设计程序中使用shell来取得邮件服务器中各部件的相关性能信息,然而这些信息当中有很多是我们所不需要的或者必须经过计算才可以使用的,为了得到有用的信息,我们需要先将取得的所有信息通过重定向导出到本地文件中,然后按照各自的要求从文件中取得信息,并进行相应转换和计算,最终生成用户需要的数据。系统中监视对象的监视时间以及使用的模块如表2-1所示,具体监视信息以及使用的相应模块中的函数如表2-2所示。监视对象测试间隔监视时间采集模块收集模块CPU15秒15秒CPUInfoCPUOra内存15秒15秒MemInfoMemOra硬盘30分钟瞬时DiskInfoDiskOra进程1分钟瞬时PsInfoPsOra网络流量15秒15秒PackInfoPackOra表2-1监视对象监视信息采集函数收集函数CPU系统使用率sysCPUInfocpuTrans用户使用率usrCPUInfo内存空闲数量freeMemInfomemTrans使用数量usedMemInfo硬盘空闲数量freeDiskInfodiskTrans使用数量usedDiskInfo进程进程号psPIDpsTrans进程名字psCMD网络流量发送包的总量outPackAllpackTrans成功发送的数量outPackOK接收包的总量inPackAll成功接收的数量inPackOK表2-2下面来设计系统中使用的各个功能模块的作用,同时确定其成员函数:u Monitor:邮件服务器的性能监视系统的启动由Monitor类中的startMonitor函数来完成,而程序的终止则有函数stopMonitor来完成,initDeamon为守护进程,负责将系统放在后台运行,以免独占终端,transaction为startMonitor的一部分,负责并发运行对各个对象的性能监视。u Oracle:在我们对数据库服务器进行数据存储之前,必须先确保已经连接到数据库服务器,而在程序终止时,应该主动与数据库断开连接,与数据库的连接与断开分别由connect函数和disconnect函数来完成。u 信息收集:该模块包含五个类:CPUOra、MemOra、DiskOra、PsOra、PackOra。具体功能已经在表2-1和表2-2中给出。这些类被Monitor所使用,因此他们之间的关系为单向关联关系。u 信息采集:此模块为信息收集模块的一部分,是“has-a”关系,因此与信息收集模块之间的关系为聚合关系。我们之所以将信息采集部分与收集部分由不同的类来实现,主要是考虑信息收集部分中使用PRO*C对Oracle数据库进行操作,因此必须经过预编译后才能与其他模块一起使用,我们应该尽量减小预编译文件中代码的长度,从而降低系统开销。该模块同样包含五个类:CPUInfo、MemInfo、DiskInfo、PsInfo、PackInfo,分别与信息收集模块中各类相对应。硬盘信息和网络流量信息在采集数据后还需要额外的计算,这部分内容分别放到各自类中,由getTotalVal函数来完成u SingleInfo:由于CPU、内存信息均为单条确定信息,为了减少代码量、提高代码的复用率,我们将CPU和内存信息采集共通部分的采集由getInfo函数来完成。u MoreInfo:对于硬盘信息的采集,由于其分区的不确定性,硬盘信息采集必须取得所有分区的使用状况,并通过计算取得最终数据,系统当前运行进程的数量同样具有不确定性,因此我们把不确定信息采集方法抽象出来,由getMultiLineInfo函数来实现。网络流量信息采集需要计算发送包的总量和接收包的总量,因此无论对于包的发送还是接收都要求取得成功的数量、错误的数量、丢弃的数量和忽略的数量,这些信息的采集由getMultiColInfo函数来实现。这些信息都保存在一个向量(_value_vector)中,供外界使用。u Information:在仔细考虑SingleInfo和MultiInfo两个类后,发现两个类中有很多公共的东西,因此将其公共部分抽象为一个基类Information,come_to_line函数使当前文件指针到达具体某一行的开头(文件指针和要达到的行数均由参数给定),而come_to_string函数使这个文件指针达到它当前所在行的某个字符串,也可以说是具体某一列(文件指针和要达到的列数同样由参数设定),saveVal函数通过调用come_to_line和come_to_string函数来完成将当前文件指针所指文件中的某一行上的某个字符串(由参数设定)保存在成员变量_value中,以供子类使用。u CurTime:每一个性能收集模块都需要记录每次监视的开始时间,以便日后查询,时间的取得由getTime函数来完成,因其不受具体对象的影响,故将其设计为static。u Semophore:由于系统在对每个对象的信息采集结束后,要将数据插入数据库,而系统五种对象的操作是并发执行的,这就难免在对数据库操作时产生冲突,为了避免冲突的产生,系统引入信号量,信号量的创建、删除、申请、释放分别由的createSem、deleteSem、request、release四个函数来完成。经过以上分析后,得出系统的类图,如图2-2所示。图2-2(类图)232 数据库设计当我们取得数据后必须将值保存在数据库中,在数据库中各种信息保存表格的格式设计是我们这一小节所要完成的任务。对于各个对象的具体监视信息,我们在上一小节已经介绍过(如表2-2),这些信息都是我们应该保存的,除此之外,我们还应该记录测试开始时间,而对于CPU、内存、网络流量等需要采集某段时间内信息的对象,还应该记录一次测试的持续时间。由此我们得到以下各表:表项startTime(date)testTime(s)sysCPUInfo(%)usrCPUInfo(%)类型datenumber(3)numeric(5,2)numeric(5,2)表2-3(CPUINFO表)表项startTime(date)testTime(s)freeMemInfo(kb)usedMemInfo(kb)类型datenumber(3)number(8)number(8)表2-4(MEMINFO表)表项testTime(date)freeDiskVal(kb)usedDiskVal(kb)类型datenumber(10)number(10)表2-5(DISKINFO表)表项testTime(date)commandProcessID类型datevarchar2(20)varchar2(8)表2-6(PSINFO表)表项startTime(date)testTime(s)inPackAll(num)outPackAll(num)inPackOK(num)outPackOK(num)类型datenumber(3)number(10)number(10)number(10)number(10)表2-7(PACKINFO表)第三章 监视器详细设计本章主要讲解一下监视器的启动以及终止部分的详细设计,为了与LINUX下其他服务相统一,系统中允许用户发出三种信号:start、stop、restart。当用户发出start信号时,程序开始运行,stop信号则停止程序的运行,restart重新启动监视器。顺序图分别如图3-1和图3-2所示。信息的收集工作放在下一章来详细讲解,下面将针对系统主体部分的一些难点进行讲解。31 进程概念的应用311 多进程的引入系统中要对CPU、内存、硬盘、进程、网络流量等信息进行采集和收集,如果我们指定一个进程来顺序执行对所有对象的监视,由于各个对象均有其各自的信息采集时间间隔,这就意味着一个对象的信息采集工作必须要等待它上一个对象采集工作完成之后才可以进行,这给多个对象信息监视带来了很大的不方便;而且我们希望在我们的系统中,各自的监视时间可以由调用者指定,以增强系统的灵活性;为此我们必须让每个对象的监视之间互不干扰,这就要求对每个对象的操作应该是并发进行的。另外对于用户,有可能只想了解对某个对象的监视工作,这就要求我们的系统必须将这些对象的监视工作分离开来,用户可以查看到每个对象监视工作的运行情况,也可以选择终止该监视。为了满足以上要求,系统中引入多进程概念,我们在第一章已经介绍了多进程的概念,下面针对本系统说一下如何使用多进程。Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。“代码段”,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间。这其中有许多细节问题,这里限于篇幅就不多介绍了。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据段。在Linux下产生新的进程的系统调用就是fork函数,这个函数名是英文中“分叉”的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了,所以这个名字取得很形象。一个程序一旦调用fork函数,系统就为一个新的进程准备了前述三个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。而如果两个进程要共享什么数据的话,可以使用共享内存(我们在下一节来介绍)来操作。现在,已经是两个进程了,对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零,这样,对于程序,只要判断fork函数的返回值,就知道自己是处于父进程还是子进程中。在我们的程序当中,需要建立五个子进程,并在每个子进程中无终止地运行相应对象的监视,直到用户决定停止该子进程;而父进程在创建完子进程后必须等待所有这些子进程的执行,一方面防止子进程成为僵尸进程(zombie),另一方面在所有子进程都结束后才可以与数据库断开连接,父进程等待子进程通过使用waitpid函数来实现。312 守护进程的实现本系统为邮件服务器性能监视系统,因此当用户运行后,系统会无终止的运行下去,直到用户决定停止检测为止,为了使本系统运行后不独占终端,我们引入守护进程来完成此功能,实现方法如下:1 在后台运行:为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。if(pid=fork() exit(0);/是父进程,结束父进程,子进程继续2 脱离控制终端,登录会话和进程组:先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长。当进程是会话组长时s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行网点春游活动方案
- 过期妊娠考试题及答案
- 广告手绘考试题及答案
- 骨科职称考试题及答案
- 古典剧目考试题及答案
- 公需考试题及答案
- 工地厨师考试题及答案
- 改良员考试题及答案
- 时间的价值议论文话题5篇
- 防疫保安考试题及答案
- 煤矿安全规程2025版解读
- 尿培养的采集
- 具有法律效应的还款协议书6篇
- 东航空乘英语考试题目及答案
- 2025年全国企业员工全面质量管理知识竞赛题及参考答案
- 2025年广东省中考英语试卷深度评析及2026年备考策略
- 2025-2026秋中小学升旗仪式演讲稿:(第3周)积跬步养习惯向未来
- 绿色建筑和绿色建筑材料
- 《七堂保险金信托课》读书笔记思维导图
- Jade6操作和应用优秀课件
- 渐开线花键强度校核(完整计算)
评论
0/150
提交评论