性能测试简介

什么是服务端性能测试?

  • 以功能实现正确为前提
  • 通常有一定的并发用户
  • 重点考察服务器端在一定并发压力下的性能指标

通常,对服务器端应用程序开展性能测试,是为了验证软件系统是否能够达到预期的性能指标,同时发现软件系统中存在的性能瓶颈,从而实现优化系统的目的。

性能测试类型

根据不同的测试目的,性能测试可以分为多种类型,常见的有如下几类:

  • 基准测试(Standard Testing)
  • 负载测试(Load Testing)
  • 压力测试(Stress Testing)
  • 疲劳强度测试
  • 稳定性测试
  • 容量测试

基准测试

基准测试指的是模拟单个用户执行业务场景时,考察系统的性能指标。严格意义上来讲,基准测试并不能算作性能测试范畴,它跟功能测试并没有太大区别。差异在于,基准测试的目的更多地是关注业务功能的正确性,或者说验证测试脚本的正确性,然后,将基准测试时采集得到的系统性能指标,作为基准测试结果,为后续并发压力测试的性能分析提供参考依据。

负载测试

一种验证性测试,它的目的是验证预设负载条件下的性能表现是否达到性能目标(可用性、并发数/RPS、响应时间等),在达到性能目标之后不会继续增加负载。

通过负载测试,目的是验证系统是否能满足预期的业务压力场景。

压力测试

通俗地讲,压力测试是为了发现在多大并发压力下系统的性能会变得不可接受,或者出现性能拐点(崩溃)的情况。在加压策略上,压力测试会对被测系统逐步加压,在加压的过程中考察系统性能指标的走势情况,最终找出系统在出现性能拐点时的并发用户数,也就是系统支持的最大并发用户数。

开展压力测试主要用于探测应用或者应用的支撑基础设施某些部分的极限能力。通过一直增加负载,直到应用的部分功能不能正常工作,目的是找到被测系统的容量天花板。

疲劳强度测试

疲劳强度测试的加压策略跟负载测试也很接近,都是对系统模拟出系统能承受的最大业务负载量,差异在于,疲劳强度测试更关注系统在长时间运行情况下系统性能指标的变化情况,例如,系统在运行一段时间后,是否会出现事务处理失败、响应时间增长、业务吞吐量降低、CPU/内存资源增长等问题。

稳定性测试

稳定性测试会把用户真实会发生的场景放大3-5倍,然后在线上运行24小时,在这个阶段会发现很多稳定性问题。

容量测试

往往与容量规划一起进行,是在保证用户体验不受影响(稳定性)的前提下,使有限的资源的利用率最大化(成本)。也可以用它来预估未来用户量增长到某个量级的情况下,需要多少资源(例如处理器、内存、磁盘、网络带宽)来支持。

通常负载测试是最典型的性能测试类型。

指标介绍

从维度上划分,性能指标主要分为两大类,分别是业务性能指标系统资源性能指标

业务性能指标可以直观地反映被测系统的实际性能状况,常用的指标项有:

  • 并发用户数
  • 事务吞吐率(TPS/RPS)
  • 事务平均响应时间
  • 事务成功率

系统资源性能指标,主要是反映整个系统环境的硬件资源使用情况,常用的指标包括:

服务器:

  • CPU利用率、处理器队列长度、内存利用率、内存交换页面数、磁盘IO状态、网卡带宽使用情况等;

数据库:

  • 数据库连接数、数据库读写响应时长、数据库读写吞吐量等;

网络:

  • 网络吞吐量、网络带宽、网络缓冲池大小;

缓存(Redis):

  • 静态资源缓存命中率、动态数据缓存命中率、缓存吞吐量等;

测试设备(压力发生器):

  • CPU利用率、处理器队列长度、内存利用率、内存交换页面数、磁盘IO状态、网卡带宽使用情况等。

