Portal门户常见宕机或性能低问题分析与七大解决之道

news2024/12/23 12:20:46

      不论使用什么产品构建门户,只要是基于Java技术的,就很容易宕机或出现性能低的问题。因为Portal产品比较复杂,且集成的数据特别多,架构特别复杂,涉及到的数据通信特别多。宕机或性能低也通常是用户较为头疼的问题。经常有客户门户上线后出现页面空白或无法访问,甚至宕机的问题,令人头疼不已。本文以列举除了最常见的性能低下或宕机的七大原因分析,并以笔者十几年的产品实施经验提出普众性的解决措施。

      Portal性能瓶颈通常被划分为如下八大隔离区,每个隔离区的性能低下都有可能带来用户访问速度慢、系统失去响应、空白页、页面无法显示甚至宕机的情况。如图:

接下来我们依次介绍这八大隔离区的问题点和性能优化策略:

  • Ajax异步调用等感受优化:

Ajax异步调用感受优化指的是通过技术手段,在其他方面都已经达到最佳优化的前提下,充分利用异步调用等技术,提高用户速度感受,但实质上,系统的整体性能并未提升。

(一)问题分析

这种情况通常出现在登录后进入首页时的体验上,尤其是当首页部署的Portlet比较多的时候,更有甚者,多个Portlet要调用后台的资源或者逻辑处理,每个Portlet的响应时间都比较慢,如果要等到所有Portlet初始化完毕门户首页才显示出来,那么用户等待的时间可想而知,这将带给用户非常差的体验。

(二)优化策略

Portal分为门户容器和Portlet容器两部分组成,Portal容器加载完毕后再加载Portlet容器。Portal容器加载时主要是编译并处理主题皮肤、容器运行所依赖的各种类库、数据库等资源;Portlet容器则是先有登录Portlet与Ldap通信鉴权,之后每个Portlet进入init()方法加载各种以来提交,然后进入doService()处理各种业务逻辑,得到处理结果并传输回门户后,统一编译成Html格式,与门户容器编译出来的Html文件共同拼装成一个Html文件呈现出来。多个Portlet完成业务逻辑并返回结果的时间长短不一,系统默认要等到所有Portlet回传完所有数据后才统一呈现。那么,响应时间最长的那个Portlet所需的时间就成为木桶上最短的那块木板。幸好,Portal支持Ajax异步加载技术,本层处理的优化逻辑是采用Portlet异步加载技术,即使当只有1个Portlet处理完毕,也交由门户容器打包呈现出来,后续每个Portlet处理完毕后逐一加载,直至加载完毕。就用户来说,他会在较短的时间内先看到门户首页,和几个Portlet栏目,这时候用户的注意力被吸引到已经呈现出来的Portlet上面,剩余几个逐一加载的Portlet用户会降低感知,所以整体上用户的感受较好。

这是一种设计思想,需要应用到门户系统建设的各个角落。例如:首页主题皮肤部分可能设计成6张图片来回滚动,形成一个动画播放的效果。某些极端场景下例如当网络传输速度较低而6张图片的体积又较大时,如果等到6张图片完全传输完毕才加载动画播放功能,则用户感受也会较差,变通的方法是当下载第1张图片时,通过代码控制先将这张图片显示出来,然后等其余5张图片下载完毕后再执行动画播放逻辑,这样用户的感受也会大大提升。

  • JVM堆栈与Web线程池优化

JVM堆栈优化与Web线程池优化指的是Portal容器本身的JVM和其他各项参数的优化,也就是JVM容器本身以及垃圾回收策略的配置。

(一)问题分析

Portal服务运行在应用服务器Application Server容器上的一个独立服务器,既然是JVM容器就会有大小限制。处理用户请求的每个逻辑处理都需要在JVM中开辟内存区域,用于存储暂存数据共CPU及CPU的二级缓存调取执行二进制运算。特别是有些质量不高的代码在占用内存处理完之后没有及时执行clear()方法清空自己占用的内存,而单独依靠JVM本身的垃圾回收处理机制其处理能力是有限的。事实上,3.5G的内存是很容易被占用光的。

 

