文档库 最新最全的文档下载
当前位置:文档库 › spark性能调优

spark性能调优

spark性能调优
spark性能调优

1. 2. 3. 4. 1. 2. 3. 1. 2. 3. 4. Spark性能调优

1 调度与分区优化

小分区合并问题:

频繁的filter过滤或者过滤掉的数据量过大就会产生问题,造成大量小分区的产生(每个分区数据量小)。由于Spark是每个数据分区都会分配一个任务执行,如果任务过多,则每个任务处理的数据量很小,会造成线程切换开销大,很多任务等待执行,并行度不高的问题。解决方式:可以采用RDD中重分区的函数进行数据紧缩,减少分区数,将小分区合并变为大分区。

通过coalesce函数来减少分区。

倾斜问题: 倾斜(skew)有数据倾斜和任务倾斜两种情况,数据倾斜导致的结果即为任务倾斜,在个别分区上,任务执行时间过长。

的原因大致有以下几种:

数据倾斜1)key的数据分布不均匀(一般是分区key取得不好或者分区函数设计得不好)。

2)业务数据本身就会产生数据倾斜(像TPC-DS为了模拟真实环境负载特意用有倾斜的数据进行测试)。

3)结构化数据表设计问题。

4)某些SQL语句会产生数据倾斜。

解决方案:

1)增大任务数,减少每个分区数据量:增大任务数,也就是扩大分区量,同时减少单个分区的数据量。

2)对特殊key处理:空值映射为特定Key,然后分发到不同节点,对空值不做处理。

3)广播。 ①小数据量表直接广播。 ②数据量较大的表可以考虑切分为多个小表,多阶段进行Map Side Join。

4)聚集操作可以Map端聚集部分结果,然后Reduce端合并,减少Reduce端压力。

5)拆分RDD:将倾斜数据与原数据分离,分两个Job进行计算。

产生任务倾斜的原因较为隐蔽,一般就是那台机器的正在执行的Executor执行时间过长,因为服务器架构,或JVM,也可任务倾斜:能是来自线程池的问题,等等。

解决方式:可以通过考虑在其他并行处理方式中间加入聚集运算,以减少倾斜数据量。

数据倾斜一般可以通过在业务上将极度不均匀的数据剔除解决。这里其实还有Skew

Join的一种处理方式,将数据分两个阶段处理,倾斜的key数据作为数据源处理,剩下的key的数据再做同样的处理。二者分开做同样的处理。

产生原因可能是数据倾斜,也可能是执行任务的机器在架构,OS、JVM各节点配置不同或其他原因。

任务执行速度倾斜:解决方式:设置spark.speculation=true把那些执行时间过长的节点去掉,重新调度分配任务。同时可以配置多长时间来推测执行,s park.speculation.interval用来设置执行间隔进行配置。在源码中默认是配置的100。

并行度:

Spark会根据文件的大小,默认配置Map阶段任务数量,也就是分区数量(也可以通过SparkContext.textFile等方法进行配置)。而Re duce的阶段任务数量配置可以有两种方式,1)写函数的过程中通过函数的第二个参数进行配置。2)通过配置spark.default.paralle lism来进行配置。它们的本质原理一致,均是控制Shuffle过程的默认任务数量。

DAG调度执行优化 :

1)同一个Stage中尽量容纳更多的算子,以减少Shuffle的发生。

由于Stage中的算子是按照流水线方式执行的,所以更多的Transformation放在一起执行能够减少Shuffle的开销和任务启动和切换的开销。

2)复用已经cache过的数据。可以使用cache和persist函数将数据缓存在内存,其实用户可以按单机的方式理解,存储仍然是多级存储,数据存储在访问快的存储设备中,提高快速存储命中率会提升整个应用程序的性能。

2 内存存储优化

JVM调优

应用程序中对象所占用的内存空间。计算数据在集群内存占用的空间的大小的最好方法是创建一个RDD,读取这些数据,将数据加载到

cache,在驱动程序的控制台查看SparkContext的日志。这些日志信息会显示每个分区占用多少空间(当内存空间不够时,将数据写到磁盘上),然后用户可以根据分区的总数大致估计出整个RDD占用的空间。

访问这些内存对象的代价。

1)在设计和选用数据结构时能用数组类型和基本数据类型最好,尽量减少一些链式的Java集合或者Scala集合类型的使用。

2)减少对象嵌套。

3)考虑使用数字的ID或者枚举对象,而不是使用字符串作为key键的数据类型。

4)当内存小于32GB时,官方推荐配置JVM参数-XX:+UseCompressedOops,进而将指针由8byte压缩为4byte。

垃圾回收的开销。

1)度量GC的影响。

GC调优的第一步是统计GC的频率和GC的时间开销。可以设置spark-env.sh中的SPARK_JAVA_OPTS参数,添加选项-verbose:gc-XX:+Pr intGCDetails-XX:+PrintGCTime-Stamps。当用户下一次的Spark任务运行时,将会看到worker的日志信息中出现打印GC的时间等信息。

2)缓存大小调优。 对GC来说,一个重要的配置参数就是内存给RDD用于缓存的空间大小。默认情况下,Spark用配置好的Executor

60%的内存(spark.executor.memory)缓存RDD。

3)全局GC调优。 Spark中全局的GC调优要确保只有存活时间长的RDD存储在老年代(Old

generation)区域,这样保证年轻代(Young)有足够的空间存储存活时间短的对象。首先考虑用序列化的方式尝试解决。

OOM调优

检查程序,看是否有死循环或不必要重复创建大量对象的地方。找到原因后,修改程序和算法。有很多Java

