当前位置: 首页 > news >正文

tomcat 常见优化方案

tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。

  • 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
  • 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。
  • 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。

利用缓存和压缩:

  • 对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
  • 另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。
  • 除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。

采用集群:
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。

优化线程数优化:
找到Connector port=“8080” protocol=“HTTP/1.1”,增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

其中:

• maxThreads:tomcat可用于请求处理的最大线程数,默认是200
• minSpareThreads:tomcat初始线程数,即最小空闲线程数
• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100

使用线程池优化:
在server.xml中增加executor节点,然后配置connector的executor属性,如下:

<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

其中:

• namePrefix:线程池中线程的命名前缀
• maxThreads:线程池的最大线程数
• minSpareThreads:线程池的最小空闲线程数
• maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
• threadPriority:线程优先级

注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报:
java.net.SocketException:Too many open files错误。可使用下面步骤检查:

• ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID10001
• lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
• 使用命令:ulimit -a 查看每个用户允许打开的最大文件数

启动速度优化:

  • 删除没用的web应用:因为tomcat启动每次都会部署这些应用。
  • 关闭WebSocket: websocket-api.jar和tomcat-websocket.jar 。
  • 随机数优化:设置JVM参数: -Djava.security.egd=file:/dev/./urandom 。

内存优化:
因为tomcat启动起来后就是一个java进程,所以这块可以参照JVM部分的优化思路。堆内存相关参数,比如说:

  • Xms:虚拟机初始化时的最小堆内存。
  • -Xmx:虚拟机可使用的最大堆内存。-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
  • -XX:MaxNewSize:新生代占整个堆内存的最大值。
  • 另外还有方法区参数调整(注意:JDK版本)、垃圾收集器等优化。

相关文章:

tomcat 常见优化方案

tomcat作为Web服务器&#xff0c;它的处理性能直接关系到用户体验&#xff0c;下面是几种常见的优化措施&#xff1a; 对web.xml的监视&#xff0c;把jsp提前编辑成Servlet。有富余物理内存的情况&#xff0c;加大tomcat使用的jvm的内存 服务器所能提供CPU、内存、硬盘的性能…...

前端导出文本内容为csv文件,excel乱码

原因&#xff1a;编码格式问题&#xff0c;需要改为utf-8 bom // Create blob with utf8-bom 编码 const createBlobWithBOM(data, mimeType)> {const bom [0xEF, 0xBB, 0xBF];const bomArray new Uint8Array(bom);const dataArray new TextEncoder().encode(data);const…...

36---USB HUB电路设计

视频链接 USB HUB电路设计01_哔哩哔哩_bilibili USB HUB 电路设计 1、USB HUB基本介绍 USB Hub&#xff0c;指的是一种可以将一个USB接口扩展为多个&#xff0c;并可以使这些接口同时使用的装置。 Hub也是大家常说的集线器&#xff0c;它使用星型拓扑结构连接多个USB接口设…...

FPGA在深度学习领域的应用的优势

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是一种可编程逻辑芯片&#xff0c;可以根据需要重新配置其内部的逻辑电路和功能。在深度学习领域&#xff0c;FPGA被广泛用于加速模型训练和推理任务。 首先&#xff0c;FPGA可以提供高度定制化的计算架构&#xff…...

Windows Edge 兼容性问题修复 基本解决方案

Windows Edge 浏览器兼容性问题可能源于多个方面&#xff0c;以下是一些常见的问题及其处理结果&#xff1a; 插件或扩展冲突&#xff1a;某些第三方插件或扩展可能与Edge浏览器不兼容&#xff0c;导致崩溃或运行异常。处理结果为&#xff0c;尝试禁用所有插件和扩展&#xff…...

【Servlet】服务器内部转发以及客户端重定向

文章目录 一、服务器内部转发&#xff1a;request.getRequestDispatcher("...").forward(request, response);二、客户端重定向&#xff1a;response.sendRedirect("");三、服务器内部转发代码示例四、客户端重定向代码示例 一、服务器内部转发&#xff1a…...

是否有替代U盘,可安全交换的医院文件摆渡方案?

医院内部网络存储着大量的敏感医疗数据&#xff0c;包括患者的个人信息、病历记录、诊断结果等。网络隔离可以有效防止未经授权的访问和数据泄露&#xff0c;确保这些敏感信息的安全。随着法律法规的不断完善&#xff0c;如《网络安全法》、《个人信息保护法》等&#xff0c;医…...

Java设计模式详解:单例模式

设计模式详解&#xff1a;单例模式 文章目录 设计模式详解&#xff1a;单例模式一、单例模式的原理二、单例模式的实现推荐1、饿汉模式2、静态内部类 三、单例模式的案例四、单例模式的使用场景推荐总结 一、单例模式的原理 单例模式听起来很高大上&#xff0c;但其实它的核心…...

Pointnet++改进即插即用系列:全网首发OREPA在线重新参数化卷积,替代普通卷积 |即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入OREPA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三...

XRDP登录ubuntu桌面闪退问题

修改 /etc/xrdp/startwm.sh unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile...

【Node】使用Node.js构建简单的静态页面生成器

使用Node.js构建简单的静态页面生成器 在现代的Web开发中&#xff0c;静态网站因其速度快、安全性高而越来越受到开发者的青睐。本文将介绍如何使用Node.js构建一个简单的静态页面生成器&#xff0c;通过这个小项目&#xff0c;你将了解到静态网站生成的基本原理和实现方法。 …...

AI智能客服机器人是什么?对企业重要吗?

在数字化时代&#xff0c;客户服务是企业与客户建立牢不可破关系的重要桥梁。AI智能客服机器人&#xff0c;顾名思义&#xff0c;就是利用人工智能技术提升客户服务体验的自动化工具。今天&#xff0c;就让我们来揭开AI智能客服机器人的神秘面纱&#xff0c;并讨论它对企业的重…...

