起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1870|回复: 14

优化速度专题

[复制链接]
发表于 2004-6-3 11:22:14 | 显示全部楼层 |阅读模式
        部署篇
1.1        应用服务器与数据库服务器分开,不要在同一台机器上
原理:
通过两种服务器分离,来减少Justep的系统服务器SysServer、应用服务器BizServer与数据库服务器争夺CPU、内存等资源。

1.2        尽量减少客户端下载的文件
做法:
1.        删除NewVersion目录下的*.map文件
2.        Business完全采用多层体系机制,客户端不需数据引擎。一般情况下可以删除下列文件:
adocomps.bpl(ADO相关)
adortl60.bpl(ADO相关)
bdecomps.bpl(BDE相关)
bdert60.bpl(BDE相关)

说明:
Business客户端是通过 业务服务器 连接数据库的,而不是自己连接服务器,因此只要不需要访问客户端上的本地表,就不需要用ADO或者BDE连接。

1.3        打开客户端缓存机制
原理:
利用客户端缓存机制,可以在第一次运行的时候,从服务器获取数据并缓存到这台客户端,第二次运行时从本地缓存中取数据,不需要再从服务器获取数据了,速度会提高很多。

做法:
修改Config.xml文件的client节LoadFileCacheSystem="True"

1.4        常用功能提前缓存
原理:
把常用功能的缓存数据保存到服务器端的NewVersoin目录,在客户端连接的时候,直接通过NewVersion下载机制把缓存文件下载到客户端,这样在运行的时候已经是缓存以后运行的效果了,这样可以减少第一次运行的等待取数据时间。

做法:
1.        首先打开客户端缓存机制,参考第二条
2.        在某一台客户端上运行常用的功能
3.        把这个客户端的缓存文件CacheFS.sdb拷贝到服务器的NewVersion目录
说明:
对于B/S客户端,这个文件在Windows的Downloaded Program Files\Business目录;
对于多层模式客户端,这个文件在Business 3.0\Bin目录

1.5        服务器
1.        服务器的屏保不要太复杂,比如OpenGL,最好设置屏保为黑屏
2.        配置服务器的防病毒策略
原理:
当每次文件操作的时候,防病毒软件都会进行检查,因此合理的指定防病毒软件的防毒策略可以大大提高服务器提供服务的性能,比如:只检查exe文件,或者不包括数据库文件等等。
3.        不要在服务器或者客户端上运行Internet优化工具
原理:
这些工具会修改TCP/IP设置,但是造成局域网速度变慢。



        设计篇
2.1        设置数据表缓存
原理:
这是Business系统对于数据缓存的设计,因为现在的应用项目大多数会按照多层结构部署,所以应用系统的重要瓶颈是数据在网络上传输的效率,为了减少网络流量限制对数据访问造成的性能下降,Business设计了一套数据缓存机制,可以把访问过的表数据缓存在本地,下一次访问这批数据时,就可以不与服务器交互,但是,服务器上的数据可能被其他的客户端更新,所以在服务端数据被更新后,缓存中的数据也要更新,如果不设置CacheKey,则客户端会作废缓存中的全部数据,从服务顺重新取数据,又造成较大的网络流量,这时如果利用Cachekey,服务端就能够自动把客户端缓存过的数据的CacheKey记入日志文件,当感知到客户端数据的改动时,可以根据CacheKey所定义的关键字,只把改动过的数据发往客户端,刷新客户端的缓存,提高数据访问的效率。

做法:
2.        找出常用的、变动不大的数据表
3.        在数据字典层,设置数据表的 使用缓存UseCache 属性为True
4.        如果数据表的数据很多,设置 缓存主键CacheKey 属性为表中某一个分类字段
说明:
当数据量大时,不要设置 缓存主键 为数据表的关键字段,这样在日志文件就会很大,反而影响速度。

2.2        减少网络会话
做法:
尽量少发SQL语句到服务端取数据

2.3         减少从数据库取的数据量
做法:
1.        根据业务需要,对数据进行过滤,减少一次存取的数据量(因为即使一次取了1000条数据,用户也没有办法看)
2.        在业务功能上定义 业务信息策略 的 默认过滤 属性,减少进入功能界面时的等待,然后根据需要在进入功能后在修改UserFilter属性。
3.        利用数据集的 分组取数据 属性,设置每次取 ?? 条数据(或者与DataGrid结合,一次取分组关键字的一个值),这样用户可以一次取一页数据,而不是取所有的数据
4.        很多录入界面其实是不需要取历史数据出来的
5.        做查询的时候,尽量考虑分页查询。(就像浏览论坛一样每一页几十条那样)

2.4        合理设计空间
原理:
Business运行平台是按照空间来缓存模型资源系统的结构信息(文件系统),如果空间下资源系统结构信息发生了变化,就需要从服务器端重新取这个空间下结构信息。

做法:
不要把太多的东西放到同一个空间下


        分析篇
3.1        打开系统监控,分析生成的监控记录,找出速度的瓶颈。
做法:
1.        修改config.xml文件,在SysServer节前增加<SystemMonitor MonitorEnable="True" Operator="Default" desc="Method Invoke Test"/>,如图:

2.        这样在客户端运行的时候,会生成一个BizMonitor.db的文件,通过对这个文件进行分析,可以发现速度问题的瓶颈,从而进行针对性的改进。这个文件对于多层模式客户端,在BIN目录下,对于B/S客户端,在Windows的Downloaded Program File\Business目录下。

3.2        利用操作系统、数据库服务器提供的工具来分析CPU、内存、网络占用

3.3        分析各种日志


