最近公司后台系统自从加了 lucene 以来 , 上个星期每天因为内存溢出导致宕机或者系统运行极慢 ( 我都快崩溃了 ), 不得不在后台打开 Jconsole 就行实时监控 , 每当内存达到一定峰值就手动执行 GC, 释放几百 M 的内存 , 才得以正常运行 ! 后来通过 jprofiler6 监控是 lucene Term 实例过多的问题 !
如图 :
虽然内存问题通过以上方式暂时解决了 , 但是也出现了致命的问题 lucene 打开索引的文件数过多没有及时释放 ,
服务器一直在后台打印错误日志 ( 一天有 10G 的日志 )
如图 :
在上面的放两个问题 , 希望的到大家的回帖帮助 !
下面进入主题 :
测试环境:
一共两台服务器 A.B, 都是 Redhat Linux
A:ip(211.151.*.39) 服务器装有 Tomcat39 , http 请求端口为 8080
B:ip(211.151.*.40) 服务器装有 Tomcat40 , http 请求端口为 8080; nginx 服务器 ,http 请求端口 8085
ip 地址 ( 外网 IP) 有一个被省略 , 推荐大家在一台机器测试改变 tomcat 端口就可以啦
以上是公司提供的两台测试服务器
软件版本
Nginx 0.854
Apache Tomcat/6.0.20
安装
过程细节网上资料很多 , 我就不写了 ……
配置 ngnix 服务器 /usr/local/nginx/conf/nginx.conf
#user nobody; # 工作进程数 worker_processes 6;
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
#pid logs/nginx.pid;
# 工作模式及连接数上限 events { worker_connections 4096; }
http { include mime.types; default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; #tcp_nopush on;
#keepalive_timeout 0; keepalive_timeout 65;
#gzip on; upstream tqcrm { # tqcrm 项目名 # 配置 tomcat 服务器 server 211.151.*.39:8080 weight=1; # tomcat 地址和端口 server 211.151.*.40:8080 weight=1; }
server { listen 8085; #nginx 监听端口 server_name localhost;
#charset koi8-r; charset gb2312;
#access_log logs/host.access.log main;
location / { root html; #index index.html index.htm; proxy_pass http://tqcrm; }
location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ /.php$ { # proxy_pass http://127.0.0.1; #}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ /.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}
# deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ //.ht { # deny all; #} }
# another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias;
# location / { # root html; # index index.html index.htm; # } #}
# HTTPS server # #server { # listen 443; # server_name localhost;
# ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on;
# location / { # root html; # index index.html index.htm; # } #}
} |
配置 tomcat39(server.xml)
xml version = '1.0' encoding = 'utf-8' ?>
< Server port = "8005" shutdown = "SHUTDOWN" >
< Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
< Listener className = "org.apache.catalina.core.JasperListener" />
< Listener className = "org.apache.catalina.mbeans.ServerLifecycleListener" /> < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
< 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" >
< Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-" maxThreads = "500" minSpareThreads = "50" maxIdleTime = "60000" />
< Connector executor = "tomcatThreadPool" port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" enableLookups = "false" disableUploadTimeout = "true" URIEncoding = "gbk" compression = "on" noCompressionUserAgents = "gozilla, traviata" compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain,application/json"
/>
< Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
< Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat39" >
< 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 = "211.151.*.39" 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" /> < Interceptor className = "org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" /> 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 >
< Realm className = "org.apache.catalina.realm.UserDatabaseRealm" resourceName = "UserDatabase" />
< Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" xmlValidation = "false" xmlNamespaceAware = "false" >
< Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "log" prefix = "localhost_access_log." suffix = ".txt" pattern = "%t %r %s %T" resolveHosts = "false" /> Host > Engine > Service > Server > |
配置 tomcat40(server.xml)
xml version = '1.0' encoding = 'utf-8' ?>
< Server port = "8005" shutdown = "SHUTDOWN" >
< Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
< Listener className = "org.apache.catalina.core.JasperListener" />
< Listener className = "org.apache.catalina.mbeans.ServerLifecycleListener" /> < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
< 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" >
< Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-" maxThreads = "500" minSpareThreads = "50" maxIdleTime = "60000" />
|