可能对于最后一项(测试设备)有些人不大理解,监控被测系统环境的相关硬件资源使用情况不就好了么,为什么还要关注测试设备本身呢?这是因为测试设备在模拟高并发请求的过程中,设备本身也会存在较高的资源消耗,例如CPU、内存、网卡带宽吃满,磁盘IO读写频繁,处理器排队严重等;当出现这类情况后,测试设备本身就会出现瓶颈,无法产生预期的并发压力,从而我们测试得到的数据也就不具有可参考性了。

性能瓶颈定位的重点在于性能指标的监控和分析。

场景构造

性能测试的主要手段是通过产生模拟真实业务的压力对被测系统进行加压,与此同时监控被测系统的各项性能指标,研究被测系统在不同压力情况下的表现,找出其潜在的性能瓶颈。

性能测试手段的重点在于加压的方式和策略。

能指标之间通常都是有密切关联的,单纯地看某个指标往往很难定位出性能瓶颈,举个简单的例子,压力测试时发现服务器端CPU利用率非常高,那这个能说明什么问题呢?是服务端应用程序的算法问题,还是服务器硬件资源配置跟不上呢?光看这一个指标并不能定位出产生问题的真正原因,而如果仅因为这一点,就决定直接去优化程序算法或者升级服务器配置,最后也很难真正地解决问题。

性能优化

性能优化的核心在我看来其实就是一个充分利用系统资源并平衡IO的过程。这句话怎么理解,首先在保证代码没有问题的情况下,充分利用系统的cpu、内存、磁盘资源,一般来说在保证cpu、内存都消耗到80%以上基本上就达到了性能峰值了,但是我们在压测过程中常常遇到的问题是cpu、内存消耗都不高,而是卡在了IO上,IO包括了磁盘IO、数据库IO、网络IO,我们需要根据监控的数据从这3方面去找到瓶颈,并去解决IO的问题。一般来说造成这种情况一般都是因为IO聚集导致了阻塞,可以考虑采用缓存、异步的方式去解决,对于一些关键交易的事务的完整性可以考虑采用先缓存最后通过缓存同步数据库的方式来保证最终一致性。

对单个系统的优化,其实方法有很多,但是万变不离其宗,就是在压测过程中监控系统各项指标,从中挑出慢交易,针对慢交易进行优化,对于联机系统大部分都是因为各种IO问题导致性能上不去。可以根据各种介质IO访问的性能来优化(内存缓存>文件>数据库>网络),基本上通过缓存和异步处理这两颗银弹就可以解决80%的性能问题。

CPU

CPU资源利用率很高的话,需要看CPU消耗User,Sys,Wait那种状态下。

如果CPU User非常高,需要查看消耗在哪个进程,可以用top(linux)命令看出,接着用top –H –p 看哪个线程消耗资源高,如果是java应用,就可以用jstack看出此线程正在执行的堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在;如果是c++应用,可以用gprof性能工具进行分析。

如果CPU Sys非常高,可以用strace(linux)看系统调用的资源消耗及时间。

如果CPU Wait非常高,考虑磁盘读写了,可以通过减少日志输出、异步或换速度快的硬盘。

怎么看CPU消耗User,Sys,Wait那种状态?

1.利用vmstat命令监控系统CPU显示系统各种资源之间相关性能简要信息,主要看CPU负载情况。

下面是vmstat命令在某个系统的输出结果:

[root@node1 ~]#vmstat 2 3procs ———–memory———- —swap– —–io—- –system– —–cpu——r  b swpd freebuff  cache si so bi bo incs us sy idwa st0  0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 00  0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 00  0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0Procsr--运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU

b--在等待资源的进程数,比如正在等待I/O、或者内存交换等。

CPUus用户进程消耗的CPU 时间百分比。

us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。

sy内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。

根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。

2.利用sar命令监控系统CPUsar对系统每方面进行单独统计,但会增加系统开销,不过开销可以评估,对系统的统计结果不会有很大影响。

下面是sar命令对某个系统的CPU统计输出:

