Tomcat APR & Linux Optimization
一、简介
APR(Apache portable Run-time libraries)模式:简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能, 也是Tomcat运行高并发应用的首选模式。
二、启用apr模式步聚
1、安装系统必要库和工具
yum install apr-devel
yum install openssl-devel
yum install gcc
yum install make
openssl库要求在0.9.7以上版本,APR要求在1.2以上版本
2、安装apr动态库
进入tomcat的bin目录,解压tomcat-native.tar.gz文件,并进入tomcat-native-1.2.7-src/native目录,执行./configure && make && make install 命令,动态库默认安装在/usr/local/apr/lib目录下
3、配置APR本地库到系统共享库搜索路径中
编辑$TOMCAT_HOME/bin/catalina.sh文件,在虚拟机启动参数JAVA_OPTS中添加java.library.path参数,指定apr库的路径
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
修改 server.xml 中的协议为 APR Protocol
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
如果不想启用SSL,将server.xml中apr模式下ssl关闭即可:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
重启Tomcat, 日志显示
Aug 29, 2010 3:47:32 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
在最后的端口信息方面也可以看到http-apr-8080
⚠注意
Tomcat 7.x版本从7.0.30开始就支持APR, 之后版本的都可以使用APR模式
三、Linux Optimization
由于我们采用了linux服务器,所以优化内核参数也是一个非常重要的工作。以下为优化参考:
修改/etc/sysctl.cnf文件,在最后追加如下内容:
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 65536
保存退出,执行sysctl -p生效
四、配置模式
APR
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
maxPostSize="10485760"
URIEncoding="UTF-8"
acceptCount="600"
acceptorThreadCount="48"
disableUploadTimeout="true"
maxConnections="800"
SSLEnabled="false"/>
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="600" maxIdleTime="20000" minSpareThreads="400" prestartminSpareThreads="true" />
AJP
<Connector port="8009" protocol="AJP/1.3" maxThreads="1000" minSpareThreads="100" maxSpareThreads="500"
acceptCount="700" connectionTimeout="20000" redirectPort="8443" />
2017-01-06 对原先基线和配置修改
机器配置为
CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.6GHz 24core
内存: 128G
JDK Ver: 1.7.0_80
Tomcat Ver: 8.5.6
⚠注意 使用Tomcat8时会出现如下Warning
警告 [localhost-startStop-1] org.apache.catalina.webresources.Cache.getResource Unable to add the resource at [/WEB-INF/classes/] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
解决办法在conf/conext.xml中加入如下配置
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Resources cachingAllowed="true" cacheMaxSize="100000" />
</Context>
在更换Tomcat之后首次调整ThreadPool采用NIO Pattern
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
maxPostSize="10485760"
URIEncoding="UTF-8"
acceptCount="600"
acceptorThreadCount="48"
disableUploadTimeout="true"
maxConnections="800"
SSLEnabled="false"/>
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="600" maxIdleTime="20000" minSpareThreads="400" prestartminSpareThreads="true" />
acceptorThreadCount 数量为CPU Core的2倍
OSP Client Interface Conf Param: CentOS5.8、Timeout 20ms
验测线程50并发

验测线程200并发

Redis Response Interface Conf Param: CentOS5.8、Connection Redis
验测线程50并发

验测线程200并发

2017-01-10 切换服务器版本为CentOS6.6、Tomcat版本和ThreadPool配置参数不变,重新压测数据如下
OSP Client Interface Conf Param: CentOS6.6、Timeout 20ms
验测线程50并发

验测线程200并发

Redis Response Interface Conf Param: CentOS6.6、Connection Redis
验测线程50并发

验测线程200并发

此次调整操作系统版本6.6之后同比之前5.8版本中的压测结果均有30%左右的提升,但调用USP的OSP接口环比原生链接Redis的接口的QPS相差还在45%以上,前者低于后者。
2017-01-12
%TOMCAT_HOME%/bin/catalina.sh添加JVM参数
JAVA_OPTS="-server
-Xms4096m
-Xmx4096m
-Xmn2048m
-XX:MaxDirectMemorySize=4096m
-XX:PermSize=256m
-XX:MaxPermSize=512m
-XX:ReservedCodeCacheSize=240M
-XX:+UseCodeCacheFlushing"
OSP Client Interface
验测线程200并发