profile工具可以使用,官方推荐的是YourKit其他还有JvisualVM、Jcohsole等工具可以使用。

按照之前内存调优中总结的能够减少对象在内存数据存储空间的方法开发程序开发和配置参数。

增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小,如set JAVA_OPTS=-Xms256m-Xmx1024m。

还很可能是Shuffle类操作符在任务执行过程中在内存建立的Hash表过大。在这种情况下,可以通过增加任务数,即分区数来提升并行

性度,减小每个任务的输入数据,减少内存占用来解决。

磁盘临时目录空间优化

配置参数spark.local.dir能够配置Spark在磁盘的临时目录,默认是/tmp目录。Shuffle的过程中,中间结果会写入Spark在磁盘的临时目录中

,或者当内存不能够完全存储RDD时,内存放不下的数据会写到配置的磁盘临时目录中。 这个临 时目录设置过小会造成No space left on device异常。也可以配置多个盘块spark.local.dir=/mn1/spark,/mnt2/spar,/mnt3/spark来扩展Spark的磁盘临时目录,让更多的数据可以写到磁盘,加快I/O速度。

3 网络传输优化

大任务分发优化

在任务的分发过程中会序列化任务的元数据信息,以及任务需要的jar和文件。任务的分发是通过AKKA库中的Actor模型之间的消息传送的。因为Spark采用了Scala的函数式风格,传递函数的变量引用采用闭包方式传递,所以当需要传输的数据通过Task进行分发时,会拖慢整体的执行速度。配置参数spark.akka.frameSize(默认buffer的大小为10MB)可以缓解过大的任务造成AKKA缓冲区溢出的问题,但是这个方式并不能解决本质的问题。

spark.akka.frameSize控制Spark框架内使用的AKKA框架中,Actor通信消息的最大容量(如任务(Task)的输出结果),因为整个Spa rk集群的消息传递都是通过Actor进行的,默认为10MB。当处理大规模数据时,任务的输出可能会大于这个值,需要根据实际数据设置一个更高的值。如果是这个值不够大而产生的错误,则可以从Worker节点的日志中排查。通常Worker上的任务失败后,主节点Master 的运行日志上提示“Lost

TID:”,可通过查看失败的Worker日志文件$SPARK_HOME/work/目录下面的日志文件中记录的任务的Serialized size of

result是否超过10MB来确定通信数据超过AKKA的Buffer异常。

Broadcast在调优场景的使用

Broadcast(广播)变量对数据传输进行优化,通过Broadcast变量将用到的大数据量数据进行广播发送,可以提升整体速度。Broadca st主要用于共享Spark在计算过程中各个task都会用到的只读变量,节省空间,减少传输时间。在Spark的HadoopRDD实现中,就采用Br oadcast进行Hadoop

JobConf的传输。官方文档的说法是,当task大于20KB时,可以考虑使用Broadcast进行优化,还可以在控制台日志看到任务是多大,进而决定是否优化。BroadCast变量有一些应用场景,如MapSideJoin中的小表进行广播、机器学习中需要共享的矩阵的广播等。

Collect结果过大优化

函数通过SparkContext将每个分区执行变为数组,返回主节点后,将所有分区的数组合并成一个数组。这时,如果进行Collect的数据过大,就会产生问题,大量的从节点将数据写回同一个节点,拖慢整体运行时间,或者可能造成内存溢出的问题。

解决方式:当收集的最终结果数据过大时,可以将数据存储在分布式的HDFS或其他分布式持久化层上。将数据分布式地存储,可以减小单机数据的I/O开销和单机内存存储压力。或者当数据不太大,但会超出AKKA传输的Buffer大小时,需要增加AKKA

Actor的buffer,可以通过配置参数spark.akka.frameSize(默认大小为10MB)进行调整。

4 序列化与压缩

通过序列化优化

序列化的本质作用是将链式存储的对象数据,转化为连续空间的字节数组存储的数据。这样的存储方式就会产生以下几个好处。

1)对象可以以数据流方式进行进程间传输(包含网络传输),同样可以以连续空间方式存储到文件或者其他持久化层中。

2)可压缩。这样减少数据存储空间和传输时间。 3)减少了对象本身的元数据信息和基本数据类型的元数据信息的开销。

4)对象数减少也会减少GC的开销和压力。

Spark中提供了两个序列化库和两种序列化方式:使用Java标准序列化库进行序列化的方式和使用Kyro库进行序列化的方式。Java标准序列化库兼容性好,但体积大、速度慢,Kyro库兼容性略差,但是体积小、速度快。所以在能使用Kyro的情况下,还是推荐使用Kyro 进行序列化。

可以通过spark.serializer="org.apache.spark.serializer.KryoSerializer"来配置是否使用Kyro进行序列化,这个配置参数决定了Shuffle进行网络传输和当内存无法容纳RDD将分区写入磁时,使用的序列化器的类型。

通过压缩方式优化

在Spark中对RDD或者Broadcast数据进行压缩,是提高数据吞吐量和性能的一种手段。数据压缩对I/O密集型的作业带来性能的大大提升,但是如果用户的jobs作业是CPU密集型的,那么再压缩就会降低性能,这就要判断作业的类型,权衡是否要压缩数据。

压缩数据,可以最大限度地减少文件所需的磁盘空间和网络I/O的开销,但压缩和解压缩数据总会增加CPU的开销,故最好对那些I/O密集型的作业使用数据压缩。

Spark目前支持LZF和Snappy两种解压缩方式。Snappy提供了更高的压缩速度,LZF提供了更高的压缩比,用户可以根据具体的需求选择压缩方式。