InfluxDB2的数据查询示例

有用influxdb2 不支持sql&#xff0c;并且实质是个列存储数据库&#xff0c;这里基于 influxdb-client-java 和 beanutils反射&#xff0c;写了个数据查询&#xff0c;把结果以行对象的形式返回的工具类。 package com.joy.malltools.influxdb2;import com.influxdb.client.Q…...

CSS基础语法-黑马跟课笔记-供记录与查询

一.CSS简介 1.1HTML局限性 只关注内容的语义&#xff0c;可以做简单的样式但是很臃肿且繁琐 1.2CSS优势 CSS层叠样式表&#xff0c;标记语言 设置HTML页面中的文本内容&#xff0c;图片外形&#xff0c;可以美化HTML&#xff0c;让页面布局更美观 HTML做框架&#xff0c;…...

「PHP系列」PHP数组排序及运用场景

文章目录 一、PHP 数组排序二、PHP 数组排序使用场景数据排序介绍数据排序案例 三、相关链接 一、PHP 数组排序 PHP 提供了多种数组排序函数&#xff0c;允许你根据数组元素的值或键进行排序。 sort() sort() 函数用于对数组的元素按升序进行排序。它会修改原始数组&#xf…...

VScode debug python(服务器)

方法一&#xff1a; 创建launch.json文件&#xff1a; launch.json文件地址&#xff1a; launch.json文件内容&#xff1a; {"version": "0.2.0", //指定了配置文件的版本"configurations": [{"name": "Python: Current File&…...

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 main.js 中引入 Element UI 和相关样式&#xff1a;3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …...

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式&#xff0c;比原始部署模式节省了95%以上的人…...

JVM将虚拟机分成了哪几块区域?

Java 8之后&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;继续沿用原有的内存区域划分&#xff0c;主要包括以下几个部分&#xff1a; 1、堆&#xff08;Heap&#xff09;&#xff1a; 用途&#xff1a;存储对象实例&#xff0c;几乎所有通过new关键字创建的对…...

【热门话题】WebKit架构简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…...

FanControl终极指南:Windows电脑风扇智能控制软件完全解析

FanControl终极指南&#xff1a;Windows电脑风扇智能控制软件完全解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

3步掌握NBTExplorer:从Minecraft数据恐惧到编辑专家的完整指南

3步掌握NBTExplorer&#xff1a;从Minecraft数据恐惧到编辑专家的完整指南 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经面对Minecraft的level.dat文件…...

测试测量工程师必读:从EMC暗室到传感器选型的实战解析

1. 项目概述&#xff1a;一场关于测试测量知识的“周五挑战”又到了周五下午&#xff0c;手头的项目报告写得差不多了&#xff0c;代码也调试得告一段落&#xff0c;是不是感觉大脑需要换个频道放松一下&#xff1f;作为一名在电子工程和测试测量领域摸爬滚打了十几年的老工程师…...

ARM GIC中断控制器虚拟化架构与优化实践

1. ARM GIC中断控制器虚拟化架构概述中断控制器是现代计算机系统中至关重要的组件&#xff0c;特别是在虚拟化环境中&#xff0c;高效的中断处理机制直接影响着虚拟机的性能和响应能力。ARM架构的通用中断控制器(GIC)从v3版本开始引入了完整的虚拟化支持&#xff0c;为虚拟机监…...

西门子S7-300/400老系统改造:用DP/DP Coupler打通新旧产线数据(附Step7组态避坑点)

西门子S7-300/400老系统改造&#xff1a;用DP/DP Coupler打通新旧产线数据&#xff08;附Step7组态避坑点&#xff09; 在工业自动化领域&#xff0c;老旧产线升级改造往往面临新旧设备通讯协议不兼容的难题。当传统S7-300系统需要与现代化S7-400或带PN接口的PLC进行数据交互时…...

Armv8-A架构缓存维护指令详解与应用实践

1. A64系统指令中的缓存维护操作概述在Armv8-A架构中&#xff0c;缓存维护操作是确保系统内存一致性的关键机制。作为体系结构设计中最精妙的部分之一&#xff0c;缓存维护指令直接操控处理器缓存层次结构的状态&#xff0c;对系统性能、功能正确性和安全性都有着决定性影响。现…...

基于MCP协议构建垂直领域AI知识服务:猴头菇茶MCP服务器实战

1. 项目概述与核心价值最近在折腾AI Agent的开发&#xff0c;发现一个挺有意思的项目&#xff0c;叫jackrain19743/hou-tea-mcp-server。乍一看这个名字&#xff0c;可能会有点摸不着头脑&#xff0c;“hou-tea”是啥&#xff1f;其实这是一个基于Model Context Protocol&#…...

Flutter for OpenHarmony 学习视频播放器技术文章

Flutter for OpenHarmony 学习视频播放器技术文章 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net &#x1f3ac; Flutter for OpenHarmony 学习视频播放器开发实战 大家好&#xff01;今天带大家从零开始打造一个专为在线课程、慕课学习…...

3步完成微信聊天记录永久备份:开源工具WeChatExporter终极指南

3步完成微信聊天记录永久备份&#xff1a;开源工具WeChatExporter终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter WeChatExporter是一款专为Mac用户设计的开源工…...

从“按钮太小”看硬件设计:如何平衡参数竞赛与用户体验

1. 从一场工程师的幽默竞赛说起最近在整理旧资料时&#xff0c;翻到一篇2013年EE Times上的趣闻&#xff0c;讲的是他们每月一次的“标题党”&#xff08;Caption Contest&#xff09;竞赛。四月份那期的主题是一幅漫画&#xff0c;画的是一个工程师站在一个巨大的智能手机原型…...