[root@webserver ~]# sar -u 3 5Linux 2.6.9-42.ELsmp (webserver) 11/28/2008_i686_ (8 CPU)11:41:24 AM CPU %user %nice%system %iowait %steal %idle11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.8311:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.5011:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.9211:41:36 AM all 90.08 0.00 0.13 0.16 0.00 9.6311:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41Average: all 0.34 0.00 0.16 0.05 0.00 99.45输出解释如下:

%user列显示了用户进程消耗的CPU 时间百分比。%nice列显示了运行正常进程所消耗的CPU 时间百分比。%system列显示了系统进程消耗的CPU时间百分比。%iowait列显示了IO等待所占用的CPU时间百分比%steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。%idle列显示了CPU处在空闲状态的时间百分比。问题你是否遇到过系统CPU整体利用率不高,而应用缓慢的现象?

在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致了整体CPU使用率不高,而应用缓慢现象的发生。

Memory

操作系统未了最大化利用内存,一般都设置大量的cache,因此,内存利用率高达99%并不是问题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。

内存性能评估

1.利用free指令监控内存free是监控Linux内存使用状况最常用的指令,看下面的一个输出:

[root@webserver ~]# free -mtotal used freeshared buffers cachedMem: 8111 7185 926 0 243 6299 -/+ buffers/cache: 643 7468Swap: 8189 0 8189经验公式:

应用程序可用内存/系统物理内存>70%,表示系统内存资源非常充足,不影响系统性能;

应用程序可用内存/系统物理内存<20%,表示系统内存资源紧缺,需要增加系统内存;

20%<应用程序可用内存/系统物理内存<70%,表示系统内存资源基本能满足应用需求,暂时不影响系统性能

2.利用vmstat命令监控内存

[root@node1 ~]# vmstat 2 3procs ———–memory———- —swap– —–io—- –system– —–cpu——r b swpd freebuff cache si so bi bo incs us sy idwa st0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 00 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 00 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0memory

swpd--切换到内存交换区的内存数量(k为单位)。如swpd值偶尔非0,不影响系统性能free--当前空闲的物理内存数量(k为单位)buff--buffers cache的内存数量,一般对块设备的读写才需要缓冲cache--page cached的内存数量

一般作为文件系统cached,频繁访问的文件都会被cached,如cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。

swap

si--由磁盘调入内存,也就是内存进入内存交换区的数量。so--由内存调入磁盘,也就是内存交换区进入内存的数量。si、so的值长期不为0,表示系统内存不足。需增加系统内存。

磁盘I/O

磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘。

1.磁盘存储基础频繁访问的文件或数据尽可能用内存读写代替直接磁盘I/O,效率高千倍。

将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。

 

对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。

裸设备优点:

数据可直接读写,不需经过操作系统级缓存,节省内存资源,避免内存资源争用;避免文件系统级维护开销,如文件系统需维护超级块、I-node等;避免了操作系统cache预读功能,减少了I/O请求使用裸设备的缺点是:

数据管理、空间管理不灵活,需要很专业的人来操作。

利用iostat评估磁盘性能

[root@webserver ~]# iostat -d 2 3Linux 2.6.9-42.ELsmp (webserver) 12/01/2008_i686_ (8 CPU) Device: tps Blk_read/sBlk_wrtn/sBlk_read Blk_wrtnsda 1.87 2.58 114.12 6479462 286537372 Device: tps Blk_read/sBlk_wrtn/sBlk_read Blk_wrtnsda 0.00 0.00 0.00 0 0 Device: tps Blk_read/sBlk_wrtn/sBlk_read Blk_wrtnsda 1.00 0.00 12.00 0 24解释如下:

Blk_read/s--每秒读取数据块数Blk_wrtn/s--每秒写入数据块数Blk_read--读取的所有块数Blk_wrtn--写入的所有块数可通过Blk_read/s和Blk_wrtn/s值对磁盘的读写性能有一个基本的了解.

