首页 > 其他分享 >Resin 3 pro高并发,响应性与稳定性方案(转)

Resin 3 pro高并发,响应性与稳定性方案(转)

时间:2023-05-16 19:03:57浏览次数:34  
标签:int pro System private 并发 Resin resin url 512



以下方案我是在Intel xeon(至强) 3.2G 2个双核物理CPU+2G内存(Ecc)上进行:

resin版本为resin-pro-3.0.21,JVM为Jrockit 1.5_06, resin java 启动参数 -Xms256m -Xmx512m

1. 以下为resin.conf配置

<!--
            - Resin 3.0 configuration file.
            -->
            <resin xmlns="http://caucho.com/ns/resin"
            xmlns:resin="http://caucho.com/ns/resin/core">
            <!--
            - Logging configuration for the JDK logging API.
            -->
            <log name="" level="all" path="stdout:" timestamp="[%H:%M:%S.%s] "/>
             
            <logger name="com.caucho.java" level="config"/>
            <logger name="com.caucho.loader" level="config"/>
             
            <dependency-check-interval>600s</dependency-check-interval>
             
            <javac compiler="internal" args=""/>
             
            <thread-pool>
            <thread-max>10240</thread-max>
            <spare-thread-min>50</spare-thread-min>
            </thread-pool>
             
            <min-free-memory>5M</min-free-memory>
             
            <server>
            <class-loader>
            <tree-loader path="${resin.home}/lib"/>
            <tree-loader path="${server.root}/lib"/>
            </class-loader>
             
            <keepalive-max>1024</keepalive-max>
            <keepalive-timeout>60s</keepalive-timeout>
             
            <resin:if test="${resin.isProfessional()}">
            <select-manager enable="true"/>
            </resin:if>
             
            <bind-ports-after-start/>
             
            <http server-id="" host="*" port="80"/>
             
            <cluster>
            <srun server-id="" host="127.0.0.1" port="6802"/>
            </cluster>
             
            <resin:if test="${resin.isProfessional()}">
            <persistent-store type="cluster">
            <init path="session"/>
            </persistent-store>
            </resin:if>
             
            <ignore-client-disconnect>true</ignore-client-disconnect>
             
            <resin:if test="${isResinProfessional}">
            <cache path="cache" memory-size="20M"/>
            </resin:if>
             
            <web-app-default>
            <class-loader>
            <tree-loader path="${server.root}/ext-webapp"/>
            </class-loader>
             
            <cache-mapping url-pattern="/" expires="60s"/>
            <cache-mapping url-pattern="*.gif" expires="600s"/>
            <cache-mapping url-pattern="*.jpg" expires="600s"/>
             
            <servlet servlet-name="directory"
            servlet-class="com.caucho.servlets.DirectoryServlet">
            <init enable="false"/>
            </servlet>
             
            <allow-servlet-el/>
             
            <session-config>
            <enable-url-rewriting>false</enable-url-rewriting>
            </session-config>
             
            </web-app-default>
             
            <host-default>
            <class-loader>
            <compiling-loader path="webapps/WEB-INF/classes"/>
            <library-loader path="webapps/WEB-INF/lib"/>
            </class-loader>
             
            <!--access-log path="logs/access.log"
            format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
            rollover-period="1W"/-->
             
            <web-app-deploy path="webapps"/>
             
            <ear-deploy path="deploy">
            <ear-default>
            <!-- Configure this for the ejb server
            -
            - <ejb-server>
            -   <config-directory>WEB-INF</config-directory>
            -   <data-source>jdbc/test</data-source>
            - </ejb-server>
            -->
            </ear-default>
            </ear-deploy>
             
            <resource-deploy path="deploy"/>
             
            <web-app-deploy path="deploy"/>
            </host-default>
             
            <resin:import path="${resin.home}/conf/app-default.xml"/>
             
            <host-deploy path="hosts">
            <host-default>
            <resin:import path="host.xml" optional="true"/>
            </host-default>
            </host-deploy>
             
            <host id="" root-directory=".">
            <web-app id="/" document-directory="d:\website\chat">
            </web-app>
            </host>
            </server>
            </resin>

2. 在应用的web.xml中加入resin status查看servlet映射

<servlet-mapping servlet-class='com.caucho.servlets.ResinStatusServlet'>
            <url-pattern>/resin-status</url-pattern>
            <init enable="read"/>
            </servlet-mapping>

3. 启动resin,确认应用正常启动。

4. 写访问测试程序

import java.io.InputStream;
            import java.net.URL;
             
             
            public class TestURL
            {
            public static void main(String[] args) throws Exception
            {
            long a = System.currentTimeMillis();
            System.out.println("Starting request url:");
            for(int i = 0; i < 10000; i++){
            URL url = new URL("http://192.168.1.200/main.jsp");
             
            InputStream is = url.openStream();
            is.close();
            System.out.println("Starting request url:"+i);
            }
            System.out.println("request url end.take "+(System.currentTimeMillis()-a)+"ms");
            }
             
            }

5. 在Jbuilder中执行TestURL