说明:
文中提到的修改Config.xml文件,
对于多层模式,是指客户端Business 3.0\Bin\Config.xml文件
对于1231版本的B/S模式,是指服务器端Business 3.0\Bin\NewVersion\Config.xml文件
对于140版本以后的B/S模式,是指服务器端Business 3.0\Bin\UnzipNewVersion\Config.xml文件,然后利用UpdateDeploy.exe压缩到NewVersion
相关内容请参考 如何配置服务器端的Newversion目录

速度优化专题.rar

17.88 KB, 下载次数: 164

回复

使用道具 举报

发表于 2004-6-7 09:51:58 | 显示全部楼层
除了这些之外,你们也应该多在平台的程序优化上下一些工夫
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-8 10:24:27 | 显示全部楼层
平台上的优化一直在做,而且会一直坚持做下去的。
给一个BizMonitor.db的分析工具,请下载使用。

MonitorViewer.rar

1.11 MB, 下载次数: 144

回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-8 10:27:48 | 显示全部楼层

网络测速工具

SpeedTest可以用来测试客户端连接某服务器或网站的带宽,结果会以柱状图的形式表示。使用方法:
1 在客户端安装并运行 SpeedTest Client。连结到所需的网站即可。如果你想将该结果与标准速度进行比较,只需选择菜单“Compare”中的明细项,如786KB(DSL)即可,这样就会得到一个比较直观的结果。
2 如果想在客户端和服务器之间进行大量数据传输的测试,必须在服务器安装并运行 SpeedTest Server。在执行SpeedTestServer测试速度的时候,选择文件大小要是标称带宽几倍,这样测试的速度才会准确。然后就可以从SpeedTest Client客户端连接到该服务器上进行测试。这样得到的结果比较准确

SpeedTestInstall.rar

1.35 MB, 下载次数: 152

回复 支持 反对

使用道具 举报

发表于 2004-6-10 14:20:54 | 显示全部楼层
请问SpeedTest Server那里有下载?您那里有吗?
回复 支持 反对

使用道具 举报

发表于 2004-6-10 14:22:45 | 显示全部楼层
看到了,原来是一起的。不好意思。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-25 11:25:01 | 显示全部楼层

设计篇补充

2.5        充分利用平台提供的编辑属性的特性
原理:
经常会用到根据一个字段的值来决定另外一个字段的只读等等,很多人用OnFieldChange事件,通过代码实现,这样作当数据集中任何一个字段变化都会触发这个事件的代码,然后每次都会作字符串比较这样影响效率的操作。其实,字段有编辑属性,可以根据一个表达式的值来决定字段的Enabled、ReadOnly、Required、Visible等。

做法:
定义字段的编辑属性表达式,根据表达式的值来决定字段的只读、可用等属性。

2.6        充分利用平台提供的自动填充的特性
原理:
经常有增加一条记录的时候,填充一些字段的缺省值;可以在数据集的AfterInsert事件中作,但是比较好的做法是定义字段的自动填充属性,按照表达式或者查找来填充字段的值,这样作的效率比事件中的代码效率要高,尤其是当需要在代码中查找数据库值的时候。

做法:
定义字段的自动填充属性,用表达式或者查找结果来填充字段的值。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-25 11:33:50 | 显示全部楼层

部署篇补充

1.7        服务
如果使用Socket协议连接的话,请取消Socket Server的Connections | Show Host Name选项。减少网络上不必要的通讯、等待等。
回复 支持 反对

使用道具 举报

发表于 2004-6-28 10:31:41 | 显示全部楼层

程序优化问题

用MonitorViewer测试。第一种情况,在过滤条件前加上aa.DataSet.Close;在过滤条件之后加上aa.Dataset.Open(aa为数据集)。这种情况下产生三条sql语句
    "SELECT *     FROM T_OUTFILE
  WHERE (T_OUTFILE.F_STATUS = '2' and T_OUTFILE.F_ISREPORT = 'F' and T_OUTFILE.F_ORGANIZATION = _FE35D411AA6A42609510290B4DFE819C) AND (F_OUTGOINGDATE BETWEEN TO_DATE('2004-1-1', 'YYYY-MM-DD') AND TO_DATE('2004-12-31', 'YYYY-MM-DD')";
     SELECT TDEPT.FDISPLAYNAME,TDEPT.FID FROM TDEPT WHERE TDEPT.FKIND = '.DPT'";
     SELECT TPERSON.FDISPLAYNAME, TPERSON.FID,
用时分别为250ms,16ms,15ms;
第二种情况,不加close和open.产生一条sql语句,
‘SELECT *  
  FROM T_OUTFILE
  WHERE (T_OUTFILE.F_STATUS = '2' and T_OUTFILE.F_ISREPORT = 'F' and T_OUTFILE.F_ORGANIZATION = :_FE497F8FFE5845DFA1F2DA7F08E18A6A ) AND (F_OUTGOINGDATE BETWEEN TO_DATE('2004-1-1', 'YYYY-MM-DD') AND TO_DATE('2004-12-31', 'YYYY-MM-DD')’
用时282ms。
请问哪一种情况效率更高一些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-28 14:15:43 | 显示全部楼层
我们可以看到其实第一种情况是第二种情况的一句加上了两句别的
那当然是第二种情况快了。

之所以出现第二种情况更慢的情况,只是受到很多因素影响的,一次看不出来效果。因为比如正是第二次的情况的时候,服务器端做了一些复杂的操作,或者正好有人在网络上拷贝大文件等等。你可以多做几次进行比较。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-4-25 22:31 , Processed in 0.056973 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表