如Blk_wrtn/s值很大,表示磁盘写操作频繁,考虑优化磁盘或程序,

如Blk_read/s值很大,表示磁盘直接读操作很多,可将读取的数据放入内存

规则遵循:

 

长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。

3.利用sar评估磁盘性能

通过“sar –d”组合,可以对系统的磁盘IO做一个基本的统计,请看下面的一个输出:

[root@webserver ~]# sar -d 2 3Linux 2.6.9-42.ELsmp (webserver) 11/30/2008_i686_ (8 CPU)11:09:33 PM DEV tps rd_sec/swr_sec/savgrq-sz avgqu-sz await svctm %util11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0011:09:35 PM DEV tps rd_sec/swr_sec/savgrq-sz avgqu-sz await svctm %util11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.0011:09:37 PM DEV tps rd_sec/swr_sec/savgrq-sz avgqu-sz await svctm %util11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05Average: DEV tps rd_sec/swr_sec/savgrq-sz avgqu-sz await svctm %utilAverage: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02参数含义:

await--平均每次设备I/O操作等待时间(毫秒)svctm--平均每次设备I/O操作的服务时间(毫秒)%util--一秒中有百分之几的时间用于I/O操作对磁盘IO性能评判标准:

正常svctm应小于await值,而svctm和磁盘性能有关,CPU、内存负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。

await值取决svctm和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。%util--衡量磁盘I/O重要指标,

 

如%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷工作,该磁盘可能存在瓶颈。

可优化程序或者 通过更换 更高、更快的磁盘。

网络I/O

网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩、减少内容大小、在本地设置缓存以及分多次传输等。

(1)通过ping命令检测网络的连通性

(2)通过netstat –i组合检测网络接口状况

(3)通过netstat –r组合检测系统的路由表信息

(4)通过sar –n组合显示系统的网络运行状态

内核参数

内核参数一般都有默认值,这些内核参数默认值对于一般系统没问题,但是对于压力测试来说,可能运行的参数将会超过内核参数,导致系统出现问题,可以用sysctl来查看及修改。

JVM

jvm主要分析GC/FULL GC是否频繁,以及垃圾回收的时间,可以用jstat命令来查看,对于每个代大小以及GC频繁,通过jmap将内存dump,再借助工具HeapAnalyzer来分析哪地方占用的内存较高以及是否有内存泄漏可能。

线程池

如果线程不够用,可以通过参数调整,增加线程;对于线程池中的线程设置比较大的情况,还是不够用可能的原因是:某个线程被阻塞来不及释放,可能在等锁、方法耗时较长、数据库等待时间很长等原因导致,需要进一步分析才能定位。

JDBC连接池

连接池不够用的情况下,可以通过参数进行调整增加;但是对于数据库本身处理很慢的情况下,调整没有多大的效果,需要查看数据库方面以及因代码导致连接未释放的原因。

SQL

SQL效率低下也是导致性能差的一个非常重要的原因,可以通过查看执行计划看SQL慢在哪里,一般情况,SQL效率低下原因主要有:

类别

子类

表达式或描述

原因

索引

未建索引

 

产生全表扫描

 

未利用索引

substring(card_no,1,4)=′5378′

产生全表扫描

 

 

amount/30< 1000

产生全表扫描

 

 

convert(char(10),date,112)=′19991201′

产生全表扫描

 

 

where salary<>3000

产生全表扫描

 

 

name like ‘%张’

产生全表扫描

 

 

first_name + last_name =’beill cliton’

产生全表扫描

 

 

id_no in(′0′,′1′)

产生全表扫描

 

 

select id from t where num=@num

有参数也会产生全表扫描

 

使用效能低的索引

oder by 非聚族索引

索引性能低

 

 

username=’张三’ and age>20

字符串索引低于整形索引

 

 

表中列与空NULL值

索引性能低

 

 

尽量不要使用IS NULL或IS NOT NULL

索引性能低

数据量

所有数据量