当已经占用的内存大于JVM本身配置的内存大小而且此时JVM还未进行垃圾回收时,就会出现没有多余的内存用来存储更多用户新增的处理请求了,这时候的表现就是新请求需要等待JVM释放内存,而JVM如果不释放内存,则用户体验就是页面一直空白,直至超时后显示“页面无法响应”、“网页无法显示”等错误,甚至Hung住或者Crash掉,这就是宕机。

(二)优化策略

Portal服务运行在应用服务器Application Server容器上的一个独立服务器,通常64位机器上会指定JVM的最大堆栈大小为3.5G,因为超过3.5G后单纯依赖JVM本身的垃圾回收机制在过大的JVM堆栈里回收执行效率反而会降低很多,这里还需要配置新生代内存的大小等。当然,如果是老式的32位机器,则JVM最大大小不可超过1.8G,因为32位机器上最大寻址能力就是2G而已。

同时Portal本身的多线程机制当用户访问量较大而又不能及时释放时也会好用较多的WebContainer,通常我们会将线程池个数调大10倍。如果日志中爆出“some threads is hung ,waiting for…”等类似的错误时,很可能就是线程池已经不够用了。当然,这时候我们首先得排除程序错误导致的线程池不释放导致耗尽的原因,如果排除此项,八成就是线程池个数太少导致的。而这种错误非常严重,会直接导致页面空白、页面无法显示等用户响应丢失的情况,不久就会导致宕机。

  • 主题与皮肤调优

主题与皮肤优化指的是客户为了适应定制化需求,会为客户开发一套或多套门户主题与皮肤(即:Themes 和 Skins)。笔者已经遇到多家客户由于主题皮肤的问题导致系统性能低下或者宕机的情况发生了。

(一)问题分析

主题皮肤导致的性能低下或宕机主要体现在两个方面:第一,过多的主题或皮肤。很多用户为了丰富门户的视觉效果,会要求开发商开发多套主题和皮肤,几乎每张主页面都要使用单独的一套主题,每套主题下每个Portlet都要使用一个单独的皮肤。我们知道,Portal里每套主题或者每套皮肤都在单独的一个文件夹里三十多个文件拼装编译出来的。用户在使用门户系统时,多套主题与皮肤被加载,这意味着有数百甚至数千个jsp或者jspf,css,js,jpg等文件被加载进内存,太消耗系统资源了!这种情况多发生在一些对门户视觉效果要求较高的客户那里;第二、主题或皮肤文件中存在质量不高的代码,例如:有些主题皮肤里存在死循环,或者需要读取其他系统甚至互联网上的一些资源,当外围系统没有及时处理并返回结果时,主题皮肤一直在等待这个资源,如果资源没有被返回,就得等到超时,如果超时了都在等待的话,就很明显地出现页面空白或显示不出来了。

(二)优化策略

笔者强烈建议,能通过一些参数化的方式解决的问题尽量通过参数化的方式,例如多个部门门户的主题皮肤使用同一套主题,通过参数化主题上的Logo图片,参数化文字等方式实现各个部门门户网站的显示效果差异;同样的,每套主题尽量不要超过5套皮肤,还是通过参数化的方式来进行Portlet不同风格的呈现。

至于主题皮肤代码层面,建议项目组花大力气严格检查有没有存在死循环、读取大数据量、不及时释放内存等低质量代码、等待依赖系统响应等低质量逻辑。对不懂代码的客户来说如果要采用逆推的方式判断是否存在代码质量的情况,则可以使用LoadRunner对系统进行抗疲劳测试,通过耐压测试,让系统低质量代码对内存、CPU等的消耗和侵占尽量表现出来。鼎亚科技可以为全国的用户提供性能调优方面的免费培训和压力测试方面的指导、培训。

  • SQL执行效率优化

