Tomcat面试题目

1.tomcat给你你怎样去调优?

1. JVM参数调优:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化内存为256MB,可以使用的最大内存为512MB。 
2. 禁用DNS查询 
 当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值: 
Tomcat4 

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" /> 

Tomcat5 

<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/> 
3. 调整线程数 
通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。 
    Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。 
      在Tomcat5对这些参数进行了调整,请看下面属性: 
maxThreads    Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。 
acceptCount    指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 
connnectionTimeout    网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 
minSpareThreads    Tomcat初始化时创建的线程数。 

maxSpareThreads     一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。 
     最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。 

2.tomcat中的文件你主要写了些什么。


3.tomcat那里设置访问线程数目。


4.怎样加大tomcat的内存。

5.Tomcat有几种部署方式

tomcat中四种部署项目的方法

第一种方法:

在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: 
<Context path="/hello" docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0" privileged="true"> 
</Context> 
至于Context 节点属性,可详细见相关文档。

第二种方法:

将web项目文件件拷贝到webapps 目录中。

第三种方法:

很灵活,在conf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为: 
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true"> 
</Context>

第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。

第2、3还有优点,可以定义一些个性配置,如数据源的配置等。

第四种办法,:

可以用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以


===================================================================================================================

一、Tomcat的缺省是多少,怎么修改

Tomcat的缺省端口号是8080.

修改Tomcat端口号:

1.找到Tomcat目录下的conf文件夹

2.进入conf文件夹里面找到server.xml文件

3.打开server.xml文件

4.在server.xml文件里面找到下列信息

maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″

enableLookups=”false” redirectPort=”8443″ acceptCount=”100″

connectionTimeout=”20000″ disableUploadTimeout=”true” />

5.把port=”8080″改成port=”8888″,并且保存

6.启动Tomcat,并且在IE浏览器里面的地址栏输入http://127.0.0.1:8888/

7、tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。

NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重启即可生效。如下面的参数配置,默认的是HTTP/1.1。

<Connector port=”8080″

protocol=”org.apache.coyote.http11.Http11NioProtocol”

connectionTimeout=”20000″

redirectPort=”8443″

maxThreads=”500″

minSpareThreads=”20″

acceptCount=”100″

disableUploadTimeout=”true”

enableLookups=”false”

URIEncoding=”UTF-8″ />

二、tomcat 如何优化?

1、优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询。

参数解释:

URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译

maxSpareThreads : 如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

minSpareThreads : 最小备用线程数,tomcat启动时的初始化的线程数。

enableLookups : 这个功效和Apache中的HostnameLookups一样,设为关闭。

connectionTimeout : connectionTimeout为网络连接超时时间毫秒数。

maxThreads : maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

acceptCount : acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection

maxProcessors与minProcessors : 在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

通常Windows是1000个左右,Linux是2000个左右。

useURIValidationHack:

我们来看一下tomcat中的一段源码:

【security】

if (connector.getUseURIValidationHack()) {

String uri = validate(request.getRequestURI());

if (uri == null) {

res.setStatus(400);

res.setMessage(“Invalid URI”);

throw new IOException(“Invalid URI”);

} else {

req.requestURI().setString(uri);

// Redoing the URI decoding

req.decodedURI().duplicate(req.requestURI());

req.getURLDecoder().convert(req.decodedURI(), true);

可以看到如果把useURIValidationHack设成”false”,可以减少它对一些url的不必要的检查从而减省开销。

enableLookups=”false” : 为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值。

disableUploadTimeout :类似于Apache中的keeyalive一样

给Tomcat配置gzip压缩(HTTP压缩)功能

compression=”on” compressionMinSize=”2048″

compressableMimeType=”text/html,text/xml,text/JavaScript,text/css,text/plain”

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

1)compression=”on” 打开压缩功能

2)compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为2KB

3)noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩

4)compressableMimeType=”text/html,text/xml” 压缩类型

最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置,对吧?

<!–enable tomcat ssl–>

<Connector port=”8443″ protocol=”HTTP/1.1″

URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″

enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″

acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″

useURIValidationHack=”false”

compression=”on” compressionMinSize=”2048″

compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

SSLEnabled=”true”

scheme=”https” secure=”true”

clientAuth=”false” sslProtocol=”TLS”

keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”

/>

好了,所有的Tomcat优化的地方都加上了。

2、优化JDK

Tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化内存大小] -Xmx[可以使用的最大内存]

设置环境变量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化内存大小] -Xmx[可以使用的最大内存]”

一般说来,你应该使用物理内存的 80% 作为堆大小。如果本机上有Apache服务器,可以先折算Apache需要的内存,然后修改堆大小。建议设置为70%;建议设置[[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。

本例使用加入环境变量的方式:

# vi /etc/profile

加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700

# source /etc/profile

【参数说明】

-Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的 快一点,但是也可能会导致机器暂时间变慢。

-Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占 用更多的内存,超出了这个设置值,就会抛出OutOfMemory 异常。

-Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64 。

-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

三、tomcat 有那几种Connector 运行模式?

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

1)bio

默认的模式,性能非常低下,没有经过任何优化处理和支持.

2)nio