select *

很多列产生大量数据

 

 

select id,name

表中有几百万行,产生大量数据

 

嵌套查询

先不过滤数据,后过滤数据

产生大量无用的数据

 

关联查询

多表进行关联查询,先过滤掉小部分数据,在过滤大部分数据

大量关联操作

 

大数据量插入

一次次插入

产生大量日志,消耗资源

锁等待

update account set banlance=100 where id=10

产生表级锁,将会锁住整个表

 

死锁

A:update a;update b;B:update b;update a;

将会产生死锁

 

游标

Cursor Open cursor,fetch;close cursor

性能很低

 

临时表

create tmp table 创建临时表

产生大量日志

 

drop table

删除临时表

需要显示删除,避免系统表长时间锁定

其他

exist 代替 IN

select num from a where num in(select num from b)

in会逐个判断,exist有一条就结束

 

exist 代替select count(*)

判断记录是否存在

count(*)将累加计算,exist有就结束

 

between 代替 IN

ID in(1,2,3)

IN逐个判断,between是范围判断

 

left outer join 代替Not IN

select ID from a where ID not in(select b.Mainid from b)

NOT IN逐个判断,效率非常低

 

union all 代替union

select ID from a union select id from b union

删除重复的行,可能会在磁盘进行排序而union all只是简单的将结果并在一起

 

常用SQL尽量用绑定变量方法

insert into A(ID) values(1)

直接写SQL每次都要编译,用绑定变量的方法只编译一次,下次就可以用了

调优步骤

确定问题

  • 应用程序代码:在通常情况下,很多程序的性能问题都是写出来的,因此对于发现瓶颈的模块,应该首先检查一下代码。
  • 数据库配置:经常引起整个系统运行缓慢,一些诸如大型数据库都是需要DBA进行正确的参数调整才能投产的。
  • 操作系统配置:不合理就可能引起系统瓶颈。
  • 硬件设置:硬盘速度、内存大小等都是容易引起瓶颈的原因,因此这些都是分析的重点。 网络:网络负载过重导致网络冲突和网络延迟。

分析问题

当确定了问题之后,我们要明确这个问题影响的是响应时间吞吐量,还是其他问题?是多数用户还是少数用户遇到了问题?如果是少数用户,这几个用户与其它用户的操作有什么不用?系统资源监控的结果是否正常?CPU的使用是否到达极限?I/O 情况如何?问题是否集中在某一类模块中? 是客户端还是服务器出现问题? 系统硬件配置是否够用?实际负载是否超过了系统的负载能力? 是否未对系统进行优化? 通过这些分析及一些与系统相关的问题,可以对系统瓶颈有更深入的了解,进而分析出真正的原因。

确定调整目标和解决方案

高系统吞吐量,缩短响应时间,更好地支持并发。

测试解决方案

对通过解决方案调优后的系统进行基准测试。(基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试)。

分析调优结果

系统调优是否达到或者超出了预定目标?系统是整体性能得到了改善,还是以系统某部分性能来解决其他问题。调优是否可以结束了。 最后,如果达到了预期目标,调优工作就基本可以结束了。

Linux服务器性能调优

1.为磁盘I/O调整Linux内核电梯算法选择文件系统后,该算法可以平衡低延迟需求,收集足够数据,有效组织对磁盘读写请求。

2.禁用不必要的守护进程,节省内存和CPU资源许多守护进程或服务通常非必需,消耗宝贵内存和CPU时间。将服务器置于险地。禁用可加快启动时间,释放内存。减少CPU要处理的进程数一些应被禁用的Linux守护进程,默认自动运行:

序号 守护进程 描述

1 Apmd 高级电源管理守护进程

2 Nfslock 用于NFS文件锁定

3 Isdn ISDN Moderm支持

4 Autofs 在后台自动挂载文件系统(如自动挂载CD-ROM)

5 Sendmail 邮件传输代理

6 Xfs X Window的字体服务器