门户性能低或者宕机问题不仅仅是由于内存耗尽导致的,还有CPU和硬盘。SQL执行效率是同时可能对这三方面造成损耗的重要因素之一。

(一)问题分析

SQL执行效率的损害通常体现在如下两个方面:(1)SQL慢查询或者语句执行大数据量的查询并返回了大数据量的查询结果,例如某客户一下子查询出4000万条用户登录记录并打印在了主题文件里,这些大数据量既会占用内存,又会消耗CPU,甚至写入一些硬盘文件,天长日久导致硬盘被占满而宕机。SQL慢查询则会带来大量的用户等待时间。(2)SQL语句执行次数过多或死循环。系统要查询一组数据时,需要到多张表里执行多组查询并拼装处理返回的结果,或者某些极端条件出发SQL执行死循环,既消耗大量的CPU资源又不返回结果,宕机也就是不可避免的了。

(二)优化策略

务必通过强壮的代码审查(Code Review)识别出SQL慢查询、大数据量查询、死循环等问题,并合理设计表结构,合理设计SQL语句。与上一节相同,对不懂代码的客户来说如果要采用逆推的方式判断是否存在代码质量的情况,则可以使用LoadRunner对系统进行抗疲劳测试,通过耐压测试,让系统低质量代码对内存、CPU等的消耗和侵占尽量表现出来。鼎亚科技可以为全国的用户提供性能调优方面的免费培训和压力测试方面的指导、培训。所谓的抗疲劳测试指的是,录制尽可能覆盖所有页面、所有逻辑的功能点,并设置LoadRunner在没有思考时间的前提下,进行长达72小时的耐久性测试,所谓“日久见人心”,哪怕SQL执行效率稍微有一点点低下,资源有一点点没有及时释放的,通过高强度的耐压测试,也会让问题无限放大,最终暴露出来。

  • 数据库性能优化

数据库性能优化指的是数据库本身的参数优化,以及WebSphere使用数据源连接池的参数优化。

(一)问题分析

Portal使用数据源连接池即长连接的方式提供数据库服务,所以不合理的数据源连接池配置会导致数据库处理逻辑等待时间过长或者宕机。例如:如果某些Portlet应用频繁读取数据库,而连接池的个数过低,就会有大量的数据库读写逻辑在排队等待数据库连接,甚至超时后导致宕机,最直接的后果就是用户的很多Portlet应用一直初始化不出来,原因是在等待其他逻辑释放数据源连接池后进行数据库读写操作。

(二)优化策略

通常我们会在应用服务器AS控制台上配置数据源连接池的个数为系统默认的3-6倍,具体视各家客户的门户内容使用数据库的频率高低而定。数据源连接池个数过低,会造成Portlet逻辑排队等待拉长响应时间;个数过高则会导致系统可用内存降低,因为每个数据源连接池会占用大约3M左右的内存,如果配置几百个数据源连接池,则仅仅数用于数据库连接的内存就会占用1个多G,计算我们配置了3.5G的JVM,也没剩多少计算内存用于门户的逻辑处理,同样也会导致系统的性能降低或宕机。这里还要强调数据源连接池的过期时间,不恰当的TimeOut也会带来等待响应或系统无法处理用户的正常请求。最准确的个数配置来源于最佳实践。直白的说,就是通过设置不同的参数后进行合理配置的LoadRunner压力测试,压力测试场景的设计尽量贴近用户使用的真实场景,来模拟生产环境的真实状况,然后通过对比LoadRunner压力测试表现最好的那组,确定数据源连接池的最佳配置。

额外的,通常数据库服务器和门户服务器是不同的服务器,中间架设防火墙的客户比例非常高,这里我们要强调一下一定协助客户合理配置防火墙策略,因为防火墙切断门户与数据库之间的长连接而导致的门户宕机案例非常之高。

  • 数据/数据集优化

