tomcat 的并发能力分析

tomcat

参考:Tomcat的3个参数acceptCount、maxConnections、maxThreads

Tomcat 的核心组件

Tomcat 由 2 大核心组件组成:Connector、Container

在这里插入图片描述


Tomcat 处理请求的过程

请求在 tomcat 服务器的处理过程(BIO 模式)

  1. 客户端与服务端完成三次握手建立了连接,连接信息会存放在 ServerSocket 连接请求的队列中(队列长度为 acceptCount)

  2. 如果提交到线程池的任务数没有超过 maxConnections,那么就 ServerSocket.accept() 返回 socket 对象,封装为任务提交到线程池;

    如果提交的任务数超过了 maxConnections,则阻塞

  3. 任务提交到线程池后,分三种情况:

    • 线程数 <= minSpareThreads:不管有没有空闲线程,都新建线程来处理任务
    • minSpareThreads < 线程数 < maxThreads:新任务会优先使用空闲线程,如果没有空闲线程就新建线程
    • 线程数 == maxThreads:新任务就会在 Connector 创建的 ServerSocket 队列中堆积起来,直到到达最大的配置值(acceptCount 属性值)
  4. 若队列已满,任何再来的请求将会收到 connection refused 错误,直到有可用的资源来处理它们

    当任务被处理完后,则销毁任务以及任务中的 socket 对象,该连接被释放


在这里插入图片描述


Connector 的 protocol(协议)

Connector 在处理 HTTP 请求时,会使用不同的 protocol。不同的 Tomcat 版本支持的 protocol 不同,其中最典型的 protocol 包括BIO、NIO 和 APR(Tomcat7 中支持这 3 种,Tomcat8 增加了对 NIO2 的支持,而到了 Tomcat8.5 和 Tomcat9.0,则去掉了对 BIO 的支持)。

  • BIO(Blocking IO):阻塞的 IO

  • NIO(Non-blocking IO):非阻塞的 IO

  • APR(Apache Portable Runtime):是 Apache 可移植运行库,利用本地库可以实现高可扩展性、高性能;

    Apr 是在 Tomcat 上运行高并发应用的首选模式,但需要安装 apr、apr-utils、tomcat-native 等包。


BIO

在 BIO 实现的 Connector 中,处理请求的主要实体是 JIoEndpoint 对象。

JIoEndpoint 维护了 Acceptor 和 Worker:

  • Acceptor 接收 socket,然后从 Worker 线程池中找出空闲的线程处理 socket,如果 worker 线程池没有空闲线程,则 Acceptor 将阻塞。
  • Worker 是 Tomcat 自带的线程池,如果通过配置了其他线程池,原理与 Worker 类似。

在这里插入图片描述


NIO

在 NIO 实现的 Connector 中,处理请求的主要实体是 NIoEndpoint 对象。

NIoEndpoint 中除了包含 Acceptor 和 Worker 外,还使用了 Poller,处理流程如下图所示:

在这里插入图片描述

  • Acceptor 接收 socket 后,不是直接使用 Worker 中的线程处理请求,而是先将请求发送给了 Poller,而 Poller 是实现 NIO 的关键。Acceptor 向 Poller 发送请求通过队列实现,使用了典型的生产者-消费者模式。
  • 在 Poller 中,维护了一个 Selector 对象;当 Poller 从队列中取出 socket 后,注册到该 Selector 中;然后通过遍历 Selector,找出其中可读的 socket,并使用 Worker 中的线程处理相应请求。
  • 与 BIO 类似,Worker 也可以被自定义的线程池代替。

在 NIoEndpoint 处理请求的过程中,无论是 Acceptor 接收 socket,还是线程处理请求,使用的仍然是阻塞方式;但在 ”读取socket并交给Worker中的线程” 的这个过程中,使用非阻塞的 NIO 实现,这是 NIO 模式与 BIO 模式的最主要区别(其他区别对性能影响较小,暂时略去不提)。而这个区别,在并发量较大的情形下可以带来 Tomcat 效率的显著提升。