3.关掉GUI4、清理不需要的模块或功能服务器软件包中太多被启动的功能或模块实际上是不需要的(如Apache中的许多功能模块),禁用掉有助于提高系统内存可用量,腾出资源给那些真正需要的软件,让它们运行得更快。

5、禁用控制面板在Linux中,有许多流行的控制面板,如Cpanel,Plesk,Webmin和phpMyAdmin等,禁用释放出大约120MB内存,内存使用量大约下降30-40%。

6、改善Linux Exim服务器性能使用DNS缓存守护进程,可降低解析DNS记录需要的带宽和CPU时间,DNS缓存通过消除每次都从根节点开始查找DNS记录的需求,从而改善网络性能。

Djbdns是一个非常强大的DNS服务器,它具有DNS缓存功能,Djbdns比BIND DNS服务器更安全,性能更好,可以直接通过http://cr.yp.to/下载,或通过Red Hat提供的软件包获得。

7、使用AES256增强gpg文件加密安全为提高备份文件或敏感信息安全,许多Linux系统管理员都使用gpg进行加密,在使用gpg时,最好指定gpg使用AES256加密算法,AES256使用256位密钥,它是一个开放的加密算法,美国国家安全局(NSA)使用它保护绝密信息。

8、远程备份服务安全安全是选择远程备份服务最重要的因素,大多数系统管理员都害怕两件事:(黑客)可以删除备份文件,不能从备份恢复系统。

为了保证备份文件100%的安全,备份服务公司提供远程备份服务器,使用scp脚本或RSYNC通过SSH传输数据,这样,没有人可以直接进入和访问远程系统,因此,也没有人可以从备份服务删除数据。在选择远程备份服务提供商时,最好从多个方面了解其服务强壮性,如果可以,可以亲自测试一下。

9、更新默认内核参数设置为了顺利和成功运行企业应用程序,如数据库服务器,可能需要更新一些默认的内核参数设置,例如,2.4.x系列内核消息队列参数msgmni有一个默认值(例如,共享内存,或shmmax在Red Hat系统上默认只有33554432字节),它只允许有限的数据库并发连接,下面为数据库服务器更好地运行提供了一些建议值(来自IBM DB2支持网站):

kernel.shmmax=268435456 (32位)

kernel.shmmax=1073741824 (64位)

kernel.msgmni=1024

fs.file-max=8192

kernel.sem=”250 32000 32 1024″

10、优化TCP优化TCP协议有助于提高网络吞吐量,跨广域网的通信使用的带宽越大,延迟时间越长时,建议使用越大的TCP Linux大小,以提高数据传输速率,TCP Linux大小决定了发送主机在没有收到数据传输确认时,可以向接收主机发送多少数据。

11、选择正确的文件系统

使用ext4文件系统取代ext3

● Ext4是ext3文件系统的增强版,扩展了存储限制

●具有日志功能,保证高水平的数据完整性(在非正常关闭事件中)

●非正常关闭和重启时,它不需要检查磁盘(这是一个非常耗时的动作)

●更快的写入速度,ext4日志优化了硬盘磁头动作

12、使用noatime文件系统挂载选项在文件系统启动配置文件fstab中使用noatime选项,如果使用了外部存储,这个挂载选项可以有效改善性能。

13、调整Linux文件描述符限制Linux限制了任何进程可以打开的文件描述符数量,默认限制是每进程1024,这些限制可能会阻碍基准测试客户端(如httperf和apachebench)和Web服务器本身获得最佳性能,Apache每个连接使用一个进程,因此不会受到影响,但单进程Web服务器,如Zeus是每连接使用一个文件描述符,因此很容易受默认限制的影响。

打开文件限制是一个可以用ulimit命令调整的限制,ulimit -aS命令显示当前的限制,ulimit -aH命令显示硬限制(在未调整/proc中的内核参数前,你不能增加限制)。

Linux第三方应用程序性能技巧

