提升tomcat服务器性能的七条经验
1. 服务器资源
2. 利用缓存和压缩
企业nginx的gzip,客户端资源文件缓存,服务器端页面缓存,数据库缓存等等
3. 采用集群
Nginx负载均衡,加上Tomcat的session共享或复制集群
4. 优化tomcat参数
- <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" />
5. 改用APR库
- Java Blocking Connector Java Nio Blocking Connector APR/native Connector
- BIO NIO APR
- Classname AjpProtocol AjpNioProtocol AjpAprProtocol
- Tomcat Version 3.x onwards 7.x onwards 5.5.x onwards
- Support Polling NO YES YES
- Polling Size N/A maxConnections maxConnections
- Read Request Headers Blocking Sim Blocking Blocking
- Read Request Body Blocking Sim Blocking Blocking
- Write Response Blocking Sim Blocking Blocking
- Wait for next Request Blocking Non Blocking Non Blocking
- Max Connections maxConnections maxConnections maxConnections
6. 优化网络
- 1. 修改/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
- 2. 保存退出,执行sysctl -p生效
将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:时间序列分析开发库