影响并发的 tomcat 参数

  • maxConnections :Tomcat 在任意时刻接收和处理的最大连接数(可以提交给线程池的最大任务数)

    当 Tomcat 接收的连接数达到 maxConnections 时,Acceptor 线程不会读取 accept 队列中的连接(socket);这时 accept 队列中的线程会一直阻塞着,直到 Tomcat 接收的连接数小于 maxConnections。

    如果设置为 -1,则连接数不受限制。

    默认值与连接器使用的协议有关:

    • NIO 的默认值是 10000

    • APR/native 的默认值是 8192

      在windows下,APR/native 的 maxConnections 值会自动调整为设置值以下最大的 1024 的整数倍

      如设置为 2000,则最大值实际是 1024

    • BIO 的默认值为 maxThreads(如果配置了 Executor,则默认值是 Executor 的 maxThreads)

  • acceptCount :允许的最大并发连接数(瞬时连接、瞬时并发数),为 ServerSocket 连接请求的队列长度,默认值为 100

    请求连接在任务队列中时,客户端显示为浏览器显示“转圈”

    当 accept 队列中连接的个数达到 acceptCount 时,队列满,进来的请求一律被拒绝。

    实际场景中,常见的表象是 nginx 响应 502,Tomcat 中没有任何 access 日志,此时应该调大该值。

  • minProcessors:服务器启动时,线程池创建的最少线程数

  • maxProcessorsmaxThreads ):线程池最大连接线程数。默认值为 200

    线程数小于此数时,每次来任务若有空闲线程,使用空闲线程处理,如果没有空闲线程则新建线程处理

    如果该 Connector 绑定了 Executor,这个值会被忽略,因为该 Connector 将使用绑定的 Executor,而不是内置的线程池来执行任务。

    注:

    • maxThreads 规定的是最大的线程数目,并不是实际 running 的 CPU 数量;

      实际上,maxThreads 的大小比 CPU 核心数量要大得多。

      因为处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。

    • 因此,在某一时刻,只有少数的线程真正的在使用物理 CPU,大多数线程都在等待;

      故线程数远大于物理核心数才是合理的。

      换句话说,Tomcat 通过使用比 CPU 核心数量多得多的线程数,可以使 CPU 忙碌起来,大大提高 CPU 的利用率

  • minSpareThreads :线程池最小空闲线程数(多余的空闲线程都将杀死)。默认值为 25

    线程数小于此数时,每次来任务都新建线程处理

  • maxSpareThreads :线程池最大空闲线程数

    一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程

  • maxIdLeTime:一个线程空闲多久算是一个空闲线程,单位:毫秒

  • connectionTimeout :网络连接超时。单位:毫秒。默认值为 60000ms(60秒)

    设置为 0 表示永不超时,但这样设置有隐患的。通常设置为 30000 毫秒或使用默认值

  • disableUploadTimeout :禁用上传超时,主要用于大数据上传时,允许 Servlet 容器正在执行使用一个较长的连接超时值,以使 Servlet 有较长的时间来完成它的执行,默认值为 false

  • enableLookups :是否反查域名,取值为:true 或 false

    若为 true,则可以通过调用 request.getRemoteHost() 进行 DNS 查询来得到远程客户端的实际主机名

    若为 false,则不进行DNS查询,而是返回其 ip 地址

    为了提高处理能力,应设置为 false

补充说明:

  • maxThreads 和 acceptCount 属性对 tomcat 能同时处理的请求数和请求响应时间有直接的影响。

    无论 acceptCount 值为多少,maxThreads 直接决定了实际可同时处理的请求数。

    而不管 maxThreads 如何,acceptCount 则决定了有多少请求可等待处理。

  • 然而,不管是可立即处理请求还是需要放入等待区,都需要 tomcat 先接受该请求(即接受客户端的连接请求,建立socketchannel),那么 tomcat 同时可建立的连接数(maxConnections 属性值)也会影响可同时处理的请求数。