5.其他优化方法

批处理

有些程序可能会调用外部资源,如数据库连接等,这些连接通过JDBC或者ODBC与外部数据源进行交互。如果是一条一条地写,整个RDD 的数据项很大,集群会在短时间内产生高并发写入数据库的操作,对数据库压力很大,将产生很大的写入开销。

可以将单条记录写转化为数据库的批量写,每个分区的数据写一次,这样可以利用数据库的批量写优化减少开销和减轻数据库压力。

reduce和reduceByKey的优化

reduce是Action操作,reduceByKey是Transformation操作。Spark对reduce的实现进行了优化,可以把同一个任务内的结果先在本地W orker节点执行聚合函数,再把结果传给Driver执行聚合。但最终数据还是要汇总到主节点,而且reduce会把接收到的数据保存到内存中,直到所有任务都完成为止。因此,当任务很多,任务的结果数据又比较大时Driver容易造成性能瓶颈,这样就应该考虑尽量避免r educe的使用,而将数据转化为Key-Value对,并使用reduceByKey实现逻辑,使计算变为分布式计算。

reduceByKey也是聚合操作,是根据key聚合对应的value。同样的,在每一个mapper把数据发送给reducer前,会在Map端本地先合并(类似于MapReduce中的Combiner)。与reduce不同的是,reduceByKey不是把数据汇集到Driver节点,是分布式进行的,因此不会存在r educe那样的性能瓶颈。

Shuffle操作符的内存使用

在有些情况下,应用将会遇到OutOfMemory的错误,其中并不是因为内存大小不能够容纳RDD,而是因为执行任务中使用的数据集合太大(如groupByKey)。Spark的Shuffle操作符(sortByKey、groupByKey、reduceByKey、join等都可以算是Shuffle操作符,因为这些操作会引发Shuffle)在执行分组操作的过程中,会在每个任务执行过程中,在内存创建Hash表来对数据进行分组,而这个Hash表在很多情况下通常变得很大。最简单的一种解决方案就是增加并行度,即增加任务数量和分区数量。这样每轮次每个Executor执行的任务数是固定的,每个任务接收的输入数据变少会减少Hash表的大小,占用的内存就会减少,从而避免内存溢出OOM的发生。

Spark通过多任务复用Worker的JVM,每个节点所有任务的执行是在同一个JVM上的线程池中执行的,这样就减少了线程的启动开销,可以高效地支持单个任务200ms的执行时间。通过这个机制,可以安全地将任务数量的配置扩展到超过集群的整体的CPU

core数,而不会出现问题。

系统性能优化方案

系统性能优化方案 (第一章) 系统在用户使用一段时间后(1年以上),均存在系统性能(操作、查询、分析)逐渐下降趋势,有些用户的系统性能下降的速度非常快。同时随着目前我们对数据库分库技术的不断探讨,在实际用户的生产环境,现有系统在性能上的不断下降已经非常严重的影响了实际的用户使用,对我公司在行业用户内也带来了不利的影响。 通过对现有系统的跟踪分析与调整,我们对现有系统的性能主要总结了以下几个瓶颈: 1、数据库连接方式问题 古典C/S连接方式对数据库连接资源的争夺对DBServer带来了极大的压力。现代B/S连接方式虽然不同程度上缓解了连接资源的压力,但是由于没有进行数据库连接池的管理,在某种程度上,随着应用服务器的不断扩大和用户数量增加,连接的数量也会不断上升而无截止。 此问题在所有系统中存在。 2、系统应用方式(架构)问题(应用程序设计的优化) 在业务系统中,随着业务流程的不断增加,业务控制不断深入,分析统计、决策支持的需求不断提高,我们现有的业务流程处理没有针对现有的应用特点进行合理的应用结构设计,例如在‘订单、提油单’、‘单据、日报、帐务的处理’关系上,单纯的数据关系已经难以承载多元的业务应用需求。 3、数据库设计问题(指定类型SQL语句的优化)

目前在系统开发过程中,数据库设计由开发人员承担,由于缺乏专业的数据库设计角色、单个功能在整个系统中的定位模糊等原因,未对系统的数据库进行整体的分析与性能设计,仅仅实现了简单的数据存储与展示,随着用户数据量的不断增加,系统性能逐渐下降。 4、数据库管理与研究问题(数据存储、物理存储和逻辑存储的优化) 随着系统的不断增大,数据库管理员(DBA)的角色未建立,整个系统的数据库开发存在非常大的随意性,而且在数据库自身技术的研究、硬件配置的研究等方面未开展,导致系统硬件、系统软件两方面在数据库管理维护、研究上无充分认可、成熟的技术支持。 5、网络通信因素的问题 随着VPN应用技术的不断推广,在远程数据库应用技术上,我们在实际设计、开发上未充分的考虑网络因素,在数据传输量上的不断加大,传统的开发技术和设计方法已经无法承载新的业务应用需求。 针对以上问题,我们进行了以下几个方面的尝试: 1、修改应用技术模式 2、建立历史数据库 3、利用数据库索引技术 4、利用数据库分区技术 通过尝试效果明显,仅供参考!

LINUX性能调优方法总结

