一. tomcat 的优化
Tomcat 作为一款广泛使用的 Java Web 应用服务器,其性能优化可以从以下几个方面进行:
① 内存配置优化:
- 调整JVM堆内存大小(-Xms和-Xmx参数),以确保Tomcat在处理大量并发请求时有足够的内存空间,同时避免频繁的GC操作。
- 设置合适的新生代、老年代比例(-XX:NewRatio)以及新生代中的Eden区与Survivor区比例(-XX:SurvivorRatio)。
- 根据应用特性设置持久代或元数据区大小(对于Java 8及之前版本使用-XX:MaxPermSize或-XX:MetaspaceSize等参数;对于Java 8以后版本已经没有永久代概念,用的是Metaspace)。
什么是频繁的GC操作:
频繁的GC(Garbage Collection,垃圾回收)操作是指在Java虚拟机(JVM)中,垃圾回收器为了释放不再使用的内存空间而频繁地执行内存清理和对象整理的过程。当应用程序运行过程中产生了大量临时对象,并且这些对象很快变得不可达(即程序无法再通过任何引用访问到它们),那么垃圾回收器就需要更加频繁地工作以回收这些内存。
频繁的GC操作可能带来的问题包括:
- 性能下降:每次GC都会导致应用暂停一段时间,如果GC过于频繁,则会显著降低系统的吞吐量和响应速度。
- 延迟增加:对于实时性要求较高的系统,如在线交易、游戏等,频繁的GC停顿可能导致服务响应时间变长,影响用户体验。
- CPU资源浪费:垃圾回收本身需要消耗一定的CPU资源,频繁的GC会导致更多的CPU时间用于内存管理而非实际业务处理。
针对频繁GC的问题,可以采取以下优化措施:
-
合理设置JVM堆大小:增大-Xms(初始堆大小)和-Xmx(最大堆大小)参数,减少由于堆内存不足而导致的频繁GC现象。但要注意不要过大,以免超出物理内存造成交换空间使用,反而降低性能。
如何设置JVM
# OS specific support. $var _must_ be set to either true or false.
#添加下面一行
JAVA_OPTS="-server -Xms128m -Xmx512m -XX:NewSize=100m -XX:MaxNewSize=200m"
-server: 指定使用服务器模式运行Java虚拟机。通常情况下,服务器模式相较于客户端模式提供了更多的性能优化,尤其适合长时间运行、高负载的应用程序。
-Xms128m: 设置JVM初始堆大小为128MB。这意味着Java应用启动时即分配128MB的内存作为堆空间。
-Xmx512m: 设置JVM最大堆大小为512MB。这意味着Java应用在运行过程中可以使用的最大堆空间为512MB。当实际需要更多堆内存且不超过此限制时,堆内存会自动扩展;如果超过这个限制,而应用程序继续申请内存,则可能会触发OOM(Out of Memory)错误。
-XX:NewSize=100m: 设置年轻代(Young Generation)的初始大小为100MB。年轻代是堆内存的一部分,主要存储新创建的对象和短期内存生命周期的对象。
-XX:MaxNewSize=200m: 设置年轻代的最大大小为200MB。这意味着年轻代的内存容量可以在100MB到200MB之间动态调整。
-
调整GC算法与策略:根据应用特点选择合适的GC收集器,如G1、ZGC或Shenandoah等低暂停时间的GC实现,并适当调整相关参数来优化GC行为。
-
减少短生命周期对象的创建:优化代码逻辑,避免短时间内生成大量无用的对象,例如重用已存在的对象、使用对象池等技术。
-
监控与分析:使用JDK自带的JConsole、VisualVM或者第三方工具(如MAT,YourKit)进行内存监控和分析,找出内存泄露点并修复。
② 线程池优化:
- 在
server.xml
文件中调整Connector组件的线程池相关参数,如最大线程数(maxThreads)、最小空闲线程数(minSpareThreads)、接受连接队列大小(acceptCount)、是否反查域名(enableLookups)、是否对响应的数据进行GZIP压缩(compression)。 - 对于高并发场景,合理设置并行处理请求的数量,避免过多线程导致系统资源耗尽。
③ 连接器协议优化
- 根据应用需求选择不同的连接器协议。默认的Bio(阻塞IO)模式适用于低并发场景,Nio(非阻塞IO)和Apr(Apache Portable Runtime库)模式更适合高并发场景。
- 使用NIO2(Java 7及以上版本支持)或APR/native(需要安装apr和tcnative库)可以提高I/O性能。
④ 禁用不必要的服务和应用:
- 删除或停用不需要的web应用程序,减少无谓的资源占用。
- 关闭日志级别过细的日志输出,减小磁盘I/O开销。
⑤ 静态资源处理:
- 使用像Nginx这样的反向代理服务器来处理静态资源,减轻Tomcat的压力,并利用缓存机制提高响应速度。
⑥ 会话管理:
- 如果应用允许,考虑使用外置存储(如Redis、Memcached)进行session共享,特别是当集群部署时,可以避免session复制带来的性能损耗。
⑦ 代码层面优化:
- 避免在Servlet初始化阶段加载大量数据或执行耗时操作。
- 对数据库查询语句进行优化,减少数据库交互延迟。
⑧ 容器配置精简:
- 精简Tomcat启动时加载的服务和模块,删除不需要的Listener、Filter、Servlet等配置。
⑨ 操作系统和硬件调优:
- 开启操作系统的TCP/IP缓冲区优化,增大TCP接收窗口大小。
- 根据应用需求适当增加CPU核数和内存容量。
⑩ 监控和诊断工具:
- 使用VisualVM、JConsole等工具监控JVM运行状态,根据监控结果进行针对性优化。
- 利用Tomcat内置的JMX功能,可以实时查看和控制Tomcat的各种配置参数和运行状态。
最后,务必定期更新到最新稳定版Tomcat,因为新版通常包含性能改进和安全修复。并且结合具体的应用场景和实际负载情况持续进行性能测试和优化。
二. apache 的优化
Apache HTTP Server(简称Apache)作为一款广泛使用的Web服务器软件,针对其性能优化可以从以下几个方面进行:
① 配置调整:
- 并发连接数限制:通过调整
MaxKeepAliveRequests
、MaxClients
等参数来控制并发连接数,防止因过多连接导致服务器过载。 - KeepAlive设置:启用KeepAlive并合理设置超时时间,减少TCP连接建立和关闭的开销。
- LoadModule优化:只加载必要的模块,避免无用模块消耗系统资源。
② 工作模式选择:
- MPM(多路处理模块)选择:根据硬件环境和应用需求选择合适的MPM模式,例如prefork MPM适用于非线程安全的应用程序,worker MPM或event MPM则适合于支持线程的应用场景,并能更好地利用多核CPU资源。
③ 缓存机制:
- 启用mod_cache:通过mod_disk_cache、mod_mem_cache等模块实现静态内容缓存,减少对后端资源的访问压力。
- HTTP压缩:使用mod_deflate模块提供GZIP压缩功能,减小网络传输的数据量。
④ 日志与错误级别:
- 日志格式精简:简化access_log和error_log的日志格式,降低磁盘I/O开销。
- 错误级别调整:适当调低错误日志级别,避免在正常运行期间产生大量不必要的日志记录。
⑤ SSL/TLS优化:
- 启用会话重用:通过Session Cache机制减少握手过程中的延迟和计算成本。
- 高效加密套件:指定优先级较高的加密算法,平衡安全性与性能。
⑥ 前端代理与负载均衡:
- 反向代理:结合Nginx、HAProxy等高性能代理服务器,将静态内容请求分发给前端服务器处理,减轻Apache压力。
- 负载均衡:通过mod_proxy_balancer实现后端服务器间的负载均衡,分散请求流量。
⑦ 操作系统层面优化:
- 文件描述符数量:增加系统允许打开的最大文件描述符数量,确保Apache能够处理更多并发连接。
- 内核参数调优:如TCP/IP相关参数的调整,如socket缓冲区大小、TCP队列长度等。
⑧ 硬件升级:
- 内存扩容:提升服务器内存容量,允许Apache分配更多的内存用于缓存和处理请求。
- CPU升级:采用更强大的多核处理器以应对高并发请求。
⑨ 监控与调优工具:
- 使用Apache自带的status模块或其他第三方工具持续监控服务器状态,分析性能瓶颈,并根据数据进行针对性优化。