如何设置 acceptCount 、maxConnections、maxThreads 的值:

  • CPU 越不密集(或 IO 越密集),maxThreads 应该越大

  • maxConnections 的设置与 Tomcat 的运行模式有关

    如果 tomcat 使用的是 BIO,那么 maxConnections 的值应该与 maxThreads 一致(默认值为 maxThreads)

    如果 tomcat使用的是 NIO,maxConnections 值应该远大于 maxThreads(默认值为 10000)

  • Tomcat 能够接收的连接数 = maxThreads + acceptCount

    acceptCount 的设置,与应用在连接过高情况下希望做出什么反应有关系

    • 如果设置过大,后面进入的请求等待时间会很长
    • 如果设置过小,后面进入的请求立马返回 connection refused

在线用户数、连接数、瞬时并发数、线程数的区别

  • 在线用户数 = 连接数 + 静态用户数(已登录,但连接已断开,只是在浏览静态数据)(有session对象,没有socket对象)
  • 连接数 = 已接受连接数 + 瞬时并发数(acceptCount:在连接队列里等待的socket对象数)
  • 已接受连接数 = 线程数(RUNNABLE状态)(正在处理)+ 任务队列中的任务数(已接受,待处理)

影响并发的其他限制因素

  • Tomcat 的运行模式

    • BIO(阻塞式的 Socket 通信)模式

      Tomcat8 以下版本,默认的 HTTP 实现是采用 BIO 模式,每个请求都需要创建一个线程处理

      这种模式下的并发量受到线程数的限制,不大适合高并发,但技术成熟。

      每个进程中的线程数受制于操作系统的内核参数设置:

      • Windows 主机每个进程中的线程数不允许超过 2000
      • Linux 主机每个进程中的线程数不允许超过 1000
    • NIO模式(非阻塞式的 Socket 通信)

      Tomcat8 以上版本,默认使用的就是 NIO 模式,在性能上高于阻塞式的,每个请求也不需要创建一个线程进行处理,并发能力比前者高。

    • APR 模式(全称 Apache Portable Runtime)

      是 Tomcat 生产环境运行的首选方式。但必须要安装 APR 和 Native,直接启动就支持 APR。

      APR 是从操作系统级别解决异步 IO 问题。APR 的本质就是使用 JNI 技术调用操作系统底层的 IO 接口,所以需要提前安装所需要的依赖。

      如果操作系统未安装 APR 或者 APR 路径未指到 Tomcat 默认可识别的路径,则 APR 模式无法启动,自动切换启动 NIO 模式。

      注:APR 模式可以提升 Tomcat 对静态文件的处理性能,当然也可以采用动静分离。

  • JVM 调优(tomcat 可以使用的内存)

    Tomcat 是运行在 JVM 上的,所以对 JVM 的调优也是非常有必要的

    在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用

    tomcat 默认可以使用的内存为128MB,在并发量较大的应用项目中,这点内存是不够的,需要修改 JVM 参数调优

    • Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:

      JAVA_OPTS=‘-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】’

      需要把这个两个参数值调大。例如:JAVA_OPTS=‘-Xms256m -Xmx512m’

      表示初始化内存为 256MB,可以使用的最大内存为 512MB

  • 一台主机允许的连接数、线程数、内存大小、硬件性能和 CPU 数量,都会限制实际并发数

  • 并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算,那并发能力势必会下降。

    如果每个请求都含有很多的数据库操作(或其他中间件的连接),那么对于数据库的性能要求也是非常高的。

    对于单台数据库服务器来说,允许客户端的连接数量是有限制的(数据库读写的并发能力)

    建议当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群


拓展

tomcat 服务器 server.xml 文件

<Server port="8005" shutdown="SHUTDOWN">  
<!-- 属性说明  
    port: 指定一个端口,这个端口负责监听关闭Tomcat的请求  
    shutdown: 向以上端口发送的关闭服务器的命令字符串  