LINUX性能调优方法总结 大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络 性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取 /etc/sysctl.conf 中的值并根据需要填充 /proc,这样就能够更轻松地管理这些参数。清单 2 展示在互联网服务器上应用于 Internet 服务器的一些比较激进的网络设置。 # Use TCP syncookies when needed net.ipv4.tcp_syncookies = 1 # Enable TCP window scaling net.ipv4.tcp_window_scaling: = 1 # Increase TCP max buffer size net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # Increase Linux autotuning TCP buffer limits net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # Increase number of ports available net.ipv4.ip_local_port_range = 1024 65000 将这些设置添加到 /etc/sysctl.conf 的现有内容中。第一个设置启用TCP SYN cookie。当从客户机发来新的 TCP 连接时,数据包设置了 SYN 位,服务 器就为这个半开的连接创建一个条目,并用一个 SYN-ACK 数据包进行响应。在正常操作中,远程客户机用一个 ACK 数据包进行响应,这会使半开的连接 转换为全开的。有一种称为 SYN 泛滥(SYN flood)的网络攻击,它使 ACK 数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie 特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间(细节参见参考资料一节)。大多数系统都默认启用这个特性,但是确保配 置这个特性更可靠。 启用 TCP 窗口伸缩使客户机能够以更高的速度下载数据。TCP 允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多 64 KB,在与延迟比 较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小。 后面四个配置项增加 TCP 发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发

安卓性能优化方案

随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序。以上理由,足以需要开发人员更加专心去实现和优化你的代码了。选择合适的算法和数据结构永远是开发人员最先应该考虑的事情。同时,我们应该时刻牢记,写出高效代码的两条基本的原则:(1)不要做不必要的事;(2)不要分配不必要的内存。 我从去年开始接触Android开发,以下结合自己的一点项目经验,同时参考了Google的优化文档和网上的诸多技术大牛给出的意见,整理出这份文档。 1. 内存优化 Android系统对每个软件所能使用的RAM空间进行了限制(如:Nexus o ne 对每个软件的内存限制是24M),同时Java语言本身比较消耗内存,d alvik虚拟机也要占用一定的内存空间,所以合理使用内存,彰显出一个程序员的素质和技能。 1) 了解JIT 即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。即时编译前期的两个运行时理论是字节码编译和动态编译。Android原来Dalvik虚拟机是作为一种解释器实现,新版

(Android2.2+)将换成JIT编译器实现。性能测试显示,在多项测试中新版本比旧版本提升了大约6倍。 详细请参考https://www.wendangku.net/doc/dc1368855.html,/cool_parkour/blog/item/2802b01586e22cd8a6ef3f6b. html 2) 避免创建不必要的对象 就像世界上没有免费的午餐,世界上也没有免费的对象。虽然gc为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配内存永远都比不分配内存的代价大。如果你在用户界面循环中分配对象内存,就会引发周期性的垃圾回收,用户就会觉得界面像打嗝一样一顿一顿的。所以,除非必要,应尽量避免尽力对象的实例。下面的例子将帮助你理解这条原则: 当你从用户输入的数据中截取一段字符串时,尽量使用substring函数取得原始数据的一个子串,而不是为子串另外建立一份拷贝。这样你就有一个新的String对象,它与原始数据共享一个char数组。如果你有一个函数返回一个String对象,而你确切的知道这个字符串会被附加到一个Stri ngBuffer,那么,请改变这个函数的参数和实现方式,直接把结果附加到StringBuffer中,而不要再建立一个短命的临时对象。 一个更极端的例子是,把多维数组分成多个一维数组: int数组比Integer数组好,这也概括了一个基本事实,两个平行的int数组比(int,int)对象数组性能要好很多。同理,这试用于所有基本类型的组合。如果你想用一种容器存储(Foo,Bar)元组,尝试使用两个单独的Foo[]

Linux操作系统性能调优的方法

按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。下边将分四部分介绍在Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,如何用以下几种技巧进行性能的优化: QUOTE: 1、Disabling daemons (关闭 daemons) 2、Shutting down the GUI (关闭GUI) 3、Changing kernel parameters (改变内核参数) 4、Kernel parameters (内核参数) 5、Tuning the processor subsystem(处理器子系统调优) 6、Tuning the memory subsystem (内存子系统调优) 7、Tuning the file system(文件系统子系统调优) 8、Tuning the network subsystem(网络子系统调优) 1 关闭daemons 有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。 Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程. Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程.

注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。 可以根据需要停止某个进程,如要停止sendmail 进程,输入如下命令: Red Hat: /sbin/service sendmail stop SUSE LINUX: /etc/init.d/sendmail stop

SDE性能调优方案

ArcSDE 9.1性能调优方案 编写:李国勇 日期: 2006-11-27 版本: 1.0 密级:内部公开 北京恒华伟业科技有限公司

第一章概述 影响ArcSDE运行性能的因素比较多,对其性能的优化需要根据具体情况而定。总体上说,对ArcSDE性能影响较大的因素是:服务器硬件配置、Oracle参数配置、ArcSDE 参数配置和图层管理模式。 服务器硬件配置包括:CPU主频、物理内存大小、系统总线速度、硬盘数量、磁盘寻道时间等,硬件配置参数不是本文的重点讨论内容。 Oracle参数配置包括表空间的组织和缓冲参数配置;ArcSDE参数配置包括存储参数配置和缓冲参数配置。 本调整方案主要针对输配电GIS系统,不一定适合其它行业。 本优方案所有参数基于ArcSDE 9.1、Oracle 9.2。 1.1 总论 一.性能调优的重点在Oracle,而不在ArcSDE,一般情况下,调整ArcSDE各种参数对性能提升作用不大,ArcSDE使用安装时的默认参数即可; 二.小数据量(图层数据总量小于1G存储空间)下,优化SDE的存储的优化对性能的提升不大,ArcSDE的四个频繁访问的系统表没有必要分开存储; 三.小数据量(图层数据总量小于1G存储空间)下,用户数据存储于SDE用户下对性能的影响也不大,但是出于数据库管理的考虑,建议尽可能将这两类数据分开 存储; 四.对于输配电GIS系统,数据库db_block_size设置为8KB完全满足使用要求,没有必要调整到16KB; 五.如果图层中单个图形元素覆盖范围差异不大,没有必要建立多级Grid Index,而且一般情况下默认Grid Index设置即可满足多数情况下的性能需求; 六.如果注册了版本,建议定期对数据库进行Compress和Analyse,同时要确保undo 表空间有足够可用空间(如1G); 七.定期对磁盘做碎片整理,以提升磁盘I/0性能。 1.2 参考文献 1.ArcSDE 9.1 Configuration and Tuning Guide for Oracle? -- ESRI 2005; 2.Managing ArcSDE 9.1 Application Servers -- ESRI 2005; 3.Cost Control: Inside the Oracle Optimizer -- Oracle Donald K. Burleson。 https://www.wendangku.net/doc/dc1368855.html,/oramag/webcolumns/2003/techarticles/burleson_cbo_pt1.html

