<<上篇 | 首页 | 下篇>>

提升tomcat服务器性能的七条经验

1. 服务器资源

    服务器所提供足够CPU、内存、硬盘

2. 利用缓存和压缩

         企业nginx的gzip,客户端资源文件缓存,服务器端页面缓存,数据库缓存等等

3. 采用集群

         Nginx负载均衡,加上Tomcat的session共享或复制集群

4. 优化tomcat参数

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

  1. <Connector port="8080"   
  2.            protocol="org.apache.coyote.http11.Http11NioProtocol"  
  3.            connectionTimeout="20000"  
  4.            redirectPort="8443"   
  5.            maxThreads="500"   
  6.            minSpareThreads="20"  
  7.            acceptCount="100" 
  8.            disableUploadTimeout="true" 
  9.            enableLookups="false"   
  10.            URIEncoding="UTF-8" /> 

5. 改用APR库

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

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

    APR则需要安装第三方库,在高并发下会让性能有明显提升。具体安装办法可以参考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安装完成后重启即可生效。如使用默认protocal就是apr,但最好把将protocol修改成org.apache.coyote.http11.Http11AprProtocol,会更加明确

    在官方找到一个表格详细说明了这三种方式的区别:

  1.                   Java Blocking Connector   Java Nio Blocking Connector   APR/native Connector 
  2.                              BIO                         NIO                       APR 
  3. Classname                AjpProtocol               AjpNioProtocol           AjpAprProtocol 
  4. Tomcat Version           3.x onwards                 7.x onwards              5.5.x onwards 
  5. Support Polling              NO                          YES                       YES 
  6. Polling Size                 N/A                   maxConnections             maxConnections 
  7. Read Request Headers      Blocking                  Sim Blocking                   Blocking 
  8. Read Request Body         Blocking                  Sim Blocking                   Blocking 
  9. Write Response            Blocking                  Sim Blocking                   Blocking 
  10. Wait for next Request     Blocking                  Non Blocking               Non Blocking 
  11. Max Connections        maxConnections              maxConnections             maxConnections 

6. 优化网络

    Joel也明确提出了优化网卡驱动可以有效提升性能,这个对于集群环境工作的时候尤为重要。由于我们采用了linux服务器,所以优化内核参数也是一个非常重要的工作。给一个参考的优化参数:

  1. 1. 修改/etc/sysctl.cnf文件,在最后追加如下内容: 
  2.  
  3. net.core.netdev_max_backlog = 32768 
  4. net.core.somaxconn = 32768 
  5. net.core.wmem_default = 8388608 
  6. net.core.rmem_default = 8388608 
  7. net.core.rmem_max = 16777216 
  8. net.core.wmem_max = 16777216 
  9. net.ipv4.ip_local_port_range = 1024 65000 
  10. net.ipv4.route.gc_timeout = 100 
  11. net.ipv4.tcp_fin_timeout = 30 
  12. net.ipv4.tcp_keepalive_time = 1200 
  13. net.ipv4.tcp_timestamps = 0 
  14. net.ipv4.tcp_synack_retries = 2 
  15. net.ipv4.tcp_syn_retries = 2 
  16. net.ipv4.tcp_tw_recycle = 1 
  17. net.ipv4.tcp_tw_reuse = 1 
  18. net.ipv4.tcp_mem = 94500000 915000000 927000000 
  19. net.ipv4.tcp_max_orphans = 3276800 
  20. net.ipv4.tcp_max_syn_backlog = 65536 
  21.  
  22. 2. 保存退出,执行sysctl -p生效 
  23.  

将Session会话存储在Redis并使用Nginx来实现Tomcat负载均衡

一段时间以来,我一直在寻找一种方式来发布代码到生产系统而不需要宕机,不影响任何活动用户。出人意料的是,该解决方案花了很少的时间就实现了。我们有Nginx负载平衡的Tomcat两个实例。Tomcat的Session存储在Redis里。 nginx配置成无粘性的,因为一个请求可以分到群集中的任何节点。当我们需要发布新代码,只需停下任何Tomcat实例。当前所有用户将被路由到其他活动实例。由于会话数据外部存储在Redis,活跃的用户将不会受到影响。一旦不活动实例已被更新,重启并可恢复服务。

 

我们先从Nginx开始:

[raoul@raoul-wp ~]$ sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm

 

编辑/etc/nginx/nginx.conf并添加下面文字

http {
2.upstream tomcat  {
3.server localhost:8080;
4.server localhost:8081;
5.}
6.include       /etc/nginx/mime.types;
7.default_type  application/octet-stream;

修改/etc/nginx/conf.d/default.conf,用下面的替换location部分:

location / {
2.proxy_pass  http://tomcat;

 重启Nginx:

[raoul@raoul-wp nginx]$ sudo service nginx restart

 

接下来,安装Tomcat两个实例。改变第二个实例的服务器端口,使他们不冲突。如果你在浏览器中输入https://localhost,将进入默认的tomcat页面。但是,由于我们还没有建立粘性会话,每个请求将以轮询的方式获得负载平衡,这实际上意味着它会每个请求创建一个新的会话。使用内置的tomcat的例子可以很容易地看到这种行为,导航到http://localhost/examples/servlets/servlet/SessionExample 并刷新此页面几次,并注意会话ID每次都改变。现在来解决这个问题。

 

下载并安装Redis。在http://redis.io/download有个好文档,所以不打算详谈。启动服务器,并使用客户端程序检查它是否正常工作。

最后,需要配置Tomcat来存储会话在Redis。为此,我们将使用Tomcat的Redis会话管理器(https://github.com/jcoleman/tomcat-redis-session-manager)。这个不能开箱即用需要进行一些调整。您需要下载这个项目的源代码,并更新相关的库版本后,重新构建它。我用的版本是commons-pool2-2.2.jar和jedis-2.6.1.jar。将这些JAR复制到两个Tomcat实例的lib目录。

 

更新在   tomcat-redis-session-manager 中build.gradle指定的commons-pool,jedis和tomcat的版本,构建项目。然后将tomcat-redis-session-manager-1.2.jar复制到每个实例的tomcat的lib目录下。修改两个tomcat的context.xml:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
2.<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
3.host="localhost"
4.port="6379"
5.database="0"
6.maxInactiveInterval="60" />

重新启动Tomcat实例,我们就大功告成了。现在你可以看到Tomcat的会话存储在Redis了。转载请保留原文链接.

几个可用于数据挖掘和统计分析的java库

WEKA:WEKA是一个可用于数据挖掘任务的机器学习算法集合。该算法可以直接应用到数据集或从自己的Java代码调用。 WEKA包含数据预处理,分类,回归,聚类,关联规则,和可视化工具。它也非常适用于开发新的机器学习方案。

jmotif:时间序列、分类、数据挖掘开发库

java-ml:Java机器学习库,聚类、分类、特征选择、

flanagan: 数学和统计java开发库,包含回归算法,一次二次线性非线性回归算法,数据平滑算法,傅里叶变换,数值积分,插值法。http://www.ee.ucl.ac.uk/~mflanaga/java/

Mahout:Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 的最近版本中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。

matlab:

JMulTi:时间序列分析开发库

标签 :