-->  
    <Listener className="org.apache.catalina.core.AprLifecycleListener" />  
    <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />  
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
    <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>  

    <GlobalNamingResources>  
        <Environment name="simpleValue" type="java.lang.Integer" value="30"/>  
        <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" 
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
                  pathname="conf/tomcat-users.xml" />    
    </GlobalNamingResources>  
    
    <!--  每个Service元素只能有一个Engine元素。元素处理在同一个<Service>中所有<Connector>元素接收到的客户请求 -->  
    <Service name="Catalina">  
    <!-- 属性说明 name: Service的名称 -->  

        <!-- Connector元素: 由Connector接口定义。<Connector>元素代表与客户程序实际交互的给件, 它负责接收客户请求,以及向客户返回响应结果 -->  
        <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" acceptCount="100" 
                   minSpareThreads="25" maxSpareThreads="75" 
                   connectionTimeout="20000" disableUploadTimeout="true" 
                   enableLookups="false" redirectPort="8443" /> 
        <Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />  
        <!--属性说明  
            port: 服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求  
            maxThreads: 设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目,默认值为200
            acceptCount: 当所有可以使用的处理请求的线程都被用光时,可以放到处理队列中的请求数
                         超过这个数的请求将不予处理,而返回Connection refused错误  
            minProcessors: 服务器启动时创建的处理请求的线程数,每个请求由一个线程负责  
            maxProcessors: 最多可以创建的处理请求的线程数  
            minSpareThreads: 最小备用线程   
            maxSpareThreads: 最大备用线程
            connectionTimeout: 等待超时的时间数(以毫秒为单位)
            disableUploadTimeout: 禁用上传超时,主要用于大数据上传时
            enableLookups: 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名;
                           若为false则不进行DNS查询,而是返回其ip地址
            redirectPort: 服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
            debug: 日志等级
            protocol: 必须设定为AJP/1.3协议
            address: 如果服务器有两个以上IP地址,该属性可以设定端口监听的IP地址,默认情况下,端口会监听服务器上所有IP地址
        -->

        <Engine name="Catalina" defaultHost="localhost">  
        <!-- 属性说明  
        	name: 对应$CATALINA_HOME/config/Catalina中的Catalina   
            defaultHost: 缺省的处理请求的虚拟主机名
					对应Host元素中的name属性,也就是$CATALINA_HOME/config/Catalina/localhost中的localhost  
               		它至少与其中的一个Host元素的name属性值是一样的  
            debug: 日志等级  
        -->  

            <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 
            
            <!-- 由Host接口定义。一个Engine元素可以包含多个<Host>元素,每个<Host>的元素定义了一个虚拟主机。它包含了一个或多个Web应用 -->  
            <Host name="localhost" appBase="webapps" autoDeploy="true" unpackWARs="true"  
                  xmlValidation="false" xmlNamespaceAware="false">  
            <!-- 属性说明  
        		name: 虚拟主机名。即 $CATALINA_HOME/config/Catalina/localhost中的localhost
            	appBase: 默认的应用路径,此路径相对于$CATALINA_HOME/ (web应用的基本目录) 。
						 在autoDeploy为true的情况下,可自动部署应用此路径
            	autoDeploy: 默认为true,表示如果有新的WEB应用放入appBase并且Tomcat在运行的情况下,自动载入应用
				debug: 是日志的调试等级
				unpackWARs: 如果为true,在Web应用为*.war时,tomcat会自动将WAR文件解压;
							否则不解压,直接从WAR文件中运行应用程序
       		 -->  

                <Context path="/demm" docBase="E:\\projects\\demm\\WebRoot" debug="0" reloadable="true" >   
                </Context>  
                <!-- 属性说明  
					path: 访问应用的上下文路由URI
						  如果http://localhost/是应用的根目录,访问此应用接口的url前缀为http://localhost/demm
            		docBase: WEB应用的目录。即 web应用的文件存放路径或者是WAR文件存放路径
                 			 注意:此目录必须符合Java WEB应用的规范
            		debug: 日志等级   
            		reloadable: 是否在程序有改动时自动重新载入。如果为true,则Tomcat将支持热部署,但会影响性能。
						即可以自动检测web应用的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的JSP和Servlet。
						可以在不重起Tomcat的情况下改变web应用。
        		-->  
            </Host>  
        </Engine>  
    </Service>  
</Server>  