对于运行在Linux上的第三方应用程序,一样有许多性能优化技巧,这些技巧可以帮助你提高Linux服务器的性能,降低运行成本。

14、正确配置MySQL为了给MySQL分配更多的内存,可设置MySQL缓存大小,要是MySQL服务器实例使用了更多内存,就减少缓存大小,如果MySQL在请求增多时停滞不动,就增加MySQL缓存。

15、正确配置Apache检查Apache使用了多少内存,再调整StartServers和MinSpareServers参数,以释放更多的内存,将有助于你节省30-40%的内存。

16、分析Linux服务器性能提高系统效率最好的办法是找出导致整体速度下降的瓶颈并解决掉,下面是找出系统关键瓶颈的一些基本技巧:

● 当大型应用程序,如OpenOffice和Firefox同时运行时,计算机可能会开始变慢,内存不足的出现几率更高。

● 如果启动时真的很慢,可能是应用程序初次启动需要较长的加载时间,一旦启动好后运行就正常了,否则很可能是硬盘太慢了。

●CPU负载持续很高,内存也够用,但CPU利用率很低,可以使用CPU负载分析工具监控负载时间。

17、学习5个Linux性能命令使用几个命令就可以管理Linux系统的性能了,下面列出了5个最常用的Linux性能命令,包括

top、vmstat、iostat、free和sar,它们有助于系统管理员快速解决性能问题。

(1)top当前内核服务的任务,还显示许多主机状态的统计数据,默认情况下,它每隔5秒自动更新一次。

如:当前正常运行时间,系统负载,进程数量和内存使用率,

此外,这个命令也显示了那些使用最多CPU时间的进程(包括每个进程的各种信息,如运行用户,执行的命令等)。

(2)vmstatVmstat命令提供当前CPU、IO、进程和内存使用率的快照,它和top命令类似,自动更新数据,如:

$ vmstat 10

(3)iostatIostat提供三个报告:CPU利用率、设备利用率和网络文件系统利用率,使用-c,-d和-h参数可以分别独立显示这三个报告。

(4)free显示主内存和交换空间内存统计数据,指定-t参数显示总内存,指定-b参数按字节为单位,使用-m则以兆为单位,默认情况下千字节为单位。

Free命令也可以使用-s参数加一个延迟时间(单位:秒)连续运行,如:

$ free -s 5

(5)sar收集,查看和记录性能数据,这个命令比前面几个命令历史更悠久,它可以收集和显示较长周期的数据。

其它

下面是一些归类为其它的性能技巧:

18、将日志文件转移到内存中当一台机器处于运行中时,最好是将系统日志放在内存中,当系统关闭时再将其复制到硬盘,当你运行一台开启了syslog功能的笔记本电脑或移动设备时,ramlog可以帮助你提高系统电池或移动设备闪存驱动器的寿命,使用ramlog的一个好处是,不用再担心某个守护进程每隔30秒向syslog发送一条消息,放在以前,硬盘必须随时保持运转,这样对硬盘和电池都不好。

19、先打包,后写入在内存中划分出固定大小的空间保存日志文件,这意味着笔记本电脑硬盘不用一直保持运转,只有当某个守护进程需要写入日志时才运转,注意ramlog使用的内存空间大小是固定的,否则系统内存会很快被用光,如果笔记本使用固态硬盘,可以分配50-80MB内存给ramlog使用,ramlog可以减少许多写入周期,极大地提高固态硬盘的使用寿命。

20、一般调优技巧尽可能使用静态内容替代动态内容,如果你在生成天气预告,或其它每隔1小时就必须更新的数据,最好是写一个程序,每隔1小时生成一个静态的文件,而不是让用户运行一个CGI动态地生成报告。

为动态应用程序选择最快最合适的API,CGI可能最容易编程,但它会为每个请求产生一个进程,通常,这是一个成本很高,且不必要的过程,FastCGI是更好的选择,和Apache的mod_perl一样,都可以极大地提高应用程序的性能。