数据与数据集优化指的是无论Portal容器还是Portlet容器读写的数据量大小问题,数据量过大会消耗大量时间和空间资源,会导致系统性能低下或宕机。

(一)问题分析

Portal主题皮肤里的代码和(或)Portlet应用逻辑代码在执行大数据量操作时,会消耗大量的时间资源、空间资源;时间资源体现在CPU处理上,空间资源体现在内存占用上。无论是CPU过于繁忙还是内存消耗过大都是一种危险的事,最常用的就是分段读写、分页显示、大数据转移等问题。

(1)大数据量读写。数据库执行大数据量读写时,会消耗大量的CPU时间和内存占用,用户并发量一上升,就很容易导致性能问题。

(2)分页显示。这个无需多说,用户通常看的是前3页,如果一下子把几百页读取过来,内存空间的占用是巨大的。

(3)大数据转移,指的是某些表里可能存储非常大量的数据,例如用户登陆日志,数据积累越来越多,读写速度就会越来越慢,系统资源消耗就会越来越大,性能也就越来越低了。

(二)优化策略

针对于常见的这些问题,分别介绍调整策略。这部分其实最多的也是与常规Java开发相同,请自行参考。

(1)分段读写指的是,逻辑代码在读写数据时,尽量不要大数据量读写,例如向数据库或文件系统中一次写入超过10万条数据,或者读入上百万条数据,这种效率肯定极低,尝试修改设计,优化读取逻辑。

(2)分页显示。这个无需多说,每次读写最多3页,等用户点击翻页时再读取更多的数据。

(3)大数据转移。适用于某些表里要存储大数据量时,最好不要超过千万条记录的级别,通常用在用户登录日志等,随着使用时间的推移,表中的记录条数越来越多,读取的时候也很容易消耗资源。

  • Portlet代码与逻辑优化

Portlet开发实际上与传统的Java开发并无二致,Portlet等待数据库连接、死循环等带来的系统性能低下,成为Portlet层面优化的问题本质。

(一)问题分析

Portlet代码导致性能低下的情况通常有:(1)执行逻辑效率低或死循环导致Portlet响应异常地慢,例如要到十几套系统里读取各个系统的待办信息等;(2)Portlet等待某些资源而这些资源没有及时加载或者压根就加载不出来,而Portlet端有没有处理读取不出来时候的出错处理,导致Portlet一直在等待资源,系统线程Hung住也就很正常了。

(二)优化策略

这需要合理设计Portlet实现逻辑。例如:统一待办Portlet,我们可以采用逆向推送的方式,当各个业务系统产生新的待办事项时,主动推送到门户缓冲数据库(可以认为是Broker层),然后Portlet直接到缓冲数据库一个表里读取待办条目,这样可以提高Portlet性能达数十倍。

第二,通过严格的代码检查消除Portlet中资源等待、死循环等问题。这个问题的检查与普通的Java开发并无二致,本文不再赘述。

  • 网络传输(包大小)优化

显示逻辑和打包逻辑优化多发生在网络速度不太高的客户场景中,尤其是部署在云端或者互联网上的客户,指的是过大的数据量传输导致了用户响应时间太慢,慢到用户以为系统宕机了。备注:如果传输时间超时,那就真宕机了。

(一)问题分析

我们知道,所有用户的请求都是通过服务器端唯一的网线出口与用户的客户端电脑(或手机)建立比特流传输的。建设每个用户访问门户需要传输3M的数据流量,这3M包含了逻辑处理完成之后编译出来的css文件,jss文件,html文件,jpg/png等图片文件,假设有300个用户在并发访问,则这300个用户一共需要传输3Mx300=900M数据流量。如果我们服务器申请的带宽是百兆,也就是每秒钟能传输12.5M数据,则即使出去逻辑处理的时间,进网路传输的消耗,就需要900M除以12.5M/S等于72秒,这是一个多么庞大的数据,每个用户光等待传输就要等待72秒

