zoukankan      html  css  js  c++  java
  • 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">

    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;">The connectors can use a shared executor, you can define one or more named thread pools</span><span style="color: #008000;">--&gt;</span>
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置线程 </span><span style="color: #008000;">--&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Executor </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="tomcatThreadPool"</span><span style="color: #ff0000;"> namePrefix</span><span style="color: #0000ff;">="catalina-exec-"</span><span style="color: #ff0000;">
        maxThreads</span><span style="color: #0000ff;">="500"</span><span style="color: #ff0000;"> minSpareThreads</span><span style="color: #0000ff;">="25"</span><span style="color: #ff0000;">
        maxIdleTime</span><span style="color: #0000ff;">="4000"</span>
        <span style="color: #0000ff;">/&gt;</span>
    
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置apr </span><span style="color: #008000;">--&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Connector </span><span style="color: #ff0000;">executor</span><span style="color: #0000ff;">="tomcatThreadPool"</span><span style="color: #ff0000;">
               port</span><span style="color: #0000ff;">="8080"</span><span style="color: #ff0000;"> protocol</span><span style="color: #0000ff;">="org.apache.coyote.http11.Http11AprProtocol"</span><span style="color: #ff0000;">
               URIEncoding</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #ff0000;"> enableLookups</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"> acceptCount</span><span style="color: #0000ff;">="50"</span><span style="color: #ff0000;">
               connectionTimeout</span><span style="color: #0000ff;">="1000"</span><span style="color: #ff0000;"> maxKeepAliveRequests</span><span style="color: #0000ff;">="250"</span><span style="color: #ff0000;">
               redirectPort</span><span style="color: #0000ff;">="8443"</span> <span style="color: #0000ff;">/&gt;</span>
    
    
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Connector </span><span style="color: #ff0000;">port</span><span style="color: #0000ff;">="9109"</span><span style="color: #ff0000;"> protocol</span><span style="color: #0000ff;">="AJP/1.3"</span><span style="color: #ff0000;"> redirectPort</span><span style="color: #0000ff;">="8443"</span> <span style="color: #0000ff;">/&gt;</span>
    
    
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Engine </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="Catalina"</span><span style="color: #ff0000;"> defaultHost</span><span style="color: #0000ff;">="localhost"</span><span style="color: #0000ff;">&gt;</span>
    
      <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Realm </span><span style="color: #ff0000;">className</span><span style="color: #0000ff;">="org.apache.catalina.realm.LockOutRealm"</span><span style="color: #0000ff;">&gt;</span>
    
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Realm </span><span style="color: #ff0000;">className</span><span style="color: #0000ff;">="org.apache.catalina.realm.UserDatabaseRealm"</span><span style="color: #ff0000;">
               resourceName</span><span style="color: #0000ff;">="UserDatabase"</span><span style="color: #0000ff;">/&gt;</span>
      <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Realm</span><span style="color: #0000ff;">&gt;</span>
    
      <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Host </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="localhost"</span><span style="color: #ff0000;">  appBase</span><span style="color: #0000ff;">="webapps"</span><span style="color: #ff0000;">
            unpackWARs</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"> autoDeploy</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">&gt;</span>
    
         <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 配置访问日志格式 </span><span style="color: #008000;">--&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Valve </span><span style="color: #ff0000;">className</span><span style="color: #0000ff;">="org.apache.catalina.valves.AccessLogValve"</span><span style="color: #ff0000;"> directory</span><span style="color: #0000ff;">="logs"</span><span style="color: #ff0000;">
               prefix</span><span style="color: #0000ff;">="localhost_access_log."</span><span style="color: #ff0000;"> suffix</span><span style="color: #0000ff;">=".txt"</span><span style="color: #ff0000;">
               pattern</span><span style="color: #0000ff;">="%h %l %u %t &amp;quot;%r&amp;quot; %s %b"</span> <span style="color: #0000ff;">/&gt;</span>
    
      <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Host</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Engine</span><span style="color: #0000ff;">&gt;</span>
    

    </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模块
  • 相关阅读:
    CodeForces
    网络流
    poj 2185
    树的分治学习
    数位DP
    URAL 1969. Hong Kong Tram
    hdu 4759 Poker Shuffle
    hdu3712 Detector Placement
    分块思想
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/jpfss/p/9695062.html
Copyright © 2011-2022 走看看