TUXEDO性能调优的基本方法

TUXEDO性能调优的基本方法 一. 通过配置MSSQ服务器组提高性能 在ATMI环境中(TUXEDO-CORBA服务器环境不支持MSSQ机制)可以通过配置MSSQ(多服务器单队列)机制来达到队列级负载均衡的目的。同一组MSSQ服务器在同一时间将共用一个请求队列,当消息出队时,将被送到第一个空闲的服务器去处理。 如果服务器A属于某个MSSQ的一部分,那么必须为它配置响应队列,即设置REPLYQ=Y,这样当A调用了B服务时,B对A的响应将被回送到发出原始请求的服务器A,而不是MSSQ服务器组中的其它服务器。 MSSQ机制可以配置成动态形式,这样TUXEDO系统会根据负载状况动态地产生和消除MSSQ中的服务器。在下列情况下,可以考虑配置MSSQ: 应该配置MSSQ 不应该配置MSSQ 服务器数量在2到12个之间 如果有多个服务器,折衷的办法是使用 多个MSSQ 请求缓冲区不是很大,没有大到将一个队列占满的情况 一个请求缓冲区可能会占满整个服务器队列空间。 所有的服务器都提供一组相同的服务 每个服务都提供不同的服务 需要配置多个服务器进程才能满足客 户机对服务器的实时性的要求。每个 MSSQ的服务器数量一般不要超过10个, 如果超过10个,建议配置多个MSSQ。 在下面两种情况下,使用MSSQ将达到调优的效果: A.银行业务中,多个TELLER执行相同的服务来为客户提供服务,下一个空闲的TELLER将为下一个等候的客户服务。在这种情况下,每个TELLER必须能够执行所有的客户服务。在同一个MSSQ中的服务器必须在任何时候都提供相同的服务。MSSQ的优点在于,它在队列级提供了第二种形式有的负载均衡。 B.在超市收款业务中,不同的CASHIERS接收不同形式的客户支付(如信用卡,现金等),在这种情况下,不推荐使用MSSQ。 例如: simpserv SRVGRP=GROUP1 SRVID=10 MIN=3 MAX=5 RQADDR=simpserv REPLYQ=Y 这个配置将启动3个simpserv进程,SVRID依次为10,11,12。它们共享同一个请求队列simpserv。在MSSQ配置中,建议设置MIN=MAX=N,这样在TUXEDO系统启动时,将一次性启动N个服务器,这就使得TUXEDO不必对MSSQ服务器的数量作动态管理。N的设置要根据数据库服务器目前的压力情况来决定,而不是越大越好。 为了测试simpserv对请求的受理情况,在TOUPPER服务代码中加入一条延时语句sleep(1),启动25个并发用户,分别执行12个TOUPPER服务请求,使用tmadmin/psr命令打印MSSQ服务器组,得如下结果:

22提供性能优化方案---Google-Code

Linux系统性能测试与分析 1、前言 通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识。大多数的硬件性能问题主要和CPU、磁盘、内存相关,还没有遇到因为开发语言的运行效率对整个应用的性能造成影响,而应用程序设计的缺陷和数据库查询的滥用反倒是最最常见的性能问题。需要注意的是,大多数情况下,虽然性能瓶颈的起因是程序性能差或者是内存不足或者是磁盘瓶颈等各种原因,但最终表现出的结果就是CPU耗尽,系统负载极高,响应迟缓,甚至暂时失去响应,因此我们观察服务器状况时,最先看的就是系统负载和CPU空闲度。当你阅读完了这遍文档以后就会有一个对系统分析的思路。 2、性能分析的目的 2.1找出系统性能瓶颈 1.硬件瓶颈 2.软件瓶颈 2.2提供性能优化方案 1.升级硬件 2.改进系统结构 达到合理的硬件和软件配置,使系统资源使用达到平衡。但遗憾的是解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过渡使用会造成大量进程等待 CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换、缺页处理的CPU开销) 3、性能相关的各个环节 3.1 硬件资源 3.1.1、CPU ⒈ 是否使用SMP。 ⒉ 单颗CPU的性能对依赖CPU的某些应用的影响很严重,比如数据库的查询处理。 3.1.2、内存

MySQL数据库性能(SQL)优化方案-期末论文

高级数据库技术——期末论文 基于SQL查询的MySQL数据库性能优化研究 :XX 学号:2014XXXXX 学院:计算机学院

