|
本帖最后由 Link_ 于 2012-11-2 15:26 编辑
系统"速度慢"的问题, 就好像人"头痛", 可能导致的原因太多了, 内伤外伤营养不良精神压力各种原因都可能, 要具体分析检查才能找到真正的原因. 这和求医非常相似, 在网上求医大家只能根据个人经验给你一些思路, 具体解决还需要具体诊断才行.
硬件方面就是CPU, 内存, 硬盘, 网络, 这些都是主流指标, B1并没有特殊的硬件需求, 相信很多人都是内行(我是外行).
软件方面就像楼上提的, 应用服务器和数据库服务器分开可以有所改善, 如果服务器上还有共享文件夹, 备份文件等等功能的话, 或者其他不用的SAP, SQL, Windows服务也会影响性能, 建议关闭或者分到别的机器上(这里的主要的瓶颈是出现在硬盘上, 所以通过分开应用来减少负担。当然优化硬盘性能也会很有效果).
此外就是客户化上线后导致的速度问题, 比如SQL编程出的问题, B1历史数据太大的问题等等, 也可以通过排除法来测试.
下面是一些过去的经历, 纠正以后改善十分明显:
楼主的客户端如果是在服务器本地运行(比如通过远程软件), 需要考虑每个客户端会占用大约300多M内存, ADDON还要另加, 可以通过资源管理器查看各个进程的内存占用, 新版本的windows对内存使用进行了优化,IT们都认为内存占用高是windows自动管理的正常现象, 但也要结合进程情况具体分析。(如果内存不足, 频繁读写临时缓存也会扯到上面说的硬盘瓶颈.)
如果客户端不是在服务器上运行, 则要检查C/S之间的网络带宽以及线路稳定性, 尤其是在查询时, 服务器会向客户机传输大量数据(而且效率低下, 这也是B1客户端不适合直接在外网访问的原因), 也可以通过管理工具查看丢包情况或者具体进程占用的带宽, 比如象库房之类的地方客户机线路老化导致网络不稳定, 也很容易排查.
最后就是数据库死锁排队的情况, 可以通过SQL工具来分析, 比如最基本的sp_who。
比如,用户A在对某关键表操作时,SQL当然会锁定这张表,遇到同时用户B也要访问, 则会在队列里等待A的操作完成,如果A需要耗时较长,B就会显示为“卡了”。而B可能本身也锁定了另外一些表(在自定义查询里很普遍), 于是用户CDEF也要排队等待用户B, 形成一个队列, 看起来就是部分用户程序停止响应, 其他用户不受影响, 而且是时间性的, 因为等A操作完成,整个排队情况就消失了, 所有人恢复正常。
这和死锁有区别,死锁是队列发生循环, A等B, B等A, 此时SQL有自动杀死进程的机制, 而上面这种排队除非特地设置了超时限制, 否则SQL认为是正常的等待。(拖窗口也会访问数据库,我记得好像有个表就是储存这个用户的这个窗口的屏幕位置, 下次打开时会读取吧?)
无论客户化开发还是B1本身设计,随着数据量增加,都免不了会有这种情况出现,我水平有限只能具体问题具体解决,比如用历史数据存档让那些常用的关键数据表“瘦身”,或者通过一些其他手段来减少队列等待的长度。
只要找到具体原因采取针对性的对策,一般都可以取得立竿见影的效果, 但要分析出具体原因则比较考验人。
就像那个著名的故事,有家工厂的电机坏了, 请人来修,那人拿粉笔在机器上划了条线说这里线圈减少9圈, 果然问题解决。他开价1万块,老板说怎么那么贵, 他说,划线1块,知道划在哪9999块。 |
|