在执行过程中,一边刷新http://192.168.1.200/resin-status,查看resin状态,在http://*:80 中的 Active Threads 和 Total,会一直增长,当长到512的时候不再增长,这时再刷新resin-status页面时,会发现打开很慢。原因是服务器已经达到最大连接数,在等待前面连接的释放而不能接受新的连接。

于是下载Resin 3.0.21源码,搜索 512,发现com.caucho.server.port.Port类中有以下代码:

// default timeout
            private long _timeout = 65000L;
             
            private int _connectionMax = 512;//就是这行,查找resin所有源码后,发现没有对这个值进行设置
            private int _minSpareConnection = 16;
             
            private int _keepaliveMax = -1;
             
            private int _minSpareListen = 5;
            private int _maxSpareListen = 10;

将_connectionMax 改为 20480,然后重新编译并替换resin.jar中的Port类。

6. 重新启动Resin,再次运行TestURL进行测试,这次你会发现Threads Active 和 Total 一直变大,且可以超过512一直增大,在测试程序运行过程中刷新页面,页面响应性能还是不错的.

另,测试过程中Resin会打印出 1-3次 强制执行GC的信息,属于正常。

7.待测试完毕,Threads Active 和 Total 马上降为1.Idle为9,总内存为536.87Meg 空闲内存为480.33M

再经多次测试,结果一致,内存回收正常,表明当前 resin 稳定性和响应性可靠。

标签:int,pro,System,private,并发,Resin,resin,url,512
From: https://blog.51cto.com/u_16115638/6286401

相关文章

  • could not initialize proxy - no Session
    在<many-to-on>中这错误很常见,字面意义就是不能被初始化,因为session已经关闭了。简单理解就是因为,你使用了lazy=true,这样hibernate在从数据库中调数据的时候是不会把关联的对象查出来的,而是保存一个获取值得方法,在你使用getXXX()调用的时候,hiberante会利用这个保存的方法去从数据库......
  • SpringBoot+Prometheus+Grafana实现应用程序可视化监控
    1、SpringBoot应用暴露监控指标maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupI......
  • SAP UI5 Tooling - 在 i18n.properties 文件里维护中文字符后变成乱码该如何解决
    看这个Githubissue.重现步骤:解决方案settingthepropertiesFileSourceEncodingconfigurationinui5.yamltoUTF-8.Documentation:https://sap.github.io/ui5-tooling/pages/Configuration/#encoding-of-properties-filesExample:https://github.com/SAP-samples/ope......
  • 问题记录之mysql:Job for mysqld.service failed because the control process exited
    今天服务器连接mysql发现一直超时(查出的原因是磁盘满了)清了磁盘以后,mysqld.service 还是无法启动执行命令及报错如下:(注意,因为磁盘满的问题,我的mysql并不是正常途径关闭的)控制进程以错误代码退出导致无法以正常的方式启动它了,错误说明:Jobformysqld.servicefailedbecauset......
  • Java public、protected、default和private四种修饰符区别
    一、相同点都是修饰符二、不同点访问权限不同public任何地方都可以访问,被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。****protected修饰符,权限介于public与default之间。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类......
  • SAP Fiori Tools 里 proxy 中间件的使用场景介绍
    使用proxy中间件可以让开发人员通过配置的方式连接不同的后台系统,或者是切换不同的SAPUI5版本。下面是一个典型的ui5.yaml里的proxy配置文件的例子:-name:fiori-tools-proxyafterMiddleware:compressionconfiguration:backend:-path:/sapur......
  • SAP UI5 Flexible Programming Model Explorer
    按照SAPUI5官网的说法,TheSAPUI5freestyletemplatesaredeprecated,andit’srecommendedtousethecustompageSAPFioritemplatebasedontheflexibleprogrammingmodelasanalternative.Formoreinformation,seeFlexibleProgrammingModelInformation......
  • 并发设计的思考
    看了AtomicLong的实现或许会立马想到ReentrantLock或者Synchronized也可以实现原子类,只要在操作前获取锁,操作完释放锁。但是为什么不用这些锁,而是用CAS呢?显然,这些锁都是互斥锁,在多线程竞争激烈的情况下,伴随着大量线程上下文切换和独占,严重降低吞吐量。然使用CAS+Volatile,这种......
  • Go语言并发编程-cnblog
    并发编程并发vs并行举个形象点的例子并发可以理解为一边吃饭,一边喝水,因为人只有一个嘴一个咽喉,所以同一时刻饭和水只能有一样进入,二者只能交替进行并行可以理解为一边走路一边吃东西,因为走路是靠腿脚,吃东西是靠嘴,二者不相干,相当于两个独立的线程,因而可以同时进行Go语言......
  • 用Fiddler、Charles和mitmproxy进行手机抓包的配置教程
    [用Fiddler、Charles和mitmproxy进行手机抓包的配置教程_程序员大飞1的博客-CSDN博客](https://blog.csdn.net/weixin_42512684/article/details/93534803)写爬虫时,有些数据pc端并不能提供我们需要的数据例如抖音,就需要对手机端数据进行抓取,目前来说比较常用的app抓包软件:Fidd......