摘要: 查询是数据库系统中最基本也是最常用的一种操作,是否具有较快的执行速度,已成为数据库用户和设计者极其关心的问题。在研究开源数据库管理系统MySQL 查询优化技术的基础上,主要结合传统SQL操作优化、深度分析 MySQL 源代码、现代数据库发展几方面进行诸如参数调优,MySQL关联查询,重写相关规则等容展开优化分析研究。 关键词:查询优化,查询重用,查询重写,计划优化

一、传统SQL查询优化操作 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2.使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) 使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,

性能调优总结

深圳割接性能调优总结 BSS测试部:邹家勇

HSC从一开始对订购关系与三户资料同步接口进行压测时,不能满足性要求到最后性能压测结果达到要求的10倍性能以上,经过了以下几个关键的优化步骤。 调优过程: 在压测时首先要排除的是高消耗SQL(经过AWR报告分析后HSC没有出现高消耗SQL) 本次SZ割接压测经过以下几个关键点的调优: 1)脚本参数调优(数据已存在,字段值太长错误较多调节脚本参数模式及参数长度) 2)JDBC配置调优(JDBC使用率100%,连接数调成100后,极限测试时使用在80个连接 左右) 3)WAS配置调优(主要是webcontainer调成200,极限测试时使用达到200,但主机 CPU资源消耗在50%以上,且TPS也超过指标10来倍,不再增加配置) 4)IHS配置调优(主要是http.conf文件参数调整) 5)linux系统调优(主要是网络参数调整,及open file调整) 6)Systemout日志中不打印应用日志(减少不必要的磁盘IO消耗)。 下面逐一分解每个关键调优时出现的问题及定位 脚本参数调优举例 说明:在测试过程中,通过查看WAS日志,报大量的主键冲突,经查明后,发现是发送的报文中写表的主键字段值重复导致,经过对主键字段的重新参数化后,不再出现主键冲突,大量主键冲突也不符合平台业务交易场景!(原来红色部分值采用一段随机值或序列发现还有重复的值出现(测试工具本身问题)) 订购关系脚本 Action() { lr_think_time(3); lr_start_transaction("订购关系同步_SubProductSyn_request"); soap_request("StepName=SOAP Request", "URL=http://{IP}:{port}/Nodehsc/services/HscService?wsdl", "SOAPEnvelope=" "" "" "" "" "" "195{servnumber}" "{region}" "SubProductSyn" "1.0"

MySQL5.1性能优化方案

MySQL5.1性能优化方案 1.平台数据库 1.1.操作系统 Red Hat Enterprise Linux Server release 5.4 (Tikanga) ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 32位Linux服务器,单独作为MySQL服务器使用。 1.2.M ySQL 系统使用的是MySQL5.1,最新的MySQL5.5较之老版本有了大幅改进。主要体现在以下几个方面: 1)默认存储引擎更改为InnoDB InnoDB作为成熟、高效的事务引擎,目前已经广泛使用,但MySQL5.1之前的版本默认引擎均为MyISAM,此次MySQL5.5终于将默认数据库存储引擎改为InnoDB,并且引进了Innodb plugin 1.0.7。此次更新对数据库的好处是显而易见的:InnoDB的数据恢复时间从过去的一个甚至几个小时,缩短到几分钟(InnoDB plugin 1.0.7,InnoDB plugin 1.1,恢复时采用红-黑树)。InnoDB Plugin 支持数据压缩存储,节约存储,提高内存命中率,并且支持adaptive flush checkpoint, 可以在某些场合避免数据库出现突发性能瓶颈。 Multi Rollback Segments:原来InnoDB只有一个Segment,同时只支持1023的并发。现已扩充到128个Segments,从而解决了高并发的限制。 2)多核性能提升

Linux 性能调优的几种方法

Linux 性能调优的几种方法 按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。下边将分四部分介绍在Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,如何用以下几种技巧进行性能的优化: 1、Disabling daemons (关闭daemons) 2、Shutting down the GUI (关闭GUI) 3、Changing kernel parameters (改变内核参数) 4、Kernel parameters (内核参数) 5、Tuning the processor subsystem(处理器子系统调优) 6、Tuning the memory subsystem (内存子系统调优) 7、Tuning the file system(文件系统子系统调优) 8、Tuning the network subsystem(网络子系统调优) 1 关闭daemons 有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。 Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程. Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程

注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。

Java程序性能优化方案

Java程序性能优化方案 StringTokenizer比String.split()方法效率高 更优化的方式 Java代码 while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } 比String.startsWith和endsWith性能更优的方式:Java代码 int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c');

int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c'); StringBuffer(int capacity)指定初始容量可以减少扩容的操作

informatica性能调优方法

一、Suorce调优 1.文本文件: -调优Line Sequential Buffer Length(1024) 2.关系型数据库: -在Source Qualify优化SQL -在源数据增加索引 -增加Database Network Packet size -当DB与informatica在同一台机器上使用IPC协议 二、Target调优 1.目标为文本文件: -调优Line Sequential Buffer Length(1024) 2.目标位关系型数据库 -删除目标索引和约束 -增加checkpoit interval -使用Bulk Loading和External loading -增加Database networkPacketsize 三、Mapping调优 >最少化转化组件 >减少不必要的link >对Aggregator、Joiner、Rank、Lookup等组件,减少连接的input/output和output字段 >Single Pass:读一次数据,多处使用 >减少数据类型转换:数值的比较比字符串要快 >减少转换错误:使用session tracing terse >组件调优:Lookup组件、Filter组件、Aggregator组件、Joiner组件调优、调优Sequence Generator