注:

  • tomcat 启动后会默认占用 8080,8009和 8005 三个端口
    • 8080 端口负责建立 HTTP 连接。在通过浏览器访问 Tomcat服务器的 Web 应用时,使用的就是这个连接器
    • 8009 端口负责和其他 HTTP服务器建立连接。在把 Tomcat 与其他 HTTP 服务器集成时就需要用到这个连接器
    • 8005 端口用来向 Tomcat 发布 shutdown 命令的

对网络端口的理解

  • 实际上,电脑在网卡上的硬件网络端口只有一个。
  • 常说的 1-65535 号端口,并不是真的有这么多个硬件端口,硬件端口实际上只有一个,访问所有端口的数据包都发往这个硬件端口。
  • 硬件端口接收到数据包之后进行解析,然后通知监听对应端口的socket对象来取数据。

并发量计算

参考: 并发量计算

几个概念:业务并发用户数、最大并发访问数、系统用户数、同时在线用户数

  • 假设一个 OA 系统有 1000 用户,这就是系统用户数
  • 最高峰同时有 500 人在线,是“同时在线人数”,也称作“最大业务并发用户数
  • 500 个同时使用系统用户中20%查看系统公告,不构成压力;20%填写表格(只在提交时才会请求,填写对服务器不构成压力);40%在发呆(什么都没做);20%用户不停从一个页面跳转另一个页面(只有这20%对服务器产生了压力)
  • 服务器实际压力(能承受的最大并发访问数),既取决于业务并发用户数,还取决于用户的业务场景,**这些可以通过对服务器日志的分析得到,**一般只需要分析典型业务(用户常用,最关注的业务操作)。

估算业务并发用户数的公式(测试人员一般只关心业务并发用户数)

  • C = nL / T

  • C^ = C + 3 × (C的平方根)

    • C 是平均的业务并发用户数
  • n 是 login session 的数量

    • L 是 login session 的平均长度
  • T 是指考察的时间段长度

    • C^ 是指业务并发用户数的峰值

该公式的得出是假设用户的 login session 产生符合泊松分布而估算得到。

假设:OA 系统有1000用户,每天400个用户发访问,每个登录到退出平均时间2小时,在1天时间内用户只在8小时内使用该系统。

C = 400 × 2 / 8 = 100

C^ = 100 + 3 × (100的平方根) = 100 + 3 × 10 = 130

另外,如果知道平均每个用户发出的请求数 u,则系统吞吐量可以估算为 u × C

注意:

  • 精确估算,还要考虑用户业务操作存在一定的时间集中性(比如上班后 1 小时内是 OA 系统高峰期),采用公式计算仍然会存在偏差
  • 针对例子 OA 系统可以把 1 小时设定为考察时间的粒度,将一天 8 小时划分为 8 个区间,这样可以解决业务操作存在集中性问题,更趋于精准,偏差更小。

系统吞度量要素

参考:系统吞吐量(TPS)、用户并发量、性能测试概念和公式

系统吞吐量的几个重要参数:QPS(TPS)、并发数、响应时间

  • QPS(TPS)= 并发数 / 平均响应时间

    • QPS(TPS):每秒钟request / 事务数
    • 并发数: 系统同时处理的request / 事务数
    • 响应时间: 一般取平均响应时间

    (很多人经常会把并发数和 TPS 理解混淆)

  • 一个系统吞吐量通常由 QPS(TPS)、并发数两个因素决定。

    每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了

    如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。

  • 系统响应时间,由 CPU 运算、IO、外部系统响应等等组成。


tomcat 高并发配置与优化

参考:tomcat高并发配置与优化

  • 144
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 121
    评论