(二)优化策略

在不影响图片观看效果的情况下,我们建议用户尽量降低图片的大小,对程序开发者来说,在不影响功能的前提下,尽量为js文件、css文件等减肥,将其体积降到最低,尽量降低网路传输带来的用户体验消耗。作为系统架构师或项目经理,要充分调研,充分考虑到真实的用户并发情况,并协助用户购买或分配合理的网络带宽。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel文本函数应用:单元格中的数字和字母,如何判断?

文本字符是Excel中除了数字以外的另一种非常常用的数据类型,Excel也提供了大量的文本函数。利用这些函数我们可以用来判断字符串开头是否为数字、字符串是否同时包含了数字和英文、字符串是否包含了指定字符,可以用来转换英文字母的大小,可以…

Java基础之Stream的使用078

1. Stream 的使用 Stream 是什么? Stream 是数据渠道,用于操作数据源(数组、集合等)所生成的元素序列。 Java8两大最为重要的改变就是 Lambda表达式 与 Stream API,这两种改变的引入带来的是新的抽象方式 &#xff08…

目标检测之Fast RCNN概述

基本原理 Fast Rcnn主要步骤为 利用SR算法生成候选区域利用VGG16网络进行特征提取利用第一步生成的候选区域在特征图中得到对应的特征矩阵利用ROI pooling将特征矩阵缩放到相同大小并平展得到预测结果 相对于RCNN的优化 主要有三个改进 不再将每一个候选区域依次放入CNN网络…

【基于通道-空间注意的高分辨率锐化】

Channel–spatial attention-based pan-sharpening of very high-resolution satellite images (基于通道-空间注意的很高分辨率卫星影像全色锐化) 全色锐化处理旨在生成新的合成输出图像,其保留全色的空间细节和多光谱图像输入的光谱细节。…

【服务器端程序的演进过程】

目录 1 服务器端程序的演进过程 阶段一:静态服务器 阶段二:普通动态服务器 阶段三: 以用户共享内容为主的互联网生态 阶段四: 微服务时代(有高并发需求或特征的网站) 2 Java服务器项目分类 3 微服务概述 3.1 什么是微服务 3.2 为什么需要微服务 3.3 怎么搭建微服务项…

C#获取计算机详细的软件和硬件信息

利用System.Management提供的类可以用于读取本地计算机设备的各种数据,包括操作系统、软件、硬件的各种详细信息,内容很丰富。 System.Management的命名空间下,ManagementObjectSearcher类用于查询特定类型的设备,ManagementObjec…

转行做“程序员”很难?这里有几个建议...

“是什么?为什么?怎么样?”的灵魂三连问在我们生活中比比皆是,目的是为了清晰思考和看到事物的本质。对于编程学习也是一样,需要带着疑问从本质上去学习编。 本人是某985高校的本硕连读,非计算机科班出身&…

利器 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

1080469 14.7 KB 上两篇文章介绍了自动遍历的测试需求、工具选择和 AppCrawler 的环境安装、启动及配置文件字段基本含义,这里将以实际案例更加细致的说明配置文件的用法和一些特殊场景的处理。 下面我们继续之前的例子,在雪球搜索框输入搜索内容后的页面…

CloudFlare系列--功能介绍与常用配置

原文网址:CloudFlare系列--功能与特性的介绍_IT利刃出鞘的博客-CSDN博客 简介 本文介绍CloudFlare的功能与常用的配置。 功能介绍 CloudFlare是世界最强的网络服务商。它可以提供如下服务: 防御DDoS攻击 世界最强防御DDos攻击的厂商。域名注册 世界最…

JavaWeb语法四:多线程案例