>调优表达式 >增加Partition >调优Session参数 四、System调优 >增加network speed:本地速度一般是网络的5-20倍;文件拷贝到本地 >使用informatica Grid >当只处理7-bit ASCII或EBCDIC数据时,选用ASCII data movement mode :只是用一个字节存储数据。 >减少Paging(虚拟内存):在Unix系统下,使用processor binding将资源分配给informatica

Oracle SQL性能优化方法研究

Oracle SQL性能优化方法探讨 Oracle性能优化方法(SQL篇) (1) 1综述 (2) 2表分区的应用 (2) 3访问Table的方式 (3) 4共享SQL语句 (3) 5选择最有效率的表名顺序 (5) 6WHERE子句中的连接顺序. (6) 7SELECT子句中幸免使用’*’ (6) 8减少访问数据库的次数 (6) 9使用DECODE函数来减少处理时刻 (7) 10整合简单,无关联的数据库访问 (8) 11删除重复记录 (8) 12用TRUNCATE替代DELETE (9) 13尽量多使用COMMIT (9) 14计算记录条数 (9) 15用Where子句替换HAVING子句 (9) 16减少对表的查询 (10) 17通过内部函数提高SQL效率 (11)

18使用表的不名(Alias) (12) 19用EXISTS替代IN (12) 20用NOT EXISTS替代NOT IN (13) 21识不低效执行的SQL语句 (13) 22使用TKPROF 工具来查询SQL性能状态 (14) 23用EXPLAIN PLAN 分析SQL语句 (14) 24实时批量的处理 (16)

1综述 ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要通过反反复复的过程。在数据库建立时,就能依照顾用的需要合理设计分配表空间以及存储参数、内存使用初始化参数,对以后的数据库性能有专门大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积存经验,从而更好地进行数据库的调优。 数据库性能调优的方法 ●调整内存 ●调整I/O ●调整资源的争用问题 ●调整操作系统参数 ●调整数据库的设计 ●调整应用程序 本文针对应用程序的调整,来讲明对数据库性能如何进行优化。 2表分区的应用 关于海量数据的表,能够考虑建立分区以提高操作效率。建

服务器性能调优

服务器性能优化 1、Apache+tomcat集群方式 服务器基本设置:1个apache集成二个tomcat。 安装apache http server省略,访问地址为http://127.0.0.1:8081 安装tomcat,解压apache-tomcat-6.0.20.zip,测试时我是把两个tomcat分开放在不同的虚拟机,其中一个是和apache同一台虚拟机。 两个tomcat分别命名为worker2和worker3 先说tomcat.worker2的配置: server.xml 第一步:配置http监听端口,这里端口设为8079,该步骤非必要,只要不冲突就行了。 第二步:配置AJP监听端口,这里端口设为8077,该步骤非必要,只要不冲突就行了。 第三步:配置服务器标识,这里标识名配置为:worker2,添加jvmRoute="worker2",该步骤必须。 在Engine节点启用集群配置,只需去掉Cluster节点前的注释就行了,该步骤必须,配置了集群才能实现Session复制,如果只有一个集群,只按我下边的配置就行了,如果多个集群,则不能按此配置,tomcat服务器内的帮助文档/docs/cluster-howto.html,/docs/config/cluster.html有介绍,需要的可以参考下。 要实现session复制,还需要在context.xml添加属性distributable="true",如下: 如果不想在context.xml中添加distributable="true",还有另一方法是在应用程序的web.xml中添加,不过这方法我没有测试。 配置完成,访问地址为:http://127.0.0.1:8079 另一个tomcat.worker3的配置 server.xml

10种java性能优化方案

你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧。 最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网域?或者说如何确保全网域?扩展的不同方面 全网域被炒作的最多的是扩展负载(Scaling load),比如支持单个用户访问的系统也可以支持10 个、100个、甚至100万个用户访问。在理想情况下,我们的系统应该保持尽可能的“无状态化(stateless)”。即使必须存在状态,也可以在网络的不同处理终端上转化并进行传输。当负载成为瓶颈时候,可能就不会出现延迟。所以对于单个请求来说,耗费50到100毫秒也是可以接受的。这就是所谓的横向扩展(Scaling out)。 扩展在全网域优化中的表现则完全不同,比如确保成功处理一条数据的算法也可成功处理10条、100条甚至100万条数据。无论这种度量类型是是否可行,事件复杂度(大O符号)是最佳描述。延迟是性能扩展杀手。你会想尽办法将所有的运算处理在同一台机器上进行。这就是所谓的纵向扩展(Scaling up)。 如果天上能掉馅饼的话(当然这是不可能的),我们或许能把横向扩展和纵向扩展组合起来。但是,今天我们只打算介绍下面几条提升效率的简单方法。 大O符号 Java 7的ForkJoinPool和Java8 的并行数据流(parallel Stream)都对并行处理有所帮助。当在多核处理器上部署Java程序时表现尤为明显,因所有的处理器都可以访问相同的内存。

C++程序性能优化的几个技巧