利用java的异步io护理技术,no blocking IO技术.

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

<Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol”

connectionTimeout=”20000″

URIEncoding=”UTF-8″

useBodyEncodingForURI=”true”

enableLookups=”false”

redirectPort=”8443″ />

启动后,就可以生效。

3)apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.

必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native

如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol

===================================================================================================================

在java工程师面试过程中,一些比较厉害的技术经理经常会问到一些比较难的面试题,比如Tomcat集群。那我们就来分析下可能会问到的一些问题吧。

1、如何在tomcat集群中实现Session共享

Apache集群实现Tomcat的Session共享配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,所以联合
下面根据说下怎么配置吧:
1、既然是集群肯定要多准备几个Tomcat来模拟,比如分别为Tomcat01、Tomcat02、Tomcat03。
如果各Tomcat程序放在不同的机器上,那么就不会有端口的冲突。如果是放在同一台机器上的话,那就简单改几个端口,防止端口占用造成的冲突。打开conf文件夹中的server.xml文件,需要修改的端口有:

1、<Server port=”8015″ shutdown=”SHUTDOWN”>  
2、<Connector port=”8081″ protocol=”HTTP/1.1″  connectionTimeout=”20000″ redirectPort=”8443″ />  
3、<Connector port=”8019″ protocol=”AJP/1.3″ redirectPort=”8443″ />  
 
以上port需要修改,至于修改成什么样子,看你自己了,只要不出现端口冲突就可以了,要保证各个Tomcat实例间没有端口冲突
 
2、配置Tomcat的集群设置:
还是修改server.xml文件,最简单的集群配置只需要将<Engine/>节点中注释掉的下面这句取消注释并改为(官网上http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html可以看到)

<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”  
                 channelSendOptions=”8″>  
 
          <Manager className=”org.apache.catalina.ha.session.DeltaManager”  
                   expireSessionsOnShutdown=”false”  
                   notifyListenersOnReplication=”true”/>  
 
          <Channel className=”org.apache.catalina.tribes.group.GroupChannel”>  
            <Membership className=”org.apache.catalina.tribes.membership.McastService”  
                        address=”228.0.0.4″  
                        port=”45564″  
                        frequency=”500″  
                        dropTime=”3000″/>  
            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”  
                      address=”auto”  
                      port=”4000″  
                      autoBind=”100″  
                      selectorTimeout=”5000″  
                      maxThreads=”6″/>  
 
            <Sender className=”org.apache.catalina.tribes.transport.ReplicationTransmitter”>  
              <Transport className=”org.apache.catalina.tribes.transport.nio.PooledParallelSender”/>  
            </Sender>  
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.TcpFailureDetector”/>  
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor”/>  
          </Channel>  
 
          <Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”  
                 filter=””/>  
          <Valve className=”org.apache.catalina.ha.session.JvmRouteBinderValve”/>  
 
          <Deployer className=”org.apache.catalina.ha.deploy.FarmWarDeployer”  
                    tempDir=”/tmp/war-temp/”  
                    deployDir=”/tmp/war-deploy/”  
                    watchDir=”/tmp/war-listen/”  
                    watchEnabled=”false”/>  
 
          <ClusterListener className=”org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener”/>  
          <ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>  
        </Cluster>  
 
3、修改项目的web.xml文件:
web.xml文件的修改很简单:只需要在<web-app/>节点中添加<distributable/>这个节点就可以了。
经过这三步就实现了Tomcat的集群下的Session的共享了。

2、Tomcat集群方式的优缺点

Tomcat集群方式有三种,分别是:

1.使用DNS轮询.

2.使用Apache R-proxy方式。

3.使用Apache mod_jk方式.

DNS轮询

缺点:当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必须等到dns解析更新,或者这台服务器重新启动。

还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并且占用大量公网IP地址,而且tomcat还要负责处理静态网页资源,影响效率。

优点:集群配置最简单,dns设置也非常简单。

R-proxy(反向代理)

缺点:当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存在这个问题。

mod_jk

优点:Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。

缺点:当停止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去。

R-proxy和mod_jk的共同优点是.可以只将Apache置于公网,节省公网IP地址资源。

可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和servlet等动态请求。

共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。

R-proxy和mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。

这三种Tomcat集群方式对实现最佳负载均衡都有一定不足,mod_jk相对好些,可以通过设置lbfactor参数来分配请求任务,但又因为mod_jk2方式不被推荐,mod_jk2已经不再被更新了。

 

在 做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果 session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题:

一,利用数据库同步session

在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:

1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。

2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担

二,利用cookie同步session

session 是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到 cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器 B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没 有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的 同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三,利用memcache同步session

memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。

优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。

缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

四,总结

上面三种方法都是可行的

第一种方法,最影响系统速度的那种,不推荐使用;

第二种方法,效果不错,不过安全隐患一样的存在;

第三种方法,个人觉得第三种方法是最好的,推荐大家使用

其实这么写,可能对你帮助不是很大,但了解一些大概关于集群的知识,对你的面试还是有些帮助的。


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值