spring-boot-seckill分布式秒杀系统是一个用SpringBoot开发的从0到1构建的分布式秒杀系统,项目案例基本成型,逐步完善中。 开发环境: JDK1.8、Maven、Mysql、IntelliJ IDEA、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 启动说明: 1、启动前 请配置application.properties中相关redis、zk以及kafka相关地址,建议在Linux下安装使用。 2、数据库脚本位于 src/main/resource/sql 下面,启动前请自行导入。 3、配置完成,运行Application中的main方法,访问 http://localhost:8080/seckill/swagger-ui.html 进行API测试。 4、秒杀商品页:http://localhost:8080/seckill/index.shtml ,部分功能待完成。 5、本测试案例单纯为了学习,某些案例并不适用于生产环境,大家根据所需自行调整。 秒杀架构: 架构层级 1、一般商家在做活动的时候,经常会遇到各种不怀好意的DDOS攻击(利用无辜的吃瓜群众夺取资源),导致真正的我们无法获得服务!所以说高防IP还是很有必要的。 2、搞活动就意味着人多,接入SLB,对多台云服务器进行流量分发,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 3、基于SLB价格以及灵活性考虑后面我们接入Nginx做限流分发,来保障后端服务的正常运行。 4、后端秒杀业务逻辑,基于Redis 或者 Zookeeper 分布式锁,Kafka 或者 Redis 做消息队列,DRDS数据库中间件实现数据的读写分离。 优化思路 1、分流、分流、分流,重要的事情说三遍,再牛逼的机器也抵挡不住高级别的并发。 2、限流、限流、限流,毕竟秒杀商品有限,防刷的前提下没有绝对的公平,根据每个服务的负载能力,设定流量极限。 3、缓存、缓存、缓存、尽量不要让大量请求穿透到DB层,活动开始前商品信息可以推送至分布式缓存。 4、异步、异步、异步,分析并识别出可以异步处理的逻辑,比如日志,缩短系统响应时间。 5、主备、主备、主备,如果有条件做好主备容灾方案也是非常有必要的(参考某年锤子的活动被攻击)。 6、最后,为了支撑更高的并发,追求更好的性能,可以对服务器的部署模型进行优化,部分请求走正常的秒杀流程,部分请求直接返回秒杀失败,缺点是开发部署时需要维护两套逻辑。 分层优化 1、前端优化:活动开始前生成静态商品页面推送缓存和CDN,静态文件(JS/CSS)请求推送至文件服务器和CDN。 2、网络优化:如果是全国用户,最好是BGP多线机房,减少网络延迟。 3、应用服务优化:Nginx最佳配置、Tomcat连接池优化、数据库配置优化、数据库连接池优化。
平台设计方案(总6页) 平台总体框架设计 在整个系统的设计上,在保证系统效率的前提下,将突出系统的开放式、标准化、 模块化、易用实用、性能优化、可靠稳定等特点。 为充分保证系统在安全性、跨平台性、易扩展性、易维护性等方面的要求,建议采 用先进的三层应用体系结构。这种结构已成为当今应用软件的首选体系结构。 如图所示: 平台性能设计原则 响应时间 当数据录入操作时无等待时间。 日常操作用的显示响应时间(从敲执行键至完全显示画面、含相关数据) 3 秒; 复杂图表的显示响应时间 10秒; 峰值状态时,日常查询、统计和分析的响应时间 15 秒; CPU 和LAN 负荷率 CPU 平均负荷率 系统稳定状态:应用服务器<30% 系统繁忙状态:应用服务器<45% 内存 系统稳定状态:应用服务器<200M 系统繁忙状态:应用服务器<240M 在每5 分钟测试期间,系统LAN 负荷不大于30% 并发处理 并发处理用户 100 人; 系统峰值响应速度,并发处理用户 70 人; 系统处理能力下降到20%的时间每年应小于20分钟 在98%的时间内系统处理能力均大于90% 平台用户体验设计原则 我们在本系统的开发过程中将遵循以下几个原则: 适用性 根据现有软硬件平台的实际情况和未来发展方向,使系统的设计方案具有良好的适用 性。 先进性 为了保证开发出来的系统能够在较长的一段时间之内在技术层次上不落伍,要求本系 统的开发和设计在技术上具有足够的先进性。 易用性 为了确保多种层次计算机应用水平的员工均能够快速地掌握并进行方便地使用,要求 开发出的系统管理容易、操作简便、易用上手。 可靠性 系统要能够提供每天24小时,每周7天的不间断运作能力,并保证系统在访问高峰期 能作到正常工作且快速响应。 安全性 由于网络的开放性,传输数据不可避免的要受到来自各方的恶意侵害。在系统安全性 方面,为系统提供保护,保证系统的正常运作:在用户安全性方面,通过安全解决方案 来保证供求信息的发布的顺利完成。 平台数据库设计原则 建立完善的数据库结构管理设备的基本参数、运行状态和各种工作计划。数据库的 框架和结构必须根据设备和运行状态而设计,方便提供强大的录入、查询、统计、分析 和报表等各种功能,较好的反映业务的基本情况和运行状况,满足信息化的要求。 1. 对数据库平台的性能要求 根据本系统数据的特点,我们采用互联领域比较主流的MS SQL数Server 数据库(集群)作为系统的数据库平台,并且数据库开发方面采用标准SQL 语句,以便将来的扩展和移植。系统将采用数据库建模工具,根据系统功能模块的设计 ,构建出整个数据库。在构建数据库时,也会定义好数据库表的约束、关联以及索引。 针对系统的具体特点和系统要求,我们在进行数据库方案设计时对数据库平台提出下列 性能方面的要求: 标准化程度高,符合标准ANSI SQL 数据库语言的规范 支持Brower/SERVER 模式应用,支持对称处理和多线程技术 所建立的数据库可在多种操作系统下运行,独立性强,对系统结构影响比较小 有足够的并发控制、授权控制和事务处理能力及恢复能力 与异种数据源有良好的可互操作性 具有可靠的数据安全保密措施以及故障恢复能力 2. 数据库系统结构设计 根据本系统的结构和应用服务,同时考虑到整个系统的一体化方案、功能扩展和灵 活性,数据库将按以下原则采用主备的方式,数据备份实行实时备份的方式,并考虑采 用数据集群进行扩展。 利用JSON作为系统接口的数据交换标准 JSON 数据传输是移动互联网之间日渐流行的标准数据传输方式,由于与平台和编程语言的无 关性,因此,通过JSON可以有效保证对各种异构系统的数据接口需要,以达到平台服务 器与手机终端的最优整合。 为了防止数据泄密我们对数据使用MD5进行加密,在用户登录时会通过接口提供给手 机端一个唯一密钥用于对数据进行解密操作。 平台方案设计特点 ( 采用主流开源系统构建平台系统 选用Java语言作为项目的开发语句,Java语言是现在互联网领域使用非常广泛的语言, 如淘宝、天猫、阿里巴巴、易迅等大型网站均构建在Java语言的基础 ( 基于JSON标准的数据交换标准 通过应用JSON 技术,规范当前本系统的资料库数据标准,从而实现广域网上应用之间的互联互通。 ( 中间件技术 系统采用的中间件技术为当前最主流的中间件技术(nginx+tomcat),同时满足系统可 用性及稳定性,且相应的维护人员在市场中较为充裕,可以快速上手 服务器搭建建议 建设方案图 平台服务器搭建需4台服务器,包括负载均衡服务器(使用负载均衡为了以后应用服 务器集群做准备,一期也可不配置该服务器)、应用服务器、文件服务器、数据库服务 器 服务器配置建议(单台): CPU频率:>=2GHz CUP核心数:>=4 内
基于Spring Boot的疗养院管理系统的设计与实现是一个针对疗养院日常运营需求开发的综合性软件系统。该系统采用Java语言开发,利用Spring Boot框架简化了传统Spring应用的复杂配置和部署过程,使得项目快速启动和易于维护。系统主要特点:模块化设计:系统按照功能划分为多个模块,如客户管理、预约服务、疗养项目、收费管理等,便于扩展和维护。用户友好的界面:提供清晰直观的用户操作界面,包括患者信息录入、疗养服务预约、费用结算等功能。数据安全性:系统对敏感信息进行加密处理,确保用户数据的安全性。报表统计:内置多种报表统计功能,方便管理人员对疗养院的运营情况进行分析和决策。高并发支持:利用Spring Boot内嵌的Tomcat服务器,能够很好地支持并发访问,保证系统稳定运行。系统实现了疗养院的核心业务流程,包括但不限于客户资料管理、预约登记、疗养服务安排、费用计算与收取等。通过本系统的应用,可以显著提高疗养院的工作效率,改善服务质量,同时也为管理者提供了实时的业务数据分析,帮助其做出更加科学的管理决策。总之,综上所述,基于Spring Boot的疗养院管理系统是一个功能全面、操作简便且安全可靠的管理工具,适合各类疗养院机构使用,以提升其业务处理能力和管理水平。
### 回答1: 优化Tomcat环境的一些建议包括:1. 增加JVM内存,以充分利用可用的硬件资源;2. 优化Tomcat的线程池,控制线程数量和空闲线程的存活时间;3. 使用Tomcat的预编译器,以减少JSP的编译时间;4. 监控Tomcat的工作情况,及时发现性能瓶颈。 ### 回答2: 要优化Tomcat环境,可以采取以下几种方法: 1. 调整Tomcat的配置文件:可以通过修改server.xml文件来优化Tomcat的性能。例如,可以修改连接池的大小和属性,调整线程池的配置,以及增加内存的限制等。 2. 合理分配资源:确保Tomcat运行时有足够的物理内存可供使用。可以通过修改Tomcat启动脚本的JAVA_OPTS参数,增加-Xms和-Xmx参数来设置JVM的初始大小和最大大小,以及-XX:PermSize和-XX:MaxPermSize参数来设置永久代的初始大小和最大大小。 3. 配置连接和线程池:通过调整连接和线程池的大小来提高Tomcat的性能。可以根据服务器硬件的不同以及应用程序的负载情况,适当增加或减少连接和线程池的大小,以达到最佳性能。 4. 压缩静态资源:启用Tomcat的gzip压缩功能,可以减小静态资源的大小,加快网页加载速度。可以通过修改Tomcat的server.xml文件,添加以下配置: ``` <Connector compression="on" compressableMimeType="text/html,text/plain,text/css,text/javascript,application/json" /> ``` 5. 启用缓存:通过启用Tomcat的HTTP缓存功能,可以减少服务器对静态资源的请求次数,提高访问速度。可以通过修改web.xml文件,添加以下配置: ``` <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>cacheMaxSize</param-name> <param-value>100000</param-value> </init-param> <init-param> <param-name>cacheMaxObjectSize</param-name> <param-value>10240</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ``` 以上是一些常用的优化方法,根据实际情况可以进行调整和修改。需要注意的是,优化Tomcat环境是一个持续的过程,需要不断观察和调整,以保持最佳性能。 ### 回答3: 优化Tomcat环境包括以下几个方面: 1. 调整JVM参数:根据应用程序的需求和服务器的硬件配置,设置合适的JVM参数,例如内存大小、堆栈大小和垃圾收集等。合理的JVM参数可以提高Tomcat的性能和稳定性。 2. 优化线程池配置:通过调整Tomcat的连接器配置,设置合适的线程池参数,包括线程数、最大连接数、最大空闲连接数等。合理的线程池配置可以提高并发处理能力和响应速度。 3. 启用压缩和缓存:开启Tomcat的Gzip压缩功能,可以减少网络传输的数据量,提高响应速度。同时,设置合理的缓存策略,可以减少对服务器的请求,提高性能。 4. 优化静态资源:对于静态资源,可以通过配置Tomcat的静态资源缓存策略,让客户端缓存这些资源,减少服务器的压力。 5. 配置连接超时和请求超时:合理设置Tomcat的连接超时和请求超时时间,可以避免因为长时间的无效连接或请求占用服务器资源,影响系统的正常运行。 6. 使用连接池:对于数据库连接等资源,使用连接池可以提高资源的重用率和效率,减少资源的创建和销毁,进一步提高Tomcat的性能。 7. 监控和日志记录:配置Tomcat的监控工具,可以及时发现服务器的性能瓶颈和故障,并做出相应的优化。同时,合理配置日志记录,可以方便排查问题和分析系统的运行情况。 总之,优化Tomcat环境需要综合考虑硬件、网络、应用程序和服务器的配置等多个因素,通过合理调整参数和配置,提高Tomcat的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 121
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨鸦_Cormorant

大家喜欢的话可以点个关注投币哟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值