浅谈C++程序性能优化的几个技巧: ** 大部分程序的90%执行时间仅花费在大约10~20个不同的函数上。如果费力气所优化的是被执行频率很低的函数,那么这个优化工作不会对程序性能有明显提高。所以有好钢就一定要用在刀刃上。 ** 在优化时可能会对程序的可读性及可维护性造成损失。要权衡得失。并做好注释。 ** 不要过早的进行优化工作。当一个函数已经被优化到紧凑且几近完美的程度时,如再遇到需要改动或重用时会发现无从下手。 ** 算法的选择是决定性能的关键。所以要认真考虑算法,避免不必要的计算。 ** 要避免在循环中每次为查找同一个元素就便利整个列表或数组。可以通过优化数据结构或者使用变量来保存这个元素的方法来进行优化。 ** 虚函数可能会产生额外的开销。 ** 将较简单且被频繁调用的函数设为内联可以有效提高程序性能。内联函数inline:当函数做上内联标记以后,编译器会在调用此函数时将函数的内容复制到此处。这样做的好处是可以减小函数调用时的开销。但是因为每次调用之处都会复制,所以生成的可执行代码会变得庞大。注意:有时内联函数太复杂编译器会拒绝内联,将inline忽略掉而不提示警告或错误;内联函数只能出现在.h文件中。建议将其紧跟在类定义之后。 ** 当调用函数的参数为一个较大的数据类型或一个对象时,切忌使用值传递方式,要使用指针或引用的方式传递。因为值传递需要创建一个临时的对象备份,不要忘了,对象的创建会调用构造函数,然后还需要复制对象的内容到新创建的对象中,用完之后还要调用析构函数。更甚者如果此对象类中又包含了其他类型的对象…这开销可是够大的!当然, ** 不使用的空函数注释掉。 ** 下面的情况看看编译器背着你做了什么: 如有函数 void SetRotation(const Rotation & rot); Rotation类定义如下: Class Rotation {//….. Public:

性能分析与调优的原理及原则

性能分析与调优的原理 最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP,TCP/IP),还是从应用程序代码,数据库调优,中间件配置等方面入手。 单一个中间件又分web中间件(apache、IIS),应用中间件(tomcat、weblogic、webSphere)等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功。但调优对于每一项的要求又不仅仅是“知道”或“会使用”这么简单。起码要达到“如何更好的使用”。 常看到性能测试书中说,性能测试不单单是性能测试工程师一个人的事儿。需要DBA 、开发人员、运维人员的配合完成。但是在不少情况下性能测试是由性能测试人员独立完成的,退一步就算由其它人员的协助,了解系统架构的各个模块对于自身的提高也有很大帮助,同进也更能得到别人的尊重。 再说性能调优之前,我们有必要再提一下进行测试的目的,或者我们进行性能测试的初衷是什么? 能力验证:验证某系统在一定条件具有什么样的能力。 能力规划:如何使系统达到我们要求的性能能力。 应用程序诊断:比如内存泄漏,通过功能测试很难发现,但通过性能测试却很容易发现。 性能调优:满足用户需求,进一步进行系统分析找出瓶颈,优化瓶颈,提高系统整体性能。 一、一般系统的瓶颈 性能测试调优需要先发现瓶颈,那么系统一般会存在哪些瓶颈: 1、硬件上的性能瓶颈:

一般指的是CPU、内存、磁盘I/O 方面的问题,分为服务器硬件瓶颈、网络瓶颈(对局域网可以不考虑)、服务器操作系统瓶颈(参数配置)、中间件瓶颈(参数配置、数据库、web服务器等)、应用瓶颈(SQL 语句、数据库设计、业务逻辑、算法等)。 2、应用软件上的性能瓶颈: 一般指的是应用服务器、web 服务器等应用软件,还包括数据库系统。 例如:中间件weblogic 平台上配置的JDBC连接池的参数设置不合理,造成的瓶颈。 3、应用程序上的性能瓶颈: 一般指的是开发人员新开发出来的应用程序。 例如,程序架构规划不合理,程序本身设计有问题(串行处理、请求的处理线程不够),造成系统在大量用户方位时性能低下而造成的瓶颈。 4、操作系统上的性能瓶颈: 一般指的是windows、UNIX、Linux等操作系统。 例如,在进行性能测试,出现物理内存不足时,虚拟内存设置也不合理,虚拟内存的交换效率就会大大降低,从而导致行为的响应时间大大增加,这时认为操作系统上出现性能瓶颈。 5、网络设备上的性能瓶颈: 一般指的是防火墙、动态负载均衡器、交换机等设备。 例如,在动态负载均衡器上设置了动态分发负载的机制,当发现某个应用服务器上的硬件资源已经到达极限时,动态负载均衡器将后续的交易请求发送到其他负载较轻的应用服务器上。在测试时发现,动态负载均衡器没有起到相应的作用,这时可以认为网络瓶颈。 性能测试出现的原因及其定位十分复杂,这里只是简单介绍常见的几种瓶颈类型和特征,而性能测试所需要做的就是根据各种情况因素综合考虑,然后协助开发人员/DBA/运维人员一起定位性能瓶颈。 二、一般性能调优步骤 一般性能问题调优的步骤: 1、步骤一:确定问题 应用程序代码:在通常情况下,很多程序的性能问题都是写出来的,因此对于发现瓶颈的模块,应该首先检查一下代码。

26个常用的.net性能优化方法

https://www.wendangku.net/doc/dc1368855.html,中常用的26个优化性能方法收藏 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。https://www.wendangku.net/doc/dc1368855.html,中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。连接池的大小是有限的,R1如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。 使用存储过程 存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。另外,存储过程在服务器端运行,独立于https://www.wendangku.net/doc/dc1368855.html,程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。 优化查询语句 https://www.wendangku.net/doc/dc1368855.html,中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,R2尽量使用优化过的SQL语句以减少执行时间。比如,不在查询语句中包含子查询语句,充分利用索引等。 2. 字符串操作性能优化 使用值类型的ToString方法 在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。R3使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。 运用StringBuilder类 String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String 对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。R4在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。其定义及操作语句如下所示: int num; System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串str.Append(num.ToString()); //添加数值num Response.Write(str.ToString); //显示操作结果

相关文档
相关文档 最新文档