十个免费的 Web 压力测试工具

本文列举了是十个免费工具,可以用来进行Web的负载/压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性能。

0. Grinder–  Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。 支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的 主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本 化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。

1. Pylot-Pylot 是一款开源的测试web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视test suites。

2. Web Capacity Analysis Tool (WCAT)– 这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚本 HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户 端又可以产生多个虚拟客户端(最大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使用 SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确的 GET 或 POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存。

3. fwptt– fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net, jsp, php 或是其它的Web应用。

4. JCrawler– JCrawler是一个开源(CPL) 的WEB应用压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一 种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下, 将自动提交Sitemap给前5名的搜索引擎!

5. Apache JMeter– Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以 支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情 况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据 显示,测试同步及测试的创建和执行。

6. Siege-Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每 个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 Siege 支持基本的认证,cookies, HTTP 和 HTTPS 协议。

7. http_load– http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。

8. Web Polygraph– Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具。

9. OpenSTA– OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行性能测试。例如虚拟多个不同的用户同时登陆被测试网 站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化 测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过 proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析。

欢迎您留下你认为不错的WEB应用性能测试的工具。

英文原文:10 Free Tools to Load/Stress Test Your Web Applications

CentOS下为Web网站性能做测试

Webbench是知名的网站压力方面的测试工具,它是由Lionbridge公司开发。

官方主页:http://home.tiscali.cz/~cz210552/webbench.html

在运维工作中,网站压力及性能测试是一项很重要的工作。比如在一个网站上线之前,能承受多大访问量、在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验。但是,在压力及性能测试中存在一个共性,那就是压力及性能测试的结果与实际负载结果不会完全相同,就算压力及性能测试工作做的再好,也不能保证100%和线上性能指标相同。面对这些问题,我们只能尽量去想方设法去模拟。所以,压力及性能测试非常有必要,有了这些数据,我们就能对自己做维护的平台做到心中有数。

Web Bench最多可以模拟3万个并发连接去测试网站的负载能力。Web Bench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。Web Bech的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。Web Bench不但能具有静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。

适用于linux操作系统

1、WebBench安装:

  1. cd /usr/local/src 
  2. wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz 
  3. tar zxvf webbench1.5.tar.gz 
  4. cd webbench1.5 
  5. make 
  6. make install 

补充:安装过程中如提示缺少组件请安装,缺少目录,请手动创建。

常见错误:

cc -Wall -ggdb -W -O -c -o webbench.o webbench.c

webbench.c: In function ‘alarm_handler’:

webbench.c:77: warning: unused parameter ’signal’

cc -Wall -ggdb -W -O -o webbench webbench.o

ctags *.c

/bin/sh: ctags: command not found

make: [tags] Error 127 (ignored)

centos有相应的组件,搜索一下ctags安装即可

  1. # yum install ctags 

2、WebBench使用:

  1. #webbench -c 1000 -t 60 http://test.cn/info.php 
  2. webbench c 并发数 t 运行测试时间  URL 

3、测试结果示例:

  1. #webbench -c 600 -t 30 http://test.cn/index.php 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://test.cn/index.php 
  6. 600 clients, running 30 sec. 
  7.  
  8. Speed=12082 pages/min, 152635 bytes/sec. 
  9. Requests: 6041 susceed, 0 failed. 
  10.  
  11. ————————————————————————————- 
  12.  
  13. #webbench -c 1000 -t 60 http://test.cn/index.php 
  14. Webbench Simple Web Benchmark 1.5 
  15. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  16.  
  17. Benchmarking: GET http://test.cn/index.php 
  18. 1000 clients, running 60 sec. 
  19.  
  20. Speed=5553 pages/min, 70152 bytes/sec. 
  21. Requests: 5553 susceed, 0 failed. 

每秒钟响应请求数:24525/60= X pages/sec,每秒钟传输数据量20794612 bytes/sec.

  1. # webbench -c 2000 -t 60 http://test.cn/index.php 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://test.cn/index.php 
  6. 2000 clients, running 60 sec. 
  7.  
  8. Speed=10479 pages/min, 132043 bytes/sec. 
  9. Requests: 10453 susceed, 26 failed. 

当并发2000时,已经显示有26个连接failed了,说明超负荷了。

补充:

  • 压力及性能测试工作应该放到产品上线之前,而不是上线以后;
  • 测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开页面是否流畅,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少;
  • 更详细的进行某个页面测试,如电商网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

备注:webbench 做压力及性能测试时,该软件自身也会消耗CPU和内存资源,为了测试准确,建议将 webbench安装在其他的服务器上,已达到测试数据更加精确。

CentOS服务器的性能分析与优化

作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但硬件问题、软件问题、网络环境等的复杂性和多变性,导致了对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能优化的一大难题。 本文从系统入手,重点讲述由于系统软、硬件配置不当造成的性能问题,并且给出了检测系统故障和优化性能的一般方法和流程。

一、 系统性能分析的目的

1.1 找到系统性能的瓶颈

系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个Web服务,经常出现网页无法打开、打开速度慢等现象。遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。操作系统完成一个任务是与系统自身设置、网络拓朴结构、路由设备、路由策略、接入设备、物理线路等多个方面都密切相关的,任何一个环节出现问题,都会影响整个系统的性能。因此,当Linux应用出现问题时,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在哪个部分,然后集中解决。

1.2 提供性能优化方案

查找系统性能瓶颈是个复杂而耗时的过程,需要在应用程序、操作系统、服务器硬件、网络环境等方面进行查找和定位,影响性能最大的是应用程序和操作系统两个方面,因为这两个方面出现的问题不易察觉,隐蔽性很强。而硬件、网络方面出现的问题,一般都能马上定位。一旦找到了系统性能问题,解决起来就非常迅速和容易,例如发现系统硬件存在问题,如果是物理故障,那么更换硬件就可以了,如果是硬件性能不能满足需求,升级硬件就可以了;如果发现是网络问题,比如带宽不够、网络不稳定,只需优化和升级网络即可;如果发现是应用程序问题,修改或优化软件系统即可;而如果是操作系统配置问题,修改系统参数、修改系统配置即可。

可见,只要找到了性能瓶颈,就可以提供性能优化方案,有标准、有目的地进行系统优化。

1.3 使系统硬件和软件资源的使用达到平衡

Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下由无数的开源软件支撑,常见的有Apache、Tomcat、MySQL、PHP等。开源软件的最大理念是自由、开放,那么Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用性能的最优化。但是,系统的性能问题并非是孤立的,解决了一个性能瓶颈,可能会出现另一个性能瓶颈,所以说性能优化的最终目的是:在一定范围内使系统的各项资源使用趋于合理并保持一定的平衡,即系统运行良好的时候恰恰就是系统资源达到了一个平衡状态的时候。而在操作系统中,任何一项资源的过度使用都会破坏这种平衡状态,从而导致系统响应缓慢或者负载过高。例如,CPU资源的过度使用会造成系统中出现大量的等待进程,导致应用程序响应缓慢,而进程的大量增加又会导致系统内存资源的增加,当物理内存耗尽时,系统就会使用虚拟内存,而虚拟内存的使用又会造成磁盘I/O的增加并加大CPU的开销。因此,系统性能的优化就是在硬件、操作系统、应用软件之间找到一个平衡点。

二、 分析系统性能涉及的人员

2.1        Linux系统管理人员

在做性能优化过程中,系统管理人员承担着很重要的任务,首先,系统管理人员要了解和掌握操作系统的当前运行状态,例如系统负载、内存状态、进程状态、CPU负荷等信息,这些信息是检测和判断系统性能的基础和依据;其次,系统管理人员还有掌握系统的硬件信息,例如磁盘I/O、CPU型号、内存大小、网卡带宽等参数信息,然后根据这些信息综合评估系统资源的使用情况;第三,作为一名系统管理人员,还要掌握应用程序对系统资源的使用情况,更深入的一点就是要了解应用程序的运行效率,例如是否有程序BUG、内存溢出等问题,通过对系统资源的监控,就能发现应用程序是否存在异常,如果确实是应用程序存在问题,需要把问题立刻反映给程序开发人员,进而改进或升级程序。

性能优化本身就是一个复杂和繁琐的过程,系统管理人员只有了解了系统硬件信息、网络信息、操作系统配置信息和应用程序信息才能有针对性地的展开对服务器性能优化,这就要求系统管理员有充足的理论知识、丰富的实战经验以及缜密分析问题的头脑。

2.2        系统架构设计人员

系统性能优化涉及的第二类人员就是应用程序的架构设计人员。如果系统管理人员在经过综合判断后,发现影响性能的是应用程序的执行效率,那么程序架构设计人员就要及时介入,深入了解程序运行状态。首先,系统架构设计人员要跟踪了解程序的执行效率,如果执行效率存在问题,要找出哪里出现了问题;其次,如果真的是架构设计出现了问题,那么就要马上优化或改进系统架构,设计更好的应用系统架构。

2.3        软件开发人员

系统性能优化最后一个环节涉及的是程序开发人员,在系统管理员或架构设计人员找到程序或结构瓶颈后,程序开发人员要马上介入进行相应的程序修改。修改程序要以程序的执行效率为基准,改进程序的逻辑,有针对性地进行代码优化。例如,系统管理人员在系统中发现有条SQL语句耗费大量的系统资源,抓取这条执行的SQL语句,发现此SQL语句的执行效率太差,是开发人员编写的代码执行效率低造成的,这就需要把这个信息反馈给开发人员,开发人员在收到这个问题后,可以有针对性的进行SQL优化,进而实现程序代码的优化。

从上面这个过程可以看出,系统性能优化一般遵循的流程是:首先系统管理人员查看系统的整体状况,主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码五个方面进行综合判断,如果发现是系统硬件、网络设备或者操作系统配置问题,系统管理员可以根据情况自主解决;如果发现是程序结构问题,就需要提交给程序架构设计人员;如果发现是程序代码执行问题,就交给开发人员进行代码优化。这样就完成了一个系统性能优化的过程。

三、影响Linux性能的各种因素

3.1 系统硬件资源

1.CPU

CPU是操作系统稳定运行的根本,CPU的速度与性能在很大程度上决定了系统整体的性能,因此,CPU数量越多、主频越高,服务器性能也就相对越好。但事实并非完全如此。

目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。在Linux系统下,只有运行SMP内核才能支持超线程,但是,安装的CPU数量越多,从超线程获得的性能方面的提高就越少。另外,Linux内核会把多核的处理器当作多个单独的CPU来识别,例如两个4核的CPU,在Lnux系统下会被当作8个单核CPU。但是从性能角度来讲,两个4核的CPU和8个单核的CPU并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。

可能出现CPU瓶颈的应用有邮件服务器、动态Web服务器等,对于这类应用,要把CPU的配置和性能放在主要位置。

2.内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费,例如,在一个32位处理器的Linux操作系统上,超过8GB的物理内存都将被浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。

由于处理器寻址范围的限制,在32位Linux操作系统上,应用程序单个进程最大只能使用2GB的内存,这样以来,即使系统有更大的内存,应用程序也无法“享”用,解决的办法就是使用64位处理器,安装64位操作系统。在64位操作系统下,可以满足所有应用程序对内存的使用需求 ,几乎没有限制。

可能出现内存性能瓶颈的应用有打印服务器、数据库服务器、静态Web服务器等,对于这类应用要把内存大小放在主要位置。

3.磁盘I/O性能

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。

RAID的英文全称为:Redundant Array of Independent Disk,即独立磁盘冗余阵列,简称磁盘阵列。RAID通过将多块独立的磁盘(物理硬盘)按不同方式组合起来形成一个磁盘组(逻辑硬盘),从而提供比单个硬盘更高的I/O性能和数据冗余。

通过RAID技术组成的磁盘组,就相当于一个大硬盘,用户可以对它进行分区格式化、建立文件系统等操作,跟单个物理硬盘一模一样,唯一不同的是RAID磁盘组的I/O性能比单个硬盘要高很多,同时在数据的安全性也有很大提升。

根据磁盘组合方式的不同,RAID可以分为RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等级别,常用的RAID级别有RAID0、RAID1、RAID5、RAID0+1,这里进行简单介绍。

RAID 0:通过把多块硬盘粘合成一个容量更大的硬盘组,提高了磁盘的性能和吞吐量。这种方式成本低,要求至少两个磁盘,但是没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中。

RAID 1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合。

RAID5:采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,RAID5读出效率很高,写入效率一般,至少需要3块盘。允许一块磁盘故障,而不影响数据的可用性。

RAID0+1:把RAID0和RAID1技术结合起来就成了RAID0+1,至少需要4个硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。

通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,从而保证应用程序在磁盘方面达到最优性能。

4.网络宽带

Linux下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。

3.2 操作系统相关资源

基于操作系统的性能优化也是多方面的,可以从系统安装、系统内核参数、网络参数、文件系统等几个方面进行衡量,下面依次进行简单介绍。

1.系统安装优化

系统优化可以从安装操作系统开始,当安装Linux系统时,磁盘的划分,SWAP内存的分配都直接影响以后系统的运行性能,例如,磁盘分配可以遵循应用的需求:对于对写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成RAID 0;而对于对数据安全性较高,对读写没有特别要求的应用,可以把磁盘做成RAID 1;对于对读操作要求较高,而对写操作无特殊要求,并要保证数据安全性的应用,可以选择RAID 5;对于对读写要求都很高,并且对数据安全性要求也很高的应用,可以选择RAID 01。这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。

随着内存价格的降低和内存容量的日益增大,对虚拟内存SWAP的设定,现在已经没有了所谓虚拟内存是物理内存两倍的要求,但是SWAP的设定还是不能忽略,根据经验,如果内存较小(物理内存小于4GB),一般设置SWAP交换分区大小为内存的2倍;如果物理内存大于4GB小于16GB,可以设置SWAP大小等于或略小于物理内存即可;如果内存大小在16GB以上,原则上可以设置SWAP为0,但并不建议这么做,因为设置一定大小的SWAP还是有一定作用的。

2.内核参数优化

系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。例如,如果系统部署的是Oracle数据库应用,那么就需要对系统共享内存段(kernel.shmmax、kernel.shmmni、kernel.shmall)、系统信号量(kernel.sem)、文件句柄(fs.file-max)等参数进行优化设置;如果部署的是Web应用,那么就需要根据Web应用特性进行网络参数的优化,例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数。

3.文件系统优化

文件系统的优化也是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、xfs、ReiserFS,根据不同的应用,选择不同的文件系统。

Linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说,ext2是Linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext3,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。

XFS文件系统是SGI开发的一个高级日志文件系统,后来移植到了Linux系统下,XFS通过分布处理磁盘请求、定位数据、保持Cache 的一致性来提供对文件系统数据的低延迟、高带宽的访问,因此,XFS极具伸缩性,非常健壮,具有优秀的日志记录功能、可扩展性强、快速写入性能等优点。

ReiserFS是在Hans Reiser领导下开发出来的一款高性能的日志文件系统,它通过完全平衡树结构来管理数据, 包括文件数据,文件名及日志支持等,与ext2/ext3相比,最大的优点是访问性能和安全性大幅提升。ReiserFS具有高效、合理利用磁盘空间,先进的日志管理机制,特有的搜寻方式,海量磁盘存储等优点。

3.3 应用程序软件资源

应用程序的优化其实是整个优化工程的核心,如果一个应用程序存在BUG,那么即使所有其他方面都达到了最优状态,整个应用系统还是性能低下,所以,对应用程序的优化是性能优化过程的重中之重,这就对程序架构设计人员和程序开发人员提出了更高的要求。

一、几种典型应用对系统资源使用的特点

1.1 以静态内容为主的Web应用

这类应用的一个主要特点是小文件居多,并且读操作频繁,Web服务器一般为Apache或Nginx,因为这两个HTTP服务器对静态资源的处理非常迅速和高效。在Web访问量不大时,可以直接对外提供服务,但是在有很大并发请求时,单一的Web服务无法支撑大量的客户端访问,此时就需要由多台Web服务器组成的负载集群系统。为了实现更高效的访问,在最前端还可以搭建Cache服务器,也就是将静态资源文件缓存到操作系统内存中直接进行读操作,因为直接从内存读取数据要比从硬盘读数据效率高很多,所以在Web前端搭建Cache服务器可以大大提高并发访问性能。常用的Cache软件有Squid、Varinsh等。

Cache服务器虽然可以提高访问性能,但要求服务器有很大的内存,当系统内存充足时,可以缓解磁盘随机读的压力;当内存过小或者内存不足时,系统就会使用虚拟内存,而虚拟内存的使用会引起磁盘I/O的增大,当磁盘I/O增大时,CPU的开销也随之增加。

在高并发访问时,还存在另外一个问题,就是网络带宽瓶颈,如果客户端访问量很大且带宽不够,就会阻塞网络,影响访问,因此,在构建基于Web的网络应用时,网络带宽也是必须考虑的一个因素。

1.2 以动态内容为主的Web应用

这类应用的一个特点是频繁地执行写操作,例如Java、PHP、Perl、CGI等,会导致CPU资源消耗严重。因为动态程序的执行要进行编译、读取数据库等操作,而这些操作都会消耗CPU资源,因此,一个基于动态程序的Web应用,应该选择多个性能较高的CPU,这将对系统整体性能的提高有很大帮助。

基于动态内容的Web应用在高并发访问时,系统执行的进程数会很多,因此要注意负载的分配。由于过多的进程会消耗大量系统内存,如果内存不足,就会使用虚拟内存,而虚拟内存的增加会导致磁盘写操作频繁,进而消耗CPU资源,因此要寻求一个硬件资源和软件资源的平衡点,例如配置较大的内存和高性能的CPU,而在软件方面可通过如Memcached加快程序与数据库之间的访问效率。

1.3 数据库应用

数据库应用的一个主要特点是消耗内存和磁盘I/O,而对CPU的消耗并不是很大,因此最基本的做法就是为数据库服务器配置较大的内存和读写较快的磁盘阵列,例如,可以为数据库服务器的磁盘选择RAID5、RAID01等RAID级别。将Web Server与DB Server分离也是优化数据库应用的一个常用做法。如果客户端用户对数据库的请求过大,还可以考虑采取数据库的负载均衡方案,通过软件负载均衡或硬件负载均衡的方式提高数据库访问性能。

对于数据库中过大的表,可以考虑进行拆分,也就是将一个大表拆分成多个小表,再通过索引进行关联处理,这样可以避免查询大表造成的性能问题,因为表太大时,查询遍历全表会造成磁盘读操作激增,进而出现读操作等待的情况。同时,数据库中查询语句复杂,大量的where子句,order by、group by排序语句等,容易使CPU出现瓶颈。最后,当数据更新时,数据更新量大或更新频繁,也会造成磁盘写操作激增,出现写操作的瓶颈。这些也应该在程序代码中避免。

在日常应用中,还有一种方法可以显著提高数据库服务器的性能,那就是读写分离。 同时对数据库进行读和写的操作,是效率极低的一种访问方式,较好的做法是根据读、写的压力和需求,分别建立两台结构完全相同的数据库服务器,将负责写的台服务器上的数据,定时复制给负责读的服务器,通过读写的协作提高系统整体性能。

通过缓存方式也可以提高数据库的性能, 缓存是数据库或对象在内存中的临时容器,使用缓存可大幅减少数据库的读取操作,改由内存来提供数据。比如可以在 Web Server和DB Server之间增加一层数据缓存层,在系统内存中建立被频繁请求对象的副本,这样一来,不访问数据库也可为程序提供数据,现在应用很广泛的Memcached就是基于这个原理。

1.4 软件下载应用

静态资源下载服务器的主要特点是带宽消耗严重,同时对存储性能要求也很高,在下载量极高时,可以采用多台、多点服务器分流形式分担下载负荷,在HTTP服务器方面,从高性能角度和减少服务器部署的角度考虑,推荐采用Lighttpd HTTP服务器,而不是采用传统的Apache服务器,原因是Apache使用阻塞模式的I/O操作,性能相对较差,并发能力有限,而Lighttpd使用异步I/O方式,处理资源下载的并发能力远远超过Apache。

1.5 流媒体服务应用

流媒体主要应用在视频会议、视频点播、远程教育、在线直播等方面,这类应用主要的性能瓶颈是网络带宽和存储系统带宽(主要是读操作),面对海量用户,如何保障用户接收到高清晰的、流畅的画面,如何最大限度地节省网络带宽,这些都是流媒体应用要解决的首要问题。

对于流媒体服务器的优化,可以从存储策略、传输策略、调度策略、代理服务器缓存策略及流媒体服务器的体系结构设计等几个方面进行考虑。在存储方面,需要对视频的编码格式进行优化,进而节省空间,优化存储性能;在传输方面,可以采用智能流技术控制发送的速率,最大程度保障用户观看视频的流畅性;在调度方面,可以采用静态调度和动态调度结合的方法;在代理服务器方面,可以采用分段缓存、动态缓存等管理策略;在流媒体体系结构方面,可以采用内存池和线程池技术改善内存消耗和线程过多对性能造成的影响。

基于Web应用的性能分析及优化案例

一、 基于动态内容为主的网站优化案例

1.网站运行环境说明

硬件环境:1台IBM x3850服务器, 单个双核Xeon 3.0G CPU,2GB内存,3块72GB SCSI磁盘。

操作系统:CentOS5.4。

网站架构:Web应用是基于LAMP架构,所有服务都在一台服务器上部署。

2.性能问题现象及处理措施

现象描述

网站在上午10点左右和下午3点左右访问高峰时,网页无法打开,重启服务后,网站能在一段时间内能正常服务,但过一会又变得响应缓慢,最后网页彻底无法打开。

检查配置

首先检查系统资源状态,发现服务出现故障时系统负载极高,内存基本耗尽,接着检查Apache配置文件httpd.conf,发现“MaxClients”选项值被设置为2000,并且打开了Apache的KeepAlive特性。

处理措施

根据上面的检查,初步判断是Apache的”MaxClients“选项配置不当引起的,因为系统内存仅有2GB大小,而“MaxClients”选项被配置为2000,过多的用户访问进程耗尽了系统内存;然后,修改httpd.conf配置文件的“MaxClients”选项,将此值由2000降到1500;继续观察发现,网站还是频繁宕机,于是又将“MaxClients”选项值降到1024,观察一段时间发现,网站服务宕机时间间隔加长了,不像以前那么频繁,但是系统负载还是很高,网页访问速度极慢。

3.第一次分析优化

既然是由系统资源耗尽导致的网站服务失去响应,那么就深入分析系统资源的使用情况,通过uptime、vmstat、top、ps等命令的联合使用,得出如下结论:

结论描述

系统平均负载很高,通过uptime输出的系统“load average”值都在10以上,而CPU资源也消耗严重,这是造成网站响应缓慢或长时间没有响应的主要原因,而导致系统资源消耗过高的主要依据是用户进程消耗资源严重。

原因分析

通过top命令发现,每个Apache子进程消耗将近6~8MB左右内存,这是不正常的。根据经验,在正常情况下每个Apache子进程消耗的内存在1MB左右,结合Apache输出日志发现,网站首页访问频率最高,也就是说首页程序代码可能存在问题。于是检查首页的PHP代码,发现首页的页面非常大,图片很多,并且由全动态的程序组成,这样每次用户访问首页都要多次查询数据库,而查询数据库是个非常耗费CPU资源的过程,并且首页PHP代码也没有相应的缓存机制,每个用户请求都要重新进行数据库查询操作,数据库查询负荷有多高可想而知。

处理措施

修改首页PHP代码,缩减页面大小,并且对访问频繁的操作增加缓存机制,尽量减少程序对数据库的访问。

4.第二次分析优化

通过前面简单优化,系统服务宕机现象出现次数减少很多,但是在访问高峰时网站偶尔还会无法正常访问。这次仍然从分析系统资源使用状况入手,发现系统内存资源消耗过大,并且磁盘I/O有等待问题,于是得出如下结论:

原因分析

内存消耗过大,肯定是用户访问进程数过多导致的,在没有优化PHP代码之前,每个Apache子进程消耗6~8MB内存,如果设置Apache的最大用户数为1024,那么内存耗尽是必然的,当物理内存耗尽时,虚拟内存就会启用,频繁地使用虚拟内存,肯定会出现磁盘I/O等待问题,最终导致CPU资源耗尽。

处理措施

通过上面对PHP代码的优化,每个Apache子进程消耗的内存资源基本维持在1~2MB左右,因此修改Apache配置文件httpd.conf中的”MaxClients”选项值为“600”,同时把Apache配置中的“KeepAlive”特性关闭,这样Apache进程数大量减少,基本维持在500~600之间,虽然偶尔也会使用虚拟内存,但是Web服务正常了,服务宕机问题也很少出现了。

5.第三次分析优化

经过前两次的优化,网站基本运行正常,但是在访问高峰时偶尔还会出现站点无法访问得现象,继续进行问题分析,通过命令查看系统资源,发现仍是CPU资源耗尽导致的,但是与前两次又有所不同:

原因分析

通过观察后台日志,发现PHP程序有频繁访问数据库的操作,大量的SQL语句中有where, order by等子句;同时,数据库查询过多,大部分都是复杂查询,一般都需要遍历全表,而大量的表没有建立索引,这样的程序代码导致MySQL数据库负荷过高,而MySQL数据库和Apache部署在同一台服务器上,这也是导致服务器消耗CPU资源过高的原因。

处理措施

优化程序中的SQL语句,增加where子句上的匹配条件,减少遍历全部的查询,同时在where和order by子句的字段上建立索引,并且增加程序缓存机制,通过这次优化,网站运行基本处于正常状态,再也没有出现宕机的现象。

6.第四次优化分析

通过前面三次优化以后,网站在程序代码、操作系统、Apache等方面的优化空间越来越小,要避免出现服务气宕机现象,并且保证网站稳定、高效、快速地运行,可以从网站结构上进行优化,也就是将Web和数据库分离部署,可以增加一台专用的数据库服务器,单独部署MySQL数据库。随着访问量的增加,如果前端无法满足访问请求,还可以增加多台Web服务器,Web服务器之间进行负载均衡部署,解决前端性能瓶颈;如果在数据库端还存在读写压力,还可以继续增加一台MySQL服务器,将MySQL进行读写分离部署,这样一套高性能、高可靠的网站系统就构建起来了。

二、  基于动态、静态内容结合的网站优化案例

1.网站运行环境说明

硬件环境:两台IBM x3850服务器, 单个双核Xeon 3.0G CPU,4GB内存,3块72GB SCSI磁盘。

操作系统:CentOS5.4。

网站架构:Web应用是基于J2EE架构的电子商务应用,Web端应用服务器是Tomcat,采用MySQL数据库,Web和数据库独立部署在两台服务器上。

2.性能问题现象以及处理措施

现象描述

网站访问高峰时,网页无法打开,重启Java服务后,网站可以正常运行一段时间,但过一会又变得响应缓慢,最后网页彻底无法打开。

检查配置

首先检查系统资源状态,发现服务出现故障时系统负载极高,CPU满负荷运行,Java进程占用了系统99%的CPU资源,但内存资源占用不大;接着检查应用服务器信息,发现只有一个Tomcat在运行Java程序;接着查看Tomcat配置文件server.xml,发现server.xml文件中的参数都是默认配置,没有进行任何优化。

处理措施

server.xml文件的默认参数需要根据应用的特性进行适当的修改,例如可以修改“connectionTimeout“、“maxKeepAliveRequests”、“maxProcessors”等几个Tmcat配置文件的参数,适当加大这几个参数值。修改参数值后,继续观察发现,网站服务宕机时间间隔加长了,不像以前那么频繁,但是Java进程消耗CPU资源还是很严重,网页访问速度极慢。

3.第一次分析优化

既然Java进程消耗CPU资源严重,那么需要查看到底是什么导致Java消耗资源严重,通过lsof、netstat命令发现有大量的Java请求等待信息,然后查看Tomcat日志,发现大量报错信息、日志提示和数据库连接超时,最终无法连接到数据库,同时,访问网站静态资源,也无法访问,于是得出如下结论:

原因分析

Tomcat本身就是一个Java容器,是使用连接/线程模型处理业务请求的,主要用于处理Jsp、servlet等动态应用,虽然它也能当作HTTP服务器,但是处理静态资源的效率很低,远远比不上Apache或Nginx。从前面观察到的现象分析,可以初步判断是Tomcat无法及时响应客户端的请求,进而导致请求队列越来越多,直到Tomcat彻底崩溃。对于一个正常的访问请求来说,服务器接收到请求后,会把请求交给Tomcat去处理,Tomcat接着执行编译、访问数据库等操作,然后把信息返回给客户端,客户端接收到信息后,Tomcat就关闭这个请求链接,这样一个完整的访问过程就结束了。而在高并发访问状态下,很多的请求瞬间都交给Tomcat处理,这样Tomcat还没有完成第一个请求,第二个请求就来了,接着是第三个,等等,这样越积越多,Tomcat最终失去响应, Java进程就会处于僵死状态,资源无法释放,这就是根本原因。

处理措施

要优化Tomcat性能,需要从结构上进行重构,首先,加入Apache支持,由Apache处理静态资源,由Tomcat处理动态请求,Apache服务器和Tomcat服务器之间使用Mod_JK模块进行通信。使用Mod_JK模块的好处是:它可以定义详细的资源处理规则,根据动态、静态网站的特点,将静态资源文件全部交给Apache处理,而动态请求通过Mod_JK模块传给Tomcat去处理,通过Apache+JK+Tomcat的整合,可以大幅度提高Tomcat应用的性能。

4.第二次分析优化

经过前面的优化措施,Java资源偶尔会增高,但是一段时间后又会自动降低,这属于正常状态,而在高并发访问情况下,Java进程有时还会出现资源上升无法下降的情况,通过查看Tomcat日志,综合分析得出如下结论:

要获得更高、更稳定的性能,单一的Tomcat应用服务器有时会无法满足需求,因此要结合Mod_JK模块运行基于Tomcat的负载均衡系统,这样前端由Apache负责用户请求的调度,后端又多个Tomcat负责动态应用的解析操作,通过将负载均分配给多个Tomcat服务器,网站的整体性能会有一个质的提升。

18个常用的网站性能测试工具

网站的加载速度是决定网站等级的重要因素,值得站长特别关注。原因很简单,没有人愿意为了打开一个网页而等老半天,换句话说,如果你的网站打开速度很慢,将流失大量的访客,甚至出现多米诺效应的不良影响。在埋头深入代码中试图提高网站速度之前,先要确定导致网站访问速度缓慢的真正原因是什么。本文收集了非常有用的WEB服务和工具,可以帮助你诊断和分析你的网站,让你更加全面的了解自己的网站性能。

在线测试工具

Pingdom

测试网站所有对象的加载时间(HTML,images,JavaScript,CSS,嵌入式框架等)。您还可以检查网站每个元素的加载速度并改善加载缓慢的项目。在测试结果中,可以看到网站每个元素的加载时间报告,元素的大小和元素的总数量。

GTmetrix

结合了最流行的Firefox性能组件YSlow的和谷歌网页速度测试工具。Gtmetrix给你提供改进网站速度的建议,虽然YSlow的和谷歌网页的速度测试的建议是针对Firefox的,也可以适用于其他浏览器。

Light Speed Now

测试你的网站的速度性能,并把测试报告发送给到你的邮箱。

Load Impact

Loadimpact对于一个每天有成千上万的游客访问的大型网站来说是个非常重要的工具。一个免费帐户允许你模拟50个用户访问的压力测试,还要更多的话你就必须升级高级账号。

Site-Perf

Gomez Networks

实时的测试单个网页的性能。

OctaGate

允许你监视用户打开你网站中一个或多个网页的时间。

Webslug

可以让你把你的网站和竞争对手的网站的加载速度进行比较。

WebToolHub

让你以了解您的网页在不同的访问速度下是如何加载的。用Webtoolhub你可以知道页面的大小的信息,以及在不同的连接速度下,网页中CSS,Javascript和图片的加载时间,这些都是进行基本的网页速度测试所需要的。

IWebTool

可以让你同一时间对比10个页面。您还可以检查主页,目录页面的载入时间。

Searchmetrics

显示了指定网站的加载持续时间。此值可用于显示网站加载了多久,是否需要换个ISP。

BrowserMob

不需要写测试脚本就可以知道网站即时的性能数据。

常用测试软件

Pylot

开源的测试工具,可以测试网站的性能和可扩展性。它运行HTTP负载测试,这是有用的容量规划,基准,分析和系统调整。

Google Page Speed

谷歌网页速度测试是一个开源的Firefox / Firebug插件。网站管理员和Web开发人员可以使用该工具来评估其网页的性能并获取有关如何改进它们的建议。

YSlow

YSlow用来分析网页性能,并在高性能网页规则基础上建议如何改善。

PageTest

Internet Explorer的插件,常用来显示浏览器加载内容时发出的请求并提供了该进页面性能的建议。

Multi-Mechanize 

是一个网站性能和负载测试的开源框架。它允许你编写Python脚本来生成对一个网站或Web服务的负载。

编译来源:推荐18个网站速度及性能检查工具

原文来自:Website Speed and Performance Checking Tools

它模拟浏览器下载图片,CSS,JS和其他文件,在报告中你可以看到先加载网站的哪些页以及加载时间。这是十分有用的性能报告,可以用来查找到提高你的网站的载入速度需要改善的元素。

WebWait

一些基准测试,测试你网站的连接速度。

网站压力测试工具webbench

网站压力测试工具有很多种,LinuxVPS学习者里之前也写了两个功能比较强大的网站压力测试工具《利用Apache Bench测试Web引擎性能》和《利用http_load测试Web引擎性能》,但它们的功能较多,操作起来较为繁琐。webbench操作非常简单,最多可以模拟3万个并发连接去测试网站的负载,效果也比较直观好用。

一、获得webbench

1、下载

  1. wget http://www.centoscn.com/tool/webbench-1.5.tar.gz

2、解压并编译

  • yum install y gcc ctags      #先安装编译需要的组件 
  • tar zxvf webbench1.5.tar.gz  #解压Webbench 
  • cd webbench1.5               #进入webbench目录 
  • make && make install          #编译安装

二、使用方法

  1.  
  2. webbench c 100 t 30 http://www.kwx.gd/

SSH按格式执行以上命令。

-c:线程数(最大30000线程)

-t:持续时间(秒)

三、结果查看

  1. [root@kwx.gd webbench1.5]# webbench c 100 t 30 http://www.kwx.gd/ #向www.kwx.gd发起100线程请求,持续时间30秒。 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://www.kwx.gd/ 
  6. 100 clients, running 30 sec.  #100次连接,运行30秒 
  7.  
  8. Speed=604 pages/min, 194290 bytes/sec. #速度,604页/每分钟,194290字节/秒 
  9. Requests: 276 susceed, 26 failed.      #返回数,276次正常返回,26次失败返

memcached 双机热备

一、需求背景

发现公司好多项目都用到memched。并且都是单点,memched服务器 挂了就会影响业务,于是百度之,发现memched不可以集群,也没有看到有什么高可用方案,但是发现了repcached(memched主从复制),结合LVS的NAT模式不同端口转发实现memched双机HA,本文章记录本人的部署过程,从属实战,没有文字性的说明,欢迎各位指点。

二、环境:

1、系统环境:

  • CentOS release 6.4 (Final)

2、网络环境

  • 调度机(master):
  • vip:172.28.26.100
  • vip1:172.28.16.100(lvs转发网关   )
  • eth1:172.28.26.101 (内网)
  • eth2:172.28.16.101(lvs转发网段)
  • 调度机(backup):
  • eth1:172.28.26.99 (内网)
  • eth2:172.28.16.99(lvs转发网段)
  • memched备节点:
  • eth1:172.28.26.102 (内网)
  • eth2:172.28.16.102(lvs转发网段)
  • memched主节点:
  • eth1:172.28.26.103 (内网)
  • eth2:172.28.16.103(lvs转发网段)

3、路由策略

  • 调度机(master):
  • echo ‘201      eth1’>> /etc/iproute2/rt_tables
  • echo ‘default table eth1 via 172.28.26.1 dev eth1’> /etc/sysconfig/network-scripts/route-eth1
  • echo ‘from 172.28.26.101/255.255.255.255 table eth1’> /etc/sysconfig/network-scripts/rule-eth1
  • echo ‘from 172.28.26.100/255.255.255.255 table eth1’>> /etc/sysconfig/network-scripts/rule-eth1
  • echo ‘from 172.28.16.101/32 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • memched节点1:
  • echo ‘default table ZW_LVS_LAN via 172.28.16.100’> /etc/sysconfig/network-scripts/route-eth2
  • echo ‘from 172.28.16.0/24 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • echo ‘202       ZW_LVS_LAN’>> /etc/iproute2/rt_tables
  • memched节点2:
  • echo ‘default table ZW_LVS_LAN via 172.28.16.100’> /etc/sysconfig/network-scripts/route-eth2
  • echo ‘from 172.28.16.0/24 table ZW_LVS_LAN’> /etc/sysconfig/network-scripts/rule-eth2
  • echo ‘202       ZW_LVS_LAN’>> /etc/iproute2/rt_tables

4、内核参数

  • fs.file-max= 1000000
  • kernel.core_uses_pid = 1
  • kernel.msgmax = 1048560
  • kernel.msgmnb = 1073741824
  • kernel.shmall = 4294967296
  • kernel.shmmax = 68719476736
  • kernel.sysrq = 0
  • net.core.netdev_max_backlog = 1048576
  • net.core.rmem_default = 2097152
  • net.core.rmem_max = 16777216
  • net.core.somaxconn = 1048576
  • net.core.wmem_default = 2097152
  • net.core.wmem_max = 16777216
  • net.ipv4.conf.default.accept_source_route = 0
  • net.ipv4.conf.default.rp_filter = 1
  • net.ipv4.ip_forward = 1
  • net.ipv4.ip_local_port_range = 1024    65000
  • net.ipv4.neigh.default.gc_thresh1 = 10240
  • net.ipv4.neigh.default.gc_thresh2 = 40960
  • net.ipv4.neigh.default.gc_thresh3 = 81920
  • net.ipv4.tcp_fin_timeout = 1
  • net.ipv4.tcp_keepalive_intvl = 15
  • net.ipv4.tcp_keepalive_probes = 5
  • net.ipv4.tcp_keepalive_time = 30
  • net.ipv4.tcp_max_orphans = 3276800
  • net.ipv4.tcp_max_syn_backlog = 1048576
  • net.ipv4.tcp_max_tw_buckets = 50000
  • net.ipv4.tcp_mem = 94500000 915000000 927000000
  • net.ipv4.tcp_orphan_retries = 3
  • net.ipv4.tcp_reordering = 5
  • net.ipv4.tcp_retrans_collapse = 0
  • net.ipv4.tcp_retries2 = 5
  • net.ipv4.tcp_rmem = 4096        87380   4194304
  • net.ipv4.tcp_sack = 1
  • net.ipv4.tcp_synack_retries = 1
  • net.ipv4.tcp_syncookies = 0
  • net.ipv4.tcp_syn_retries = 1
  • net.ipv4.tcp_timestamps = 1
  • net.ipv4.tcp_tw_recycle = 1
  • net.ipv4.tcp_tw_reuse = 1
  • net.ipv4.tcp_window_scaling = 1
  • net.ipv4.tcp_wmem = 4096        16384   4194304
  • net.ipv6.conf.all.disable_ipv6 = 1
  • net.ipv6.conf.default.disable_ipv6 = 1
  • net.ipv4.conf.eth0.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.eth1.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.eth2.rp_filter = 1 #memched节点不需要
  • net.ipv4.conf.all.rp_filter = 0    #memched节点不需要

三、服务安装

1、调度机(master、backup)

  • yum -y install ipvsadm keepalived sendmail

2、memched节点1、memched节点2

  • tar -zxvf libevent-1.4.13-stable.tar.gz
  • cd libevent-1.4.13-stable
  • ./configure –prefix=/usr/local
  • make
  • make install
  • tar -zxvf memcached-1.4.15.tar.gz
  • cd memcached-1.4.15
  • ./configure –with-libevent=/usr/local
  • make
  • make install
  • tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz
  • cd memcached-1.2.8-repcached-2.2
  • ./configure  –enable-replication
  • make
  • make install

四、keepalived配置(master、backup)

[root@LVS1 keepalived]# cat /etc/keepalived/gobal_module

  • ! globalconfigure file
  • global_defs {
  • notification_email {
  • navyaijm@qq.com
  • }
  • notification_email_from navyaijm@qq.com
  • smtp_server 127.0.0.1
  • smtp_connect_timeout 30
  • router_id ZH_DG_LVS1
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/keepalived.conf
  • ! Keepalived main configure file
  • include /etc/keepalived/gobal_module
  • include /etc/keepalived/vrrpd_module
  • include /etc/keepalived/lvs_module

[root@LVS1 keepalived]# cat /etc/keepalived/vrrpd_module

  • vrrp_sync_group ZH_DG_Memcached1 {
  • group{
  • ZH_DG_WAN1
  • ZH_DG_LAN1
  • }
  • smtp_alter
  • }
  • vrrp_instance ZH_DG_WAN1 {
  • state MASTER    (从上为:backup)
  • interface eth1
  • virtual_router_id 10  (从为:9)
  • priority 100
  • advert_int 1
  • authentication {
  • auth_type PASS
  • auth_pass 08756CD0
  • }
  • virtual_ipaddress {
  • 172.28.26.100  # vip
  • }
  • }
  • vrrp_instance ZH_DG_LAN2 {
  • state MASTER (从上为:backup)
  • interface eth2
  • virtual_router_id 10 (从为:9)
  • priority 100
  • advert_int 1
  • authentication {
  • auth_type PASS
  • auth_pass 6F8DBC2E
  • }
  • virtual_ipaddress {
  • 172.28.16.100 # Memcached 虚拟网关
  • }
  • }

[root@LVS1 keepalived]# cat /etc/keepalived/lvs_module

  • virtual_server 172.28.26.100 11211 {
  • delay_loop 6
  • lb_algo wrr
  • lb_kind NAT
  • persistence_timeout 60
  • protocol TCP
  • include /etc/keepalived/realserver/172.28.26.102_11234.conf
  • include /etc/keepalived/realserver/172.28.26.103_11233.conf
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/realserver/172.28.26.102_11234.conf
  • real_server 172.28.16.102 11234 {
  • weight 1                        #权重
  • inhibit_on_failure              #故障会修改权重为零
  • TCP_CHECK {
  • connect_timeout 10      #10秒无响应超时
  • nb_get_retry 3          #重连次数
  • delay_before_retry 3    #重连间隔,单位为秒
  • connect_port 11234         #检测端口
  • }
  • }
  • [root@LVS1 keepalived]# cat /etc/keepalived/realserver/172.28.26.103_11233.conf
  • real_server 172.28.16.103 11233 {
  • weight 1                        #权重
  • inhibit_on_failure              #故障会修改权重为零
  • TCP_CHECK {
  • connect_timeout 10      #10秒无响应超时
  • nb_get_retry 3          #重连次数
  • delay_before_retry 3    #重连间隔,单位为秒
  • connect_port 11233         #检测端口
  • }
  • }

五、启动服务

1、keepalived启动(master和backup)

  • /etc/init.d/keepalived start

memcached的启动

主节点:

  • /usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11233 -X 11244 -uroot (11244是数据同步端口)

备节点:

  • /usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11234 -uroot -x 172.28.16.103 -X 11244(11234是服务监听端口,11244是监听数据同步端口;-x 指定masterIP,-X指定master数据同步监听端口)
  • PS:
  • 1、如果启动的时候报错如下:
  • [root@yw_memcached_slave ~]#/usr/local/bin/memcached -d -v -l 0.0.0.0 -p 11233 -X 11244 -uroot
  • /usr/local/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot openshared object file: Nosuch file ordirectory
  • 请yum安装libeven
  • [root@yw_memcached_slave ~]# yum -y install libeven
  • 2、repcached是日本人开发的实现memcached复制功能,它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步,如果 master坏掉, slave侦测到连接断了,它会自动 listen而成为 master;而如果 slave坏掉, master也会侦测到连接断,它就会重新 listen等待新的 slave加入 ;master没有抢占功能,如果master挂掉再起来只能是从了,并且永远只能是从。

六、测试

1、写一个php测试文件

vi session.php

  • <?php
  • ini_set(‘session.save_handler’, ‘memcached’);
  • ini_set(‘session.save_path’, “172.28.26.100:11211”);
  • session_start();
  • $_SESSION[‘aa’] = “bb”;
  • echosession_id();
  • ?>

2、用php执行这个文件会得到一个字符串,telnet 172.28.26.100 11211 或者telnet 172.28.26.103 11233再或者telnet 172.28.26.103 11234,如果能得到值说明session已经写入memched,down到任何一台memched数据不会丢。

本文出自 “为了梦想奋斗” 博客,转载请与作者联系!

 

Linux运维工程师应该知道的20个系统监控工具

需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧。大多数Linux发行版本都装备了大量的监控工具。这些工具提供了能用作取得相关信息和系统活动的量度指标。你能使用这些工具发现造成性能问题可能原因。此次讨论到的工具只是分析和调试服务器下面问题时最基本工具中的一部分。

1.找出瓶颈

2.硬盘(存储)瓶颈

3.CPU及内存瓶颈

4.网络瓶颈

#1: top – 进程活动

top提供一个当前运行系统实时动态的视图,也就是正在运行进程。在默认情况下,显示系统中CPU使用率最高的任务,并每5秒钟刷新一次。

图01.Linux top命令

常用热键

t显示摘要信息开关.m显示内存信息开关.A分类显示系统不同资源的使用大户。有助于快速识别系统中资源消耗多的任务。f添加删除所要显示栏位.o调整所要显示栏位的顺序.r调整一个正在运行的进程Nice值.k结束一个正在运行的进程.z彩色/黑白显示开关

相关链接:How do I Find Out Linux CPU Utilization?

译者推荐链接:Linux系统管理员必备工具系列之top(原创)

#2:vmstat -系统活动、硬件及系统信息

使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。

# vmstat 3

输出样例:

procs ———–memory———- —swap– —–io—- –system– —–cpu——

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 2540988 522188 5130400 0 0 2 32 4 2 4 1 96 0 0

1 0 0 2540988 522188 5130400 0 0 0 720 1199 665 1 0 99 0 0

0 0 0 2540956 522188 5130400 0 0 0 0 1151 1569 4 1 95 0 0

0 0 0 2540956 522188 5130500 0 0 0 6 1117 439 1 0 99 0 0

0 0 0 2540940 522188 5130512 0 0 0 536 1189 932 1 0 98 0 0

0 0 0 2538444 522188 5130588 0 0 0 0 1187 1417 4 1 96 0 0

0 0 0 2490060 522188 5130640 0 0 0 18 1253 1123 5 1 94 0 0显示内存使用详细信息# vmstat -m显示内存活动/不活动的信息

# vmstat -a

相关链接:How do I find out Linux Resource utilization to detect system bottlenecks?

译者推荐链接:Linux系统管理员必备工具系列之vmstat(原创)

#3: w – 显示谁已登录,他们正在做什么?

w命令显示系统当前用户及其运行进程的信息。

# w username

# w vivek

输出样例:

17:58:47 up 5 days, 20:28, 2 users, load average: 0.36, 0.26, 0.24

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 10.1.3.145 14:55 5.00s 0.04s 0.02s vim /etc/resolv.conf

root pts/1 10.1.3.145 17:43 0.00s 0.03s 0.00s w

#4:uptime – 告诉系统已经运行了多久?

uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。

# uptime

输入样例:

18:02:41 up 41 days, 23:42, 1 user, load average: 0.00, 0.00, 0.00

1可以被认为是最优的负载值。负载是会随着系统不同改变得。单CPU系统1-3和SMP系统6-10都是可能接受的。

#5:ps – 显示进程

ps命令显示当前运行进程的快照。使用-A或-e显示所有进程。

# ps -A

输出样例:

PID TTY TIME CMD

1 ? 00:00:02 init

2 ? 00:00:02 migration/0

3 ? 00:00:01 ksoftirqd/0

4 ? 00:00:00 watchdog/0

5 ? 00:00:00 migration/1

6 ? 00:00:15 ksoftirqd/1

….

…..

4881 ? 00:53:28 java

4885 tty1 00:00:00 mingetty

4886 tty2 00:00:00 mingetty

4887 tty3 00:00:00 mingetty

4888 tty4 00:00:00 mingetty

4891 tty5 00:00:00 mingetty

4892 tty6 00:00:00 mingetty

4893 ttyS1 00:00:00 agetty

12853 ? 00:00:00 cifsoplockd

12854 ? 00:00:00 cifsdnotifyd

14231 ? 00:10:34 lighttpd

14232 ? 00:00:00 php-cgi

54981 pts/0 00:00:00 vim

55465 ? 00:00:00 php-cgi

55546 ? 00:00:00 bind9-snmp-stat

55704 pts/1 00:00:00 psps与top非常相似,但ps提供更多的信息。输出长格式# ps -Al输出附加全格式(显示进程在执行时传入的参数)# ps -AlF显示进程结构

# ps -AlFH

在进程后显示线程

# ps -AlLm

打印服务器上所有进程

# ps ax

# ps axu

打印进程树

# ps -ejH

# ps axjf

# pstree

打印安全信息

# ps -eo euser,ruser,suser,fuser,f,comm,label

# ps axZ

# ps -eM

查看使用Vivek用户名运行的进程

# ps -U vivek -u vivek u

设置自定义输出格式

# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

# ps -eopid,tt,user,fname,tmout,f,wchan

只显示Lighttpd的进程ID

# ps -C lighttpd -o pid=

或者

# pgrep lighttpd

或者

# pgrep -u vivek php-cgi

显示PID为55977的进程名称

# ps -p 55977 -o comm=

找出消耗内存最多的前10名进程

# ps -auxf | sort -nr -k 4 | head -10

找出使用CPU最多的前10名进程

# ps -auxf | sort -nr -k 3 | head -10

#6:free – 内存使用情况

free命令显示系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。

# free

输出样例:

total used free shared buffers cached

Mem: 12302896 9739664 2563232 0 523124 5154740

-/+ buffers/cache: 4061800 8241096

Swap: 1052248 0 1052248相关链接:Linux Find Out Virtual Memory PAGESIZELinux Limit CPU Usage Per ProcessHow much RAM does my Ubuntu / Fedora Linux desktop PC have?

#7:iostat – CPU平均负载,硬盘活动

iostat命令可报告中央处理器(CPU)的统计信息,各种设备、分区及网络文件系统输入/输出的统计信息。

# iostat

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

avg-cpu: %user %nice %system %iowait %steal %idle

3.50 0.09 0.51 0.03 0.00 95.86

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

sda 22.04 31.88 512.03 16193351 260102868

sda1 0.00 0.00 0.00 2166 180

sda2 22.04 31.87 512.03 16189010 260102688

sda3 0.00 0.00 0.00 1615 0相关链接:Linux Track NFS Directory / Disk I/O Stats#8:sar – 搜集和报告系统活动

sar命令用来搜集、报告和储存系统活动信息。查看网路计数器,输入:

# sar -n DEV | more

显示最近24小时网络计数器

# sar -n DEV -f /var/log/sa/sa24 | more

你亦可以用sar显示实时情况

# sar 4 5

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in)   06/26/2009

06:45:12 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle

06:45:16 PM       all      2.00      0.00      0.22      0.00      0.00     97.78

06:45:20 PM       all      2.07      0.00      0.38      0.03      0.00     97.52

06:45:24 PM       all      0.94      0.00      0.28      0.00      0.00     98.78

06:45:28 PM       all      1.56      0.00      0.22      0.00      0.00     98.22

06:45:32 PM       all      3.53      0.00      0.25      0.03      0.00     96.19

Average:          all      2.02      0.00      0.27      0.01      0.00     97.70

相关链接:How to collect Linux system utilization data into a file

#9:mpstat – 多处理器使用率

mpstat命令可以显示所有可用处理器的使用情况,处理器编号从0开始。mpstat -P ALL显示每个处理器的平均使用率。

# mpstat -P ALL

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in)   06/26/2009

06:48:11 PM CPU   %user   %nice    %sys %iowait    %irq   %soft %steal   %idle    intr/s

06:48:11 PM all    3.50    0.09    0.34    0.03    0.01    0.17    0.00   95.86   1218.04

06:48:11 PM    0    3.44    0.08    0.31    0.02    0.00    0.12    0.00   96.04   1000.31

06:48:11 PM    1    3.10    0.08    0.32    0.09    0.02    0.11    0.00   96.28     34.93

06:48:11 PM    2    4.16    0.11    0.36    0.02    0.00    0.11    0.00   95.25      0.00

06:48:11 PM    3    3.77    0.11    0.38    0.03    0.01    0.24    0.00   95.46     44.80

06:48:11 PM    4    2.96    0.07    0.29    0.04    0.02    0.10    0.00   96.52     25.91

06:48:11 PM    5    3.26    0.08    0.28    0.03    0.01    0.10    0.00   96.23     14.98

06:48:11 PM    6    4.00    0.10    0.34    0.01    0.00    0.13    0.00   95.42      3.75

06:48:11 PM    7    3.30    0.11    0.39    0.03    0.01    0.46    0.00   95.69     76.89

相关链接:Linux display each multiple SMP CPU processors utilization individually.

#10: pmap – 进程的内存使用

pmap命令可以显示进程的内存映射,使用这个命令可以找出造成内存瓶颈的原因。

# pmap -d PID

显示PID为47394进程的内存信息。

# pmap -d 47394

输出样例:

47394:   /usr/bin/php-cgi

Address           Kbytes Mode Offset           Device    Mapping

0000000000400000    2584 r-x– 0000000000000000 008:00002 php-cgi

0000000000886000     140 rw— 0000000000286000 008:00002 php-cgi

00000000008a9000      52 rw— 00000000008a9000 000:00000   [ anon ]

0000000000aa8000      76 rw— 00000000002a8000 008:00002 php-cgi

000000000f678000    1980 rw— 000000000f678000 000:00000   [ anon ]

000000314a600000     112 r-x– 0000000000000000 008:00002 ld-2.5.so

000000314a81b000       4 r—- 000000000001b000 008:00002 ld-2.5.so

000000314a81c000       4 rw— 000000000001c000 008:00002 ld-2.5.so

000000314aa00000    1328 r-x– 0000000000000000 008:00002 libc-2.5.so

000000314ab4c000    2048 —– 000000000014c000 008:00002 libc-2.5.so

…..

……

..

00002af8d48fd000       4 rw— 0000000000006000 008:00002 xsl.so

00002af8d490c000      40 r-x– 0000000000000000 008:00002 libnss_files-2.5.so

00002af8d4916000    2044 —– 000000000000a000 008:00002 libnss_files-2.5.so

00002af8d4b15000       4 r—- 0000000000009000 008:00002 libnss_files-2.5.so

00002af8d4b16000       4 rw— 000000000000a000 008:00002 libnss_files-2.5.so

00002af8d4b17000 768000 rw-s- 0000000000000000 000:00009 zero (deleted)

00007fffc95fe000      84 rw— 00007ffffffea000 000:00000   [ stack ]

ffffffffff600000    8192 —– 0000000000000000 000:00000   [ anon ]

mapped: 933712K    writeable/private: 4304K    shared: 768000K

最后一行非常重要:

* mapped: 933712K 内存映射所占空间大小

* writeable/private: 4304K 私有地址空间大小

* shared: 768000K 共享地址空间大小

相关链接:Linux find the memory used by a program / process using pmap command

#11和#12: netstat和ss – 网络相关信息

netstat可以显示网络链接、路由表信息、接口统计信息、伪装链接和多播成员(multicast memberships),ss命令用来显示网络套接字信息,它允许显示类似netstat一样的信息。关于ss和netstat使用,可参考下列资源。

相关链接:

ss: Display Linux TCP / UDP Network and Socket InformationGet Detailed Information About Particular IP address Connections Using netstat Command

#13: iptraf – 网络实时信息

iptraf是一个可交互式的IP网络监控工具。它可以生成多种网络统计信息包括:TCP信息、UDP数量、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验错误等。有下面几种信息格式:

不同网络TCP链接传输量 不同网络接口IP传输量 不同协议网络传输量 不同TCP/UDP端口和不同包大小网络传输量 不同第二层地址网络传输量

图02:一般接口信息:不同网络接口IP传输量

图03:不同网络TCP链接传输量

#14:tcpdump:详细的网络流量分析

tcpdump是一个简单网络流量转储工具,然而要使用好需要对TCP/IP协议非常熟悉。例如要显示关于DNS的网络流量,输入:

# tcpdump -i eth1 ‘udp port 53’

显示所有进出80端口IPv4 HTTP包,也就是只打印包含数据的包。例如:SYN、FIN包和ACK-only包输入:

# tcpdump ‘tcp port 80 and (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0)’

显示所有到的FTP会话,输入:

# tcpdump -i eth1 ‘dst 202.54.1.5 and (port 21 or 20’

显示所有到192.168.1.5的HTTP会话

# tcpdump -ni eth0 ‘dst 192.168.1.5 and tcp and port http’

用wireshark浏览转储文件中的详细信息,输入:

# tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80

#15:strace – 系统调用

追踪系统调用和型号,这对于调试Web服务器和其他服务器非常有用。了解怎样追踪进程和他功能。

#16:/proc文件系统 – 各种内核信息

/proc目录下文件提供了很多不同硬件设备和内核的详细信息。更多详情参见Linux kernel /proc。一般/proc例如:

# cat /proc/cpuinfo

# cat /proc/meminfo

# cat /proc/zoneinfo

# cat /proc/mounts

#17:Nagios – 服务器及网络监控

Nagios 是一款非常流行的系统及网络监控软件。你可以轻松监控所有的主机、网络设备及服务。它能在发生故障和重新恢复后发送警讯。FAN是”Fully Automated Nagios”的缩写。FAN的目标就是由Nagios社群提供Nagios的安装。为了使安装Nagios服务器更加容易,FAN提供一个标准ISO格式的光盘镜像。此发行版中还会包含一组增强用户使用体验的工具。

#18:Cacti – 基于Web的监控工具

Cacti是一套完成的网络图形化解决方案,基于RRDTool的资料存储和图形化功能。Cacti提供一个快速的轮询器、进阶的图形化模板、多种数据采集方法和用户管理功能。这些功能都拥有非常友好易用的界面,确保可以部署在一个包含数百台设备的复杂网络中。它提供关于网络、CPU、内存、已登录用户、Apache、DNS等信息。关于怎样在CentOS / RHEL安装配置Cacti,详见:http://www.cyberciti.biz/faq/fedora-rhel-install-cacti-monitoring-rrd-software/

#19:KDE System Guard

KSysguard是在KDE桌面下一个网络化的系统监控工具。这个工具可以通过SSH会话运行。它提供很多功能,例如可以监控本机和远程主机的客户端/服务器架构,前端图形界面使用所谓传感器得到信息并展现出来。传感器返回的可以是一个简单的数值或是一组表格的信息。针对不同的信息类型,提供一个或多个显示。这些显示被组织多个工作表中,可以工作表可以独体储存和加载。所以,KSysguard不只是一个简单的任务管理器,还是一个可以控制多台服务器的强大工具。

图05:KDE System Guard

详细用法参见: the KSysguard handbook

#20:Gnome System Monitor

System Monitor可以显示系统基本信息、监控系统进程、系统资源及文件系统使用率。你也可以使用System Monitor监控和修改系统行为。尽管没有KDE System Guard功能强大,但其提供的基本信息对于入门用户还是非常有用的。

* 显示关于计算机硬件和软件的各种基本信息。

* Linux内核版本

* GNOME版本

* 硬件

* 安装的内存

* 处理器及其速度

* 系统状态

* 当前可用的硬盘空间

* 进程

* 内存及交换空间

* 网络使用率

* 文件系统

* 所有挂载的文件系统及其基本信息

企业shell面试题

1.mysql分数据库备份脚本
#/bin/sh
MYUSER=root
MYPWD=123456
SOCKET=/tmp/mysql.sock
MYCMD=”mysql -u$MYUSER -p$MYPWD -S $SOCKET”
MYDUMP=”mysqldump -u$MYUSER -pMYPWD -S $SOCKET”
for database in `$MYCMD -e “show databases;|sed ‘1,2d’|egrep -v “mysql|schema”`
do
$MYDUMP $database|gizp >/server/dackup/${datebase}_$(date +%F).sql.gz
done
mysql分表备份
#/bin/sh
MYUSER=root
MYPWD=123456
SOCKET=/tmp/mysql.sock
MYCMD=”mysql -u$MYUSER -p$MYPWD -S $SOCKET”
MYDUMP=”mysqldump -u$MYUSER -pMYPWD -S $SOCKET”
for database in `$MYCMD -e “show databases;|sed ‘1,2d’|egrep -v “mysql|schema”`
do
mkdir /server/backup/${datebase} -p
for table in `$MYCMD -e “show tables from $database;”|sed ‘1d’`
do
$MYDUMP $datebase $table|gzip >/server/backup/${database}/${database}_${table}_$(date +%F).sql.gz
done
done

2.bash for循环打印下面这句话中字母数不大于6的单词
I am oldboy teacher welcome to oldboy training class
a.for循环
b.对字符串长度进行判断
判断字符串长度四种方法:
[1.echo “Str”|wc -l 2.变量字符串${#oldboy} 3.expr length “Str” 4.echo “Str”|awk ‘{print length($0)}” 5.echo “str”|wc -m]
判断字符串为空的三种方法:
[1. if [ “Str” = “” ] 2.if [ x”Str” = x ] 3.if [ -z “Str” ] ]
#!/bin/bash
for i in I am oldboy teacher welcome to oldboy training class
do
[ ${#i} -le 6 ] && echo $i
done
#!/bin/bash
for i in I am oldboy teacher welcome to oldboy training class
do
[ `echo $i|wc -L` -le 6 ] && echo $i
done
方法二:
#!/bin/bash
array=(I am oldboy teacher welcome to oldboy training class)
for((i=0;i<${#array[@]};i++))
do
#echo ${array[i]}
if [ `expr length “${array[i]}”` -le 3 ];then
echo ${array[i]}
fi
done
方法三:
echo “I am oldboy teacher welcome to oldboy training class”|awk ‘{for(i=1;i<=NF;i++) if(length($i)<=6 ) print $i}’
[awk有三种循环:while循环;for循环;special for循环
$ awk ‘{ i=1;while (i<=NF) {print NF,$i;i++}}’
$ awk ‘{for(i=1;i<=NF;i++) print NF,$i}’
{for ( x=3; x<=NF; x++) if ($x<0 ){print “Bottomed out!”; break }}
{for ( x=3; x<=NF; x++) if ($x==0){print “Get next item”; continue}} ]
3.用shell把文件(假设一共51行)特定行打印出来,比如第一行,第十一行,第二十一行……第五十一行
方法一:
for i in `seq 1 10 51`
do
sed -n “${i}p” /etc/services
done
方法二:
cat -n /etc/services|sed -n ‘1~10p’ [~表示步长,即间隔]
方法三:
#!/bin/bash
for((i=1;i<=52;i=i+10))
do
sed -n “${i}p” /etc/services
done
for ((i=1;i<=52;i=i+10))
do
sed -n -e “${i}p” -e ${i}= /etc/services
done
[sed -n “1p” 打印第一行内容;sed “1p” 打印第一行和全部内容 (添加-n与没有的区别)
sed -e的应用。只有当sed命令传递多个编辑命令式,才会使用到-e。比如:我想打印/tr/匹配行,并且打印匹配行所在的行号,此时存在多个sed参数,就要用到-e了。sed -n -e /tr/p -e /tr/= test2.sh]
方法四:cat /etc/services|awk ‘{if(NR%10==1) print $0}’

4.如何获取/etc/test.log文件夹权限-rw-r–r–(644),要求使用命令取得644的字样
方法一:
stat /etc/test.log|head -4|tail -1|cut -d “/” -f1|cut -d “0” -f2
方法二:
stat /etc/test.log|sed -n “4p”|awk -F “/” ‘{print $1}’|awk -F “(” ‘{print $2}’
方法三:
stat -c %a /etc/test.log %a 以8进制显示
[stat查看文件相关信息,包括访问时间,修改时间,状态时间
1、访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件使用more命令。ls 、stat命令都不会修改文件的访问时间
2、修改时间,对文件内容修改一次,这个时间就会更新。比如vi后保存文件。ls -l列出的时间就是这个时间
3、状态改变时间。通过chmod命令更改一次文件属性,这个时间就会更新。查看文件的详细的状态、准确的修改时间等,可以通过stat命令
tail -n 输出最后n行,默认是10行 tail -f 不停地读取文件的最新内容,有监视文件的效果
]

5.计算你还有多少天几小时过生日(1.先让用户输入日期 2.比较现有日期)
方法一:
#!/bin/bash
echo “This program will try to calculate your birthday:”
echo “How many days about your demobilization date….”
read -p “Please input your demobilization date (YYYYMMDD ex>20050401):” date2
date_d=`echo $date2|grep ‘[0-9]\{8\}’`
if [ $date_d == “” ];then
echo “you input the wrong of date ….”
exit 1
fi
declare -i date_dem=`date –date=”$date2″ +%s`
declare -i date_now=`date +%s`
declare -i date_total_s=$(($date_dem-$date_now))
declare -i date_d=$(($date_total_s/60/60/24))
if [ “$date_total_s” -lt 0 ];then
echo “you had been demobilization before: “$((-1*$date_d))” ago”
else
declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
echo “you will be demobilized after $date_d days and $date_h hours”
fi

6.用户输入一个目录,然后打印出这个目录下文件夹权限
#!/bin/bash
read -p “Please input a directory:” dir
if [ “$dir” == “” ] || [ ! -d “$dir” ];then
echo “Please input a right directory!!”
else
echo “the $dir is ok”
fi
filelist=`ls $dir`
for filename in $filelist
do
perm=””
test -x “$dir/$filename” && perm=”$perm executable”
test -w “$dir/$filename” && perm=”$perm writeable”
test -r “$dir/$filename” && perm=”$perm readable”
echo “The file $dir/$filename’s permission is $perm”
done

7.我么知道/etc/passwd 中以(:)来分隔,第一栏为账号名。请编写程序将/etc/passwd的第一栏取出,而且每一栏都以一行字符串”the $1 account is ‘root'”
#!/bin/bash
accounts=`awk -F ‘:’ ‘{print $1}’ /etc/passwd`
for member in $accounts
do
declare -i i
i=$i+1
echo “the $i account is $member”
done

8.打印根目录下,目录文件名超过10Mb文件
#!/bin/bash
dir=(`ls -l /|grep ‘^d’|grep -v “proc”|awk ‘{print $9}’`)
for i in ${dir[*]}
do
a=(`du -sk /$i|awk ‘{print $1}’`)
for m in $a
do
if [ $m -lt 10000 ]
then
echo “the $i than 10MB”
else
echo “the $i less 10MB”
fi
done
done

linux-shell面试题

分析apache日志,给出当日访问ip的降序列表。
一句话思路:分析ip就要提取ip,提取的办法除了awk,还有个东西叫cut。
cut  -d ” ”   -f1   /etc/httpd/log/access_log  |  sort  |  uniq  -c  |  sort  -nr
知识点:cut命令,sort将汇总相同内容,uniq -c合并重复内容,并给出重复次数。sort  -nr  使用数字排序,默认是ascii,并且是降序,默认是升序。
awk      ‘{sum[ip]++}END{for(var in sum)print ip sum[var]}’   /etc/httpd/log/access_log  | sort -k2 -nr
知识点:awk数据,sort -k2 -nr 降序数字排序就不说了,-k参数指定使用哪个列进行排序。默认是自然是第一列。
1、编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。
一句话思路:找出规律,循环解决
for((i=1;i<51;i++));do userdel -r stud$i ;done
知识点:for循环,当然是用while循环也是可以的,until也行。

2、某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;
(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;
(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

一句话思路:主要考验管理员对于计划任务的熟悉程度
crontab -e
50 16 * * * rm -rf /abc/*
* 8-18/1 * * * awk ‘{print $1 > “/backup/bak01.txt”}’ /xyz/x1
50 17 * * 1 tar -czf backup.tar.gz /data

知识点:awk的输出重定向,当然用管道也是可以的。tar命令打包参数,这样做会有一个提示,只是去掉了目录不用理会。

3、gameser这个服务启动命令为./gameser服务,请写一个脚本,当服务宕掉,脚本自动拉起gameser服务。

一句话思路:进程管理

#!/bin/bash

while true;do

result=`ps aux | grep gameser | wc -l`

if [ $result -lt 2 ];then  ./gameser; fi

sleep 5
done

知识点:还可以使用pgrep命令。

4、linux crontab;请在3月23号21点18分的时候,重启服务器

一句话思路:计划任务+关机

crontab -e
18 21 23 3 * init 6

知识点:可能会延展提问到最安全的关机命令,“写缓存”sync 最好两遍,有人说三遍,其实四遍也行,要不干脆还是别关机了!

5、你想每天23:00运行xxxx.sh脚本。并自动进行日志分析。第2天上班的时候看到分析结果 给出你的部属方案

一句话思路:计划任务,日志分析

0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err

知识点:第一个参数一定要写零,否则在定义的23点里每分钟都会执行。计划任务只有当报错的时候才会以邮件形式发送给用户,所以这里使用logger命令将消息发送给日志服务器,这里只是发送了命令返回值,你可以随意发送内容,看你喜欢了。

6、要求:运行脚本输入两个数得到如下结果:

#sh xxx.sh 2 3
**
***
*****

一句话思路:看到这个第一反应就是循环呗。

#!/bin/bash
line1=$1
line2=$2
let line3=$1+$2
while [ $line1 -gt 0 ];do
echo -n *
let line1=$line1-1
done
echo
while [ $line2 -gt 0 ];do
echo -n *
let line2=$line2-1
done
echo
while [ $line3 -gt 0 ];do
echo -n *
let line3=$line3-1
done
echo

知识点:如果你的第一反应是使用循环,那就进入一个死循环了,因为根本就没有规律。我们都知道,循环是依靠一定规律的。echo 的 -n参数。*在shell中是通配符,所以要加转义字符。(希望你能给出更好的解决方案!)

9、查找文件后缀是log的 三天前的文件删除

一句话思路:查找就一定是find

find / -name “*.log” -and -mtime +3 -exec rm -rf {} ;

知识点:-mtime  + 代表后面数字之外的,- 就是之内的。

10、写一个脚本将目录下大于100kb的文件移动到/tmp下

一句话思路:同上

find ./ -size +100k -exec mv {}  /tmp ;

知识点:-exec  {}  ; 标准写法,没有好办法,背吧。

11 、日志如下统计访问IP最多的前10个

192.168.0.6 – – [25/Nov/2010:13:55:10 +0800] “GET /cacti/images/auth_login.gif HTTP/1.1” 200 21265 “http://192.168.0.104/cacti/graph_view.php?action=tree&tree_id=2&leaf_id=8&page=3” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)”
192.168.0.6 – – [25/Nov/2010:13:55:14 +0800] “GET /favicon.ico HTTP/1.1” 404 287 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)

这个题在前一篇中已经给出答案,这里就不再赘述。

http://7648853.blog.51cto.com/4990508/851407

12、过滤出当前目录下所有以字母(不区分大小写)开头的文件

一句话思路:过滤就是grep

ls | grep -P “^[a-zA-Z]”

ls | grep -P -i “^[a-z]”

知识点:正则表达式,使用-i参数让grep命令不区分大小写。

13、文件A.txt内容为”12:34:68″,只输出A.txt中的”34″

一句话思路:提取内容就是awk

awk  -F “:” ‘{print $2}’ A.txt

知识点:awk 域,-F参数指定分隔符,默认分隔符是空格。

14、用sed命令实现直接将文件B.TXT中的所有123替换成345

一句话思路:没思路了,人家都说了用sed

sed -i ‘s/123/456/g’ B.TXT

知识点:-i参数让sed修改文件,默认不修改源文件。题目中提到了所有字样,所以要使用g参数。

15、用sed修改文件mailbox.txt的20行的zhango为wang

一句话思路:命题作文sed,没有瞎想空间

sed -i ’20s/zhango/wang/’ mailbox.txt

知识点:上题是全局,这题规定了行。如果写成这样”/20/”,就是正则表达式了。

16、正则表达式,IP地址的匹配,写一下

一句话思路:遥想当年,web开发程序员面试不出意外的第一道题。

([0-9]{1,3}.){1,3}([0-9]){1,3}

知识点:正则表达式,写个简单的,这个答案不严谨,但考虑到只是面试,所以将就将就也能用。

17、写出命令。统计日志文件weblog.log中 今天14:00~15:00的记录条数(时间格式:2011-01-01—15:30:11)

一句话思路:第一反应,这个要用awk,分析统计嘛。可真要用awk麻烦就大了。

sum14=`grep -c “2011-01-01-14” weblog.log`
sum15=`grep -c “2011-01-01-15” weblog.log`
echo $[$sum14+$sum15]

知识点:grep命令-c参数,统计匹配的行数。shell中的数学计算。

18、求一组数的最大值和最小值

一句话思路:运维越来越像开发了,冒泡法都有了。越来越难混了,一个运维不看手册,要看算法了。

知识点:去看书吧,看算法的。

19、将当前目录所有文件扩展名改为log

一句话思路:如果你的第一反应是使用find命令,那么恭喜你,你中了敌人的奸计,不是不能实现,是很麻烦。

for file in `ls ./ | grep -P “(.*)(..*)”`;do  echo $file | mv $file `sed -r ‘s#(.*)(..*)#1.log#’`; done

for file in `ls ./ | grep -P “(.*)(..*)”`;do  echo $file | mv $file `echo ${file%.**}`.log; done

知识点:第一个方法中使用了sed,第二个方法中使用了字符操作,#从前向后数,%从后向前数。其实说白了,就是为了拼凑出 mv 参数1 参数2。其实很多时候,编写shell脚本的时候要学会反向推导,逆向思考。

还有一种方法是使用cut命令,但如果遇到文件有两个扩展名的情况下就会出现问题。redhat as4 安装完成后,在root目录下会生成install.log  install.log.syslog这两个文件,如果使用cut就会出现错误。具体原因在这里就不说了。运维嘛,需要的是严谨!

20、用shell在/usr/local下 建立20个子目录 xunlei1-xunlei20,再在这个子目录下分别建255个子目录dir1-dir255,再在255个子目录下创建10000个文件xunlei1.html-xunlei10000.html

一句话思路:这有啥,{}大括号呗。

mkdir -p /usr/loca/xunlie{1..20}/dir{1..255}/

touch   /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html

知识点:如果你就这么写上去,那你又中计了。为什么呢,因为超过了shell命令参数的最大限制。shell中参数的限制是:5452。所以要分着写。

CentOS 7修复MBR和GRUB

一、修复MBR:

MBR(Master Boot Record主引导记录):

硬盘的0柱面、0磁头、1扇区称为主引导扇区。其中446Byte是bootloader,64Byte为Partition table,剩下的2Byte为magic number。

备份MBR:

#dd if=/dev/sda of=/root/mbr.bak count=1 bs=512

破坏bootloader:

#dd if=/dev/zero of=/dev/sda count=1 bs=200

这里边block size只要小于等于446即可。

修复方式:

1、借助其他系统挂载磁盘修复。

修复方式同光盘修复类似,也是使用grub2-install命令。

2、借助安装光盘修复。

1.装入光盘,在光盘引导界面选择troubleshooting:

2.选择进入救援模式:

3.按回车键继续:

4.进入磁盘挂载选择模式:

磁盘将会被挂载至/mnt/sysimage/下

continue 以rw方式挂载分区。

read only 以ro方式挂载分区。

skip 跳过,将来自己手工挂载磁盘。

5.选择continue,稍等片刻,提示已经挂载完成。

6.此时进入救援模式的命令行:

7.使用grub2-install命令重建bootloader:

#grub2-install root-directory=/mnt/sysimage /dev/sda

显示无错误,使用sync写入硬盘,reboot重启系统。

8.重启后无错误,grub正常运行:

至此,MBR修复完成。

二、修复grub

grub配置文件丢失:

开机后会直接进入grub界面,显示为grub>:

修复步骤如下:

grub>insmod xfs

grub>set root=(hd0,1)

grub>linux16 /vmlinuz-xxxxx root=/dev/mapper/centos-root

grub>initrd16 /initramfs-.xxxxx.img

修复完成后即可进入系统,重建配置文件。

注意:CentOS7因为使用的是grub2,配置文件同grub有不少变化,一定要切记备份grub.cfg以便恢复。