Linux下配置tomcat+apr+native应对高并发

摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,这时并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。

一、三种运行模式介绍

Tomcat 有三种(bio,nio.apr) 运行模式,首先来简单介绍下

bio 
bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

nio 
是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。

想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为 

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" /> 

apr 
(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

要tomcat支持apr,必须要安装apr和native,这样tomcat可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。

Tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。 

接下来介绍linux下tomcat+apr+native配置

 

二、linux下配置tomcat+apr+native

2.1 安装包准备

jdk-7u76-linux-x64.tar.gz(必须JDK1.7以上才支持apr)

apr-1.5.2.tar.gz

apr-util-1.5.4.tar.gz

apache-tomcat-7.0.56.tar.gz(解压之后其bin目录下包含tomcat-native的安装包)

2.2 安装JDK

这是运行Tomcat的首要环境,所以这一步最先执行。

2.2.1 解压

tar -zxvf jdk-7u76-linux-x64.tar.gz

2.2.2 创建/usr/local/java文件夹

mkdir -p /usr/local/java

2.2.3 移动到/usr/local/java

mv jdk1.7.0_76 /usr/local/java

2.2.4 添加环境变量

vi /etc/profile

再最后添加上

#jdk1.7
export JAVA_HOME=/usr/local/java/jdk1.7.0_76
export CLASSPATH=$JAVA_HOME/lib/
export PATH=/usr/local/ruby/bin:$PATH:$JAVA_HOME/bin

2.2.5 重启环境变量,使配置生效

source /etc/profile

查看是否生效

   出现以下字样则表示安装成功,接下来安装tomcat

2.3 安装tomcat

2.3.1 解压tomcat

tar -zxvf apache-tomcat-7.0.56.tar.gz

2.3.2 改名为tomcat7

mv apache-tomcat-7.0.56 tomcat7

2.3.3 修改tomcat内存(jvm内存)

我这里tomcat是放在/home目录下

vi /home/tomcat7/bin/catalina.sh

在里面添加

JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=512M -XX:MaxNewSize=512M -XX:MaxPermSize=512M"

  2.3.4 修改运行模式

vi /home/tomcat7/conf/server.xml

添加上

<!-- 配置apr --><Connector executor="tomcatThreadPool"port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"URIEncoding="UTF-8" enableLookups="false" acceptCount="50"connectionTimeout="1000" maxKeepAliveRequests="250"redirectPort="8443" />

下面贴出一个server.xml完整的配置

<?xml version='1.0' encoding='utf-8'?><Server port="9016" shutdown="SHUTDOWN"><!--关闭https安全验证 --><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /><Listener className="org.apache.catalina.core.JasperListener" /><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><GlobalNamingResources><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 name="Catalina"><!--The connectors can use a shared executor, you can define one or more named thread pools--><!-- 配置线程 --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="500" minSpareThreads="25"maxIdleTime="4000"/><!-- 配置apr --><Connector executor="tomcatThreadPool"port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"URIEncoding="UTF-8" enableLookups="false" acceptCount="50"connectionTimeout="1000" maxKeepAliveRequests="250"redirectPort="8443" /><Connector port="9109" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- 配置访问日志格式 --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log." suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host></Engine></Service>
</Server>

2.4 安装tomcat-native

2.4.1 进入到/home/tomcat7/bin/

cd /home/tomcat7/bin

2.4.2 解压tomcat-native.tar.gz

tar -zxvf tomcat-native.tar.gz

2.4.3 进入到解压后的目录

cd tomcat-native-1.1.31-src/jni/native

2.4.4 检测、编译、安装

./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/local/java/jdk1.7.0_76 && make && make install

2.5 安装apr

  需要安装apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz

2.5.1 解压apr-1.5.2.tar.gz和apr-util-1.5.4.tar.gz

tar -zxvf apr-1.5.2.tar.gz
tar -zxvf apr-util-1.5.4.tar.gz

2.5.2 检测、编译、安装

进入到apr-1.5.2,执行
 ./configure --prefix=/usr/local/apr && make && make install
进入到apr-util-1.5.4,执行
./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install

2.6 修改最大文件句柄数和打开文件的数目

  由于打开文件会比较多,所以要考虑修改默认打开文件数目

2.6.1 修改/etc/sysctl.conf

net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.ip_nonlocal_bind = 1

2.6.2 在/etc/security/limits.conf最后增加如下两行记录         

 * soft nofile 65535* hard nofile 65535

 2.6.3 加载bridge模块

modprobe bridge

 2.6.4 重新载入sysctl,使其改变生效

 sysctl -p 

2.6.5 再退出重新登陆,用ulimit -a查看

可以看到open files已经由默认的1024变成了65535

2.7 启动tomcat

/home/tomcat7/bin/startup.sh

出现以下提示则表示配置成功

 

三、出错情况处理

  3.1、启动tomcat时报“The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/apr/lib”

解决方案:确保tomcat-native安装成功,否则执行上面2.5,如果依旧不成功,请执行下面步骤
#vi /opt/tomcat_api_8035/bin/catalina.sh
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
 3.2、安装apr时报‘Neither the JAVA_HOME nor the JRE_HOME environment variable is defined“
解决方案:这是未设置环境JAVA_HOME与JAVA_JRE目录,请确保安装jdk成功,确认/etc/profile环境变量配置正确
3.3、在执行sysctl -p的时候发现输出出现以下错误
net.ipv4.ip_forward = 0 
        net.ipv4.conf.default.rp_filter = 1 
        net.ipv4.conf.default.accept_source_route = 0 
        kernel.sysrq = 0 
        kernel.core_uses_pid = 1 
        net.ipv4.tcp_syncookies = 1 
        error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key 
        error: "net.bridge.bridge-nf-call-iptables" is an unknown key 
        error: "net.bridge.bridge-nf-call-arptables" is an unknown key 
        kernel.msgmnb = 65536 
        kernel.msgmax = 65536 
        kernel.shmmax = 68719476736 
        kernel.shmall = 4294967296
原因:上面有3个参数依赖于bridge模块,该模块如果没有加载则会现上面的输出错误
解决方案:执行modprobe bridge命令,加载bridge模块

转载于:https://www.cnblogs.com/zishengY/p/7101616.html

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

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

相关文章

Firefox 66 将阻止自动播放音频和视频

百度智能云 云生态狂欢季 热门云产品1折起>>> 当我们点击一个链接&#xff0c;或者打开新的浏览器选项卡时&#xff0c;浏览器就开始自动播放视频和声音&#xff0c;这是一件十分烦人的事。Chrome 浏览器早已对这些行为下手了&#xff0c;现在 Firefox 也明确表示要…

Windows 10 关闭Hyper-V

以管理员身份运行命令提示符 关闭 bcdedit /set hypervisorlaunchtype off 启用 bcdedit / set hypervisorlaunchtype auto 禁用DG 转载于:https://www.cnblogs.com/Robbery/p/8397767.html

ROS下获取kinectv2相机的仿照TUM数据集格式的彩色图和深度图

准备工作&#xff1a; &#xff11;&#xff0e; ubuntu16.04上安装iai-kinect2, 2. 运行roslaunch kinect2_bridge kinect2_bridge.launch, 3. 运行 rosrun save_rgbd_from_kinect2 save_rgbd_from_kinect2,开始保存图像&#xff0e; 这个保存kinectV2相机的代码如下&…

Java Web 九大内置对象(一)

在Jsp 中一共定义了九个内置对象&#xff0c;分别为&#xff1a; *request HttpServletRequest; *response HttpServletResponse; *session HttpSession; page This(本jsp页面)&#xff1b; *application ServletCon…

Missing URI template variable 'XXXX' for method parameter of type String

原因&#xff1a;就是spring的controller上的RequestMapping的实参和方法里面的形参名字不一致 方法&#xff1a;改成一样就可。 ps.还能用绑定的方法&#xff0c;不建议&#xff0c;因为太麻烦了 RequestMapping(value "/findUser/{id}",method RequestMethod.GET…

css:text-overflow属性

参考文档:www.w3school.com.cn/cssref/pr_t… text-overflow:ellipsis;( 显示省略符号来代表被修剪的文本。)

Failed to load nodelet ‘/kinect2_bridge` of type `kinect2_bridge/kinect2_bridge_nodelet` to manager

之前在我的电脑上配置了libfreenect2和iai_kinect2&#xff0c;现在需要在工控机上重新安装这两个库&#xff0c;讲kinectV2相机安置在婴儿车上&#xff0c;然后使用我的ros下获取kinectV2相机的彩色图和灰度图的脚本&#xff0c;获取深度图和彩色图。 我成功的安装了libfreen…

object转字符串

1、obj.tostring() obj为空时&#xff0c;抛异常。 2、convert.tostring(obj) obj为空时&#xff0c;返回null&#xff1b; 3、(string)obj obj为空时&#xff0c;返回null&#xff1b;obj不是string类型时&#xff0c;抛异常。 4、obj as string obj为空时&#xff0c;返回nul…

微信开发中,H5的video标签使用

<video></video>是HTML5新加入的标签&#xff0c;最近流行的h5开发多以video技术集成一个H5页面&#xff0c;效果也是很6的。现在总结一下用到的技术&#xff0c;主要的使用环境是微信&#xff0c;部分属性一些手机的默认浏览器不支持&#xff0c;这些还需要读者亲…

bundlefusion论文阅读笔记

4. 全局位姿对齐(glob pose alignment) 输入系统的是使用消费级的传感器获取的RGBD数据流&#xff0c;并且保证这些数据中的彩色图像和深度图像是时间和空间上都对齐的。图像分辨率是640x480,频率是30hz。我们的目的就是要找到frames之间的3D对应&#xff0c;然后根据这些对应…

IOC和DI的区别详解

IOC 是英文inversion of control的缩写&#xff0c;意思是控制反转DI 是英文Dependency Injection的缩写&#xff0c;意思是依赖注入 下面用一个简单的例子来描述一下IOC和DI的关系 先看下总结&#xff1a; 依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情&#…

TOMCAT启动到一半停止如何解决

当你的项目过大的时候&#xff0c;往往会导致你的TOMCAT启动时间过长&#xff0c;启动失败&#xff0c;遇到该情况可以试一下下面两招&#xff1a; TOmcat启动到一半的时候停止了&#xff0c;以下原因&#xff1a; 1、 tomcat启动时间超过了设置时间&#xff1a; 解决办法&…

视觉slam十四讲ch6曲线拟合 代码注释(笔记版)

1 #include <opencv2/core/core.hpp>2 #include <ceres/ceres.h>3 #include <chrono>4 5 using namespace std;6 7 // 代价函数的计算模型8 struct CURVE_FITTING_COST9 {10 CURVE_FITTING_COST ( double x, double y ) : _x ( x ), _y ( y ) {}11 /…

Dojo 如何测试 widget

测试 dojo/framework/src/testing/README.mdcommit 84e254725f41d60f624ab5ad38fe82e15b6348a2 用于测试和断言 Dojo 部件期望的虚拟 DOM 和行为的简单 API。 测试 Features harness APICustom Comparatorsselectors harness.expect harness.expectPartial harness.triggerharn…

python中将四元数转换为旋转矩阵

在制作bundlefusion时,想测试TUM数据集,并且将groundtruth写入到数据集中,TUM中给定的groundtruth中的旋转是使用四元数表示的,而bundlefusion中需要SE3的形式,所以我需要首先将四元数转换为旋转矩阵,然后再将其与平移向量合并在一起,因为我之前关于生成bundlefusion数据集写了…

js -- 时间转年月日

/*** 时间转年月日* param sdate 开始的时间* param edate 结束的时间* returns {*}*/function day2ymrStr2(sdate, edate) {var day2ymrStr "";var date1 new Date(edate);var date2 new Date(sdate);var y 0, m 0, d 0;var y1 date1.getFullYear();var m1 …

iOS sha1加密算法

最近在项目中使用到了网络请求签名认证的方法&#xff0c;于是在网上找关于OC sha1加密的方法&#xff0c;很快找到了一个大众使用的封装好的方法&#xff0c;以下代码便是 首先需要添加头文件 #import<CommonCrypto/CommonDigest.h> 然后直接使用下面的方法就可以了 //s…

Linux开发5款实用工具推荐

今天安利给大家5款实用的Linux开发工具&#xff0c;希望对大家工作效率的提升有所帮助。容器放眼于现实&#xff0c;现在已经是容器的时代了。容器既及其容易部署&#xff0c;又可以方便地构建开发环境。如果你针对的是特定的平台的开发&#xff0c;将开发流程所需要的各种工具…

TUM数据集制作BundleFusion数据集

BundleFusion的数据集中,在生成.sens文件之前,包括彩色图,深度图和一个位姿文件,并且这个pose文件中的位姿态是有变化的,所以我怀疑,推测,在这个pose文件中可以写入groundtruth的位姿,然后在重建的时候就按照传入的位姿进行计算.为了测试一下效果,我从TUM数据集开始入手,这个数…

Linq查询datatable的记录集合

通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量&#xff0c;比方深度 string strDepth查询深度的值&#xff1b; var dataRows from datarow in dataTable(须要查询的datatable数据集).AsEnumerable() where …