目录 1.单例模式 1.1:饿汉模式 1.2:懒汉模式 2.阻塞式队列 2.1:生产者消费者模型 2.2:阻塞队列的模拟实现 3.线程池 3.1:标准库中的线程池 3.2:模拟实现线程池 前言:前一篇我们讲了线程不安全的原因…

SAP UI5 里 FlexBox 的使用方法

ScrollContainer 的使用方式: ScrollContainer 是一个控件,可以在有限的屏幕区域内显示任意内容,并提供滚动以使所有内容都可访问。注意,为了避免影响用户使用体验,不要嵌套沿相同方向滚动的滚动区域。例如&#xff…

【LaTex】基础语法框架快速入门教程——Tex live+TexStudio简要安装及使用教程

0. 引言 LaTeX对于论文排版有着巨大的便利,并且对于参考文献的引用也十分方便,不会出现使用word引用参考文献一旦更改文献引用顺序,就必须全部改编号的情况。这里记录一下如何从0开始学习使用LaTeX书写论文。 1. 软件安装&环境配置 1.…

Qt中实例化一个函数变量时加不加括号的区别,以及括号中的this的使用

一、设计一个测试小程序 废话不多说,直接上代码。 main.h函数就不多说了,没改动。直接上mainwindow.h,也没改动。看mainwindow.cpp的内容。 #include "mainwindow.h" #include "ui_mainwindow.h" #include "test.…

机器学习算法基础——KNN算法

KNN (K-Nearest Neighbor)–K近邻分类算法 • 为了判断未知实例的类别,以所有已知类别的实例作为参照选择参数K • 计算未知实例与所有已知实例的距离 • 选择最近K个已知实例 • 根据少数服从多数的投票法则(majority-voting),让未知实例归类为K个最邻…

Zerobot僵尸网络出现了新的漏洞利用和功能

©网络研究院 Zerobot DDoS僵尸网络已经获得了重大更新,扩展了其针对更多互联网连接设备和扩展网络的能力。 微软威胁情报中心 (MSTIC)正在以DEV-1061的名称跟踪持续的威胁,名称为未知、新兴或发展中的活动群集。 本月早些时候,Fort…

2022年山东省职业院校技能大赛中职组“网络安全”赛项规程

2022年山东省职业院校技能大赛中职组“网络安全”赛项规程一、赛项名称赛项名称:网络安全英文名称:Cyber Security赛项组别:中职组赛项类别:电子与信息类二、竞赛目的网络空间已经成为陆、海、空、天之后的第五大主权领域空间,习总…

SpringCloud 网关组件 Zuul-1.0 原理深度解析

为什么要使用网关? 在当下流行的微服务架构中,面对多端应用时我们往往会做前后端分离:如前端分成 APP 端、网页端、小程序端等,使用 Vue 等流行的前端框架交给前端团队负责实现;后端拆分成若干微服务,分别…

k8s使用glusterfs(静态供给、动态供给)、glusterfs的安装与使用

目录前言主机准备配置主机名、关闭防火墙、关闭selinux挂载磁盘安装glusterfs服务端glusterfs的端口分布式集群的结构组成glusterfs集群创建存储卷启动卷k8s使用glusterfs作为后端存储(静态供给glusterfs存储)恢复初始化环境安装Heketi 服务(…

如何快速读懂开源代码?

文章目录**RUN起来****调试****把控关键数据结构和函数****从小的开始****关注一个模块****工具****一、阅读开源代码存在的一些误区**二、阅读代码的心态**三、阅读源码与**辅助材料**四、如何阅读开源代码****《gdb 高级调试实战教程》电子书下载链接:**1 下载 Ng…

ASP.NET开源版MES加工装配模拟系统源码/WinForm工厂加工装配系统源码/流程工序管理

一、源码描述 本系统用户大学机械科上位机加工装配模拟实验,目前正常用于实验当中。环境:VS2010(C# .NET4.0,多层结构)、sqlserver2008 r2 ;Winform;使用到RFID读写器(设备是可以变更的,修改RFID.Library项目的…