Redis Response Interface
验测线程200并发

两个接口QPS均有10%的提升,但环比差距仍为50%,原生访问Redis的接口好于访问OSP的接口
⚠注意
相同CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.6GHz 24core
相同OS Ver 和 Kernel: Linux version 2.6.32-504.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014
两个接口在上述条件下内存128G压测性能都好于32G有3倍之多
Tomcat APR & Linux Optimization的更多相关文章
- Linux下配置tomcat+apr+native应对高并发
摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...
- (转)Linux下配置tomcat+apr+native应对高并发
摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...
- Tomcat在Linux服务器上的BIO、NIO、APR模式设置
一.BIO.NIO.AIO 先了解四个概念: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时, ...
- springboot使用tomcat apr模式
因需项目对并发要求比较高.提高Tomcat效率.使用tomcat apr模式.今天在这记录下使用过程.apr全称为apache portable runtime.这里套用下wiki对apr的解释. T ...
- tomcat、Linux服务器
tomcat.Linux服务器 用到的命令 解压命令: tar -zxvf 文件名 配置 : vi /etc/profile 按 i 进入 ...
- Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口
Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...
- Atitit tomcat在linux服务器的启动与其他
Atitit tomcat在linux服务器的启动与其他 1.1. /home/tomcat/tomcat3/bin/startup.sh1 1.2. 判断启动是否成功 ps -ef|grep tom ...
- java环境--JDK和Tomcat在linux上的安装和配置
Tomcat在Linux上的安装与配置 以下使用的Linux版本为: Redhat Enterprise Linux 7.0 x86_64,Tomcat版本为tomcat-7.0.54.1.下载JDK ...
- tomcat apr 部署
背景 这还是为了高并发的事,网上说的天花乱坠的,加了apr怎么怎么好,我加了,扯淡.就是吹牛用.我还是认为,性能问题要考设计逻辑和代码解决,这些都是锦上添花的. 步骤 1 windows 部署简单,虽 ...
随机推荐
- uexGaodeMap插件Android接入指引
uexGaodeMap插件Android接入指引 高德地图插件是基于高德地图API封装的AppCan平台的插件模块.开发者集成及使用此插件,需要到高德开放平台为应用申请相应的APIKey,并将APIK ...
- 3D数学的实际应用
以前自己在学习三维程序开发时并没有在意3D数学在程序中的重要作用,但在实际工作中逐渐发现:自己忽视了3D数学的作用,我们实际开发工作总要求模型准确的变换,而不是强调渲染有多炫,那是游戏,如果是仿真程序 ...
- SQLServer 游标 (A)
游标 游标分为客户端游标和服务器端游标.Sql通过游标可以对一个结果集进行逐行处理.对于使用服务器端游标的过程有:声明.打开.读取.关闭.释放. 1 声明游标 1.1 SQL-92标准的声明 Decl ...
- java常用英文解释
java常用名词解释: OO: object-oriented ,面向对象 OOP:object-oriented programming,面向对象编程 Author:JCC Object:对象JDK ...
- USB驱动开发大全【转】
本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...
- u-boot移植 II
下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...
- android 获取设备拔插状态广播事件易漏掉的一行属性!
我们都知道设备拔插的状态获取需要一个权限 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILES ...
- [java报错]Could not instantiate listener XXXXXX
写在开头的话: 兜兜转转,辞去了深圳的工作,回到了武汉,从事的居然一度是我最不想学的语言-java,曾经以为自己并不会java,但是上手之后,发现语言都是相通的,自己一度排斥学习java真的是不能再傻 ...
- 如何输出function执行的语句
SQL> set serveroutput on;SQL> exec dbms_output.put_line(1); set serveroutput on size ...
- [Machine-Learning] K临近算法-简单例子
k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...