`

appServer JBoss / jboss / Wildfly 8.1 / wildfly 8

阅读更多

s

http://www.tuicool.com/articles/IfuQjq

 

 

JBoss Developer Studio 6.0.0.GA for Mac OS X Lion 10.6.3

Installation path:
/Applications/jbdevstudio
Java VM path:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Following components will be installed:
JBoss Developer Studio 6.0.0.GA
Disk Space:
Available Disk Space: 150.42 GB
/Users/lindows/Documents/jbossRequired Disk Space: 433.98 MB

Work Space

/Users/lindows/Documents/jboss

jboss-as 目录结构(Directory Structure)

http://www.iteye.com/topic/368548

 

jboss http://love.baihe.com/Reg.action

jboss4.0.2 sqlserver2000 配置多数据源,密码加密

http://superxgz.iteye.com/blog/192778

 

http://gaoran2008.iteye.com/blog/181110

linux jboss

    新到公司里一切都是新的,呵呵。遇到的问题也是很多的,公司主要是作电子商务这一块。于是我接到的一个任务就是在Linux下来配置开发环境。本人虽然工 作了几年,但是对Linux和Jboss还真的不是很了解。现在配置好了所以把经验写下来与大家共享一下。也欢迎指正。

Linux版本:Linux localhost.localdomain 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686 i686 i386 GNU/Linux

JDK版本:jdk-1_5_0_15-linux-i586-rpm.bin

Jboss版本:jboss-4.2.2.GA

这些文件的下载肯定不是难事,这也不是我要说的重点。

我进入系统的用户是用root,呵呵,最大的权限。   

JDK安装开始:

1。在根目录下面创建JDK目录:#mkdir jdk

然后用FTP上传你的jdk-1_5_0_15-linux-i586-rpm.bin这个文件到目录下。

2。进入到JDK目录下:#chmod +x jdk-1_5_0_15-linux-i586.rpm.bin给出权限下来让别的用户也能用到。

3。# ./jdk-1_5_0_02-linux-i586.rpm.bin 可以得到一个jdk-1_5_0_15-linux-i586.rpm的文件。

4。# chmod +x jdk-1_5_0_02-linux-i586.rpm 对得到文件进行修改权限。

5。#rpm -ivh jdk-1_5_0_02-linux-i586.rpm  进行安装程序。

此时我们应该看到的是安装的协议,我们就一直按回车键来完成安装。

接下来我们就要设置环境变量了。

6。# vi /etc/profile.d/java.sh   这样作的目的是让所有的用户用到。在编辑java.sh文件的时候,我们进入的是命令模式,所以要进行模式切换,切换到文本模式用i就可以了,然后我们进行编辑,也就是把下面的配置写上去,如下:

JAVA_HOME=/usr/java/jdk1.5.0_15
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

写好了以后,我们要重文本模式转换到命令模式,用esc来切换。然后用:wq保存退出。我们现在是要用来重启机器用

#shutdown -r now 命令就可以做到。好了以后用java -version,得到:

java version "1.5.0_15"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_15-b04)
Java HotSpot(TM) Server VM (build 1.5.0_15-b04, mixed mode)

那么恭喜你,JDK安装成功了。

JDK安装成功了,那么就继续安装JBOSS了

8。从本地上文件到系统下,我们要先建立install,thirdparty目录。

#mkdir install

#mkdir thirdparty

然后就上传文件到/usr/local/install/thirdparty/jboss-4.2.2.GA.zip下面。

9。要对文件进行解压缩

#unzip jboss-4.2.2.GA.zip 当然你也可以解压缩到你指定的目录下面去了。

10。要设置环境变量了

#vi /etc/profile

然后在文件加入下面信息:

JBOSS_HOME=/usr/local/install/thirdparty/jboss-4.2.2.GA
PATH=$PATH:/usr/local/install/thirdparty/arm/2.95.3/bin
export JBOSS_HOME PATH

11。我们修改了文件,那么需要让他立即有效

# source /etc/profile

12。#echo $JBOSS_HOME  用来查看你的环境变量是不是输出了。

13。#cd $JBOSS_HOME/bin  进入到bin目录下用:

./run.sh来启动Jboss.

用IP来访问页面,http://127.0.0.1:8080 就可以出现测试页面了。

安装也就基本完成了。

不过我在中间遇到了一个问题,也就是

1。用IP访问不了页面,但启动服务器的话是完全对的,这个问题让我大伤脑经。最后查下来原来是JBOSS启动下需要绑定IP。

解决:

#cd $JBOSS_HOME/bin 目录下去

#vi start.sh  编辑该文件,然后加入  nohup ./run.sh -Djboss.bind.address=服务的IP &

 chmod a+x start.sh  --赋予权限

./statr.sh

保存退出。运行JBOSS,好了,解决问题。

/opt/jboss/bin/start.sh

#!/bin/sh
# Setup env
DIRNAME=`dirname "$0"`
CURDIR=`cd $DIRNAME;pwd`
. $CURDIR/env.conf


LAUNCH_JBOSS_IN_BACKGROUND=1
user=`whoami`

if [ "$user" != "jbossuser" ];then
    echo -e "\e[31mERROR: You mustn't start up jboss with $user! \e[m"
    echo -e "\e[31mERROR: Exit!!! \e[m"
    exit 1
else
## 1.Startup cluster mode

## Not recommend: print logs to nohup.out
#nohup $JBOSS_HOME/bin/domain.sh --backup > /$JBOSS_HOME/bin/nohup.out 2>&1 &

## Recommend: print no logs
nohup $JBOSS_HOME/bin/domain.sh --backup > /dev/null 2>&1 &

## 2.Startup standalone mode

## Not recommend: print logs to nohup.out
#nohup $JBOSS_HOME/bin/standalone.sh > /$JBOSS_HOME/bin/nohup.out 2>&1 &

## Recommend: print no logs
#nohup $JBOSS_HOME/bin/standalone.sh > /dev/null 2>&1 &
fi

  

 

http://www.jboss.org/download/

http://www.jboss.org/jbossas/downloads/

https://sourceforge.net/project/showfiles.php?group_id=22866&package_id=16942&release_id=610469

http://downloads.sourceforge.net/jboss/jboss-5.0.0.CR1.zip?modtime=1214868617&big_mirror=1

 

JBoss Tools 2.0.0.CR1下载地址 :

http://sourceforge.net/project/downloading.php?groupname=jboss&filename=JBossTools-2.0.0.CR1-ALL-win32.zip&use_mirror=nchc
Linux版本:http://downloads.sourceforge.net/jboss/JBossTools-2.0.0.CR1-ALL-linux-gtk.zip 
Windows版本:http://downloads.sourceforge.net/jboss/JBossTools-2.0.0.CR1-ALL-win32.zip 
Mac版本:http://downloads.sourceforge.net/jboss/JBossTools-2.0.0.CR1-ALL-macosx-carbon.zip

 

Jboss4.03 web-console jmx-console 登录安全设置

 http://blog.chinaunix.net/u/11765/showart_224521.html

 http://blog.chinaunix.net/u/20644/showart.php?id=334609

 

jboss4默认用户名和密码 

文件:D:\jboss4\server\default\conf\props\jmx-console-users.properties

内容:

# A sample users.properties file for use with the UsersRolesLoginModule
admin=password

文件:D:\jboss4\server\default\conf\props\jmx-console-roles.properties

内容:

# A sample roles.properties file for use with the UsersRolesLoginModule
admin=JBossAdmin,HttpInvoker

http://localhost:8080/
http://localhost:8080/test
http://localhost:8080/jmx-console   id:admin pwd:password
http://localhost:8080/invoker
http://localhost:8080/ws4ee
http://localhost:8080/web-console
http://localhost:8080/jbossmq-httpil

 

http://localhost:8080/   默认使用8080端口

默认配置了以下服务:

  • JMX Console
  • JBoss Web Console

    为了安全起见,需要用户通过授权进行访问。

    首先对JMX-Console进行设置,在《Getting Started with JBoss 4.0  Release 4》 的2.2.3. Security Service小节中给出了方法,但是缺少了一点点东西:
    STEP 1: 
        找到%JBOSS_HOME%/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml文件,根据说明,去掉注释。

    <jboss-web>
       <!-- Uncomment the security-domain to enable security. You will
          need to edit the htmladaptor login configuration to setup the
          login modules used to authentication users. -->
       <security-domain>java:/jaas/jmx-console</security-domain>
    </jboss-web>

    STEP 2: 
        与jboss-web.xml同级目录下还有一个文件web.xml,找到其中的<security-constraint/>节点,根据说明,取消注释。

    ……

       <!-- A security constraint that restricts access to the HTML JMX console
       to users with the role JBossAdmin. Edit the roles to what you want and
       uncomment the WEB-INF/jboss-web.xml/security-domain element to enable
       secured access to the HTML JMX console.
       -->
     
       <security-constraint>
         <web-resource-collection>
           <web-resource-name>HtmlAdaptor</web-resource-name>
           <description>An example security config that only allows users with the
             role JBossAdmin to access the HTML JMX console web application
           </description>
           <url-pattern>/*</url-pattern>
           <http-method>GET</http-method>
           <http-method>POST</http-method>
         </web-resource-collection>
         <auth-constraint>
           <role-name>JBossAdmin</role-name>
         </auth-constraint>
       </security-constraint>

       <security-constraint>
         <web-resource-collection>
           <web-resource-name>Public</web-resource-name>
           <url-pattern>/public/*</url-pattern>
           <http-method>GET</http-method>
           <http-method>POST</http-method>
         </web-resource-collection>
       </security-constraint>

    ……

    STEP 3: 
        在第一步中的jmx-console安全域和第二步中的运行角色JBossAdmin都是在login-config.xml中配置,我们 在%JBOSS_HOME%/server/default/conf/props下找到它。查找名字为:jmx-console的 application-policy:

        <application-policy name = "jmx-console">
           <authentication>
              <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                 flag = "required">
               <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
               <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
              </login-module>
           </authentication>
        </application-policy>

  •  


  • 文件props/jmx-console-users.properties定义了用户名、密码;props/jmx-console-roles.properties定义了用户所属角色,找到后自行修改或重新定义用户名、密码。

  •  

配置web-console ,具体方法同jmx-console,就是位置不同:

  • jboss-web.xml、web.xml在%JBOSS_HOME%/server/default/deploy/management/console-mgr.sar\web-console.war/WEB-INF下;
  • login-config.xml还是原来的那个,把application-policy名为$webConsoleDomain的部分改成你需要的web-console;
  • web-console-users.properties、web-console-roles.properties定义了访问web- console的用户、用户角色,具体位置自己去找,使用find /jboss -name web-console-users.properties 找到以后可以修改用户名、密码。

other appServer

 

http://blog.csdn.net/iihero/archive/2006/08/24/1114477.aspx

 

jboss4.2.2GA中文文档,包括EJB3.0开发和使用和jms

http://www.itpub.net/thread-986360-1-1.html

 

jboss exception

http://www.rich-hosp.cn:8080/portal/custLogin.do;jsessionid=C9137DF036A51EA46C12FEA4E9CDEE01

 

HTTP Status 500 -


type  Exception report

message

description  The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:408)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:350)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	com.neweasy.framework.web.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:30)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

 

root cause

java.lang.NullPointerException
	com.neweasy.selfhelp.login.CustLoginAction.handleRequest(CustLoginAction.java:53)
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:45)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:820)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:755)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:396)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:350)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	com.neweasy.framework.web.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:30)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

 

note  The full stack trace of the root cause is available in the JBossWeb/2.0.1.GA logs.


JBossWeb/2.0.1.GA

 

 

 

http://www.mynj.gov.cn/isp/ioe/ioe_all.jsp?st_service_id=NJ01GA-XK-0012#

 

---------------------------end-------------------------------

 

Java EE 5 Compatible Implementations

Sun Java System Application Server Platform Edition 9

TmaxSoft JEUS 6

1.4 Compatible Implementations

Oracle BEA WebLogic Server 9.2

Apache Geronimo 1.0-M5

CAS OnceAS2.0 Institute of Software, Chinese Academy of Sciences

Hitachi Cosminexus Application Server

IBM IBM WebSphere Application Server

JBoss JBoss Application Server 4.0

Kingdee Apusic v4.0

NEC WebOTX 6.1

ObjectWeb JOnAS v4.4

Oracle  Oracle Application Server Containers for J2EE 10g (10.1.3)

Tmax Soft JEUS 5.0

NEC WebOTX 6.1

SAP NetWeaver J2EE Preview

Sun Java System Application Server Platform Edition 8

Sybase EAServer 6.0

Tmax Soft JEUS 5.0

TongTech TongWeb Application Server Version v4.6

Trifork T4 Application Server

jboss seam

http://www.redhat.com/g/JBoss_DevSuite.png

JBoss4.2.3部署SSH2

http://itcareerist.iteye.com/blog/845819

  1. 部署环境:JDK1.6+JBoss4.2.3+Struts2.1.8+Spring2.5.6+Hibernate3.3.2。
  2. 将war包解压至“JBOSS安装目录\server\default\deploy”目录下,文件夹改名为xxx.war,或者直接将war包拷贝到该目录。
  3. 启动JBoss,报了很多错误。主要错误摘要如下:
    Java代码  
    1. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [spring/applicationContext-hibernate.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [spring/applicationContext-hibernate.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: java.lang.NoSuchMethodException: org.hibernate.validator.ClassValidator.<init>(java.lang.Class, java.util.ResourceBundle, org.hibernate.validator.MessageInterpolator, java.util.Map, org.hibernate.annotations.common.reflection.ReflectionManager)  
    2.         at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)  
    3. .....................  
    4. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [spring/applicationContext-hibernate.xml]: Invocation of init method failed; nested exceptionis org.hibernate.AnnotationException: java.lang.NoSuchMethodException: org.hibernate.validator.ClassValidator.<init>(java.lang.Class, java.util.ResourceBundle,org.hibernate.validator.MessageInterpolator, java.util.Map, org.hibernate.annotations.common.reflection.ReflectionManager)  
    5.         at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)  
    6. .....................  
    7. Caused by: org.hibernate.AnnotationException: java.lang.NoSuchMethodException: org.hibernate.validator.ClassValidator.<init>(java.lang.Class, java.util.ResourceBundle, org.hibernate.validator.MessageInterpolator, java.util.Map, org.hibernate.annotations.common.reflection.ReflectionManager)  
    8.         at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:374)  
    9. .....................  
    10. Caused by: java.lang.NoSuchMethodException: org.hibernate.validator.ClassValidator.<init>(java.lang.Class, java.util.ResourceBundle, org.hibernate.validator.MessageInterpolator, java.util.Map, org.hibernate.annotations.common.reflection.ReflectionManager)   
    11.         at java.lang.Class.getConstructor0(Class.java:2706)  
    12.         at java.lang.Class.getDeclaredConstructor(Class.java:1985)  
    13.         at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:362)  
    14.         ... 214 more  
     
  4. 修改“JBOSS安装目录\server\default\deploy\jboss-web.deployer\META-INF”下的jboss-service.xml文件,改属性“UseJBossWebLoader”为true。
    该属性原文解释如下:
    A flag indicating if the JBoss Loader should be used. This loader uses a unified class loader as the class loader rather than the tomcat specific class loader.
    The default is false to ensure that wars have isolated class loading for duplicate jars and jsp files.
    该配置表明是否使用JBoss自身的classloader来加载webApp相关的资源;因为JBoss是通过集成Tomcat来实现Web Container的,而两者都有自己独立的classloader;
    若设置为true,则表示Web应用加载时都将使用JBoss统一的classloader,即此时采用共享的扁平的UnifiedClassLoader;
    若设置为false,则表示Web应用采用自己独立的WebAppClassLoader进行加载,此时Web应用和JBoss之间是完全隔离的,这也是该配置项的默认值;
  5. 新启动正常,无错误日志,访问部署的Web应用正常。

Wildfly 8.0 版本压测异常,Wildfly 8.1 版本压测无异常,web container 自适应。商品详细场景环境压测

1、jboss的task-io的web container线程池默认为15,数据源的连接池配置Min Pool Size 为20,Max Pool Size为200.压测过程中监测数据源的连接池最多使用为17。

2、更改了jboss的task-io的web container线程池为100,数据源的连接池保持不变,重启服务器后loadrunner 50用户并发压测,压测数据源的连接池使用做多达到50左右,TPS的值达到2800左右。
wildfly 8.1 连接数设置 / jboss 连接数设置方法 / 调优案例:直播系统 LV 
问题一 CPU 负载不均衡,锯齿抖动问题

可以修改apache的/opt/apache/conf/mod_cluster.conf文件

添加参数

LBstatusRecalTime  1

即可消除CPU锯齿抖动问题

问题二 jboss 连接数 
默认连接数
/opt/jboss/domain/configuration\domain.xml
            <subsystem xmlns="urn:jboss:domain:io:1.1">
                <worker name="default" io-threads="3"/>
                <buffer-pool name="default" buffer-size="16384" buffers-per-slice="128"/>
            </subsystem>
调整后连接数
 /opt/jboss/domain/configuration\domain.xml
 
 
Wildfly 8.1 版本压测性能异常,场景名称:定制店铺(msfs无varnish缓存+sis有redis缓存)
http://wiki.cns*****.com/pages/viewpage.action?pageId=19369200  
压测店铺首页,并发用户10-20-30-40往上压tps保持在40+,cpu保持在40+%,再往上压就上不去了,直接压域名cache、web、app问题都一样。
1.定位jboss发现问题,max threads为10,这样的确是问题,改成置空,默认为置空的,jboss会自动调整最大线程,但是不会让cpu超过75+%。
http://dl2.iteye.com/upload/attachment/0104/1211/e0c17c0d-13aa-36dd-9a37-3c5db4e9f87f.png
 
2.jboss jvm 内存调优
http://dl2.iteye.com/upload/attachment/0104/1213/3d391924-a526-3389-82f9-a10510f81af6.png

jboss上存在非标准cookie请求时报错,无法继续进行正常业务

http://wiki.cns*****.com/pages/viewpage.action?pageId=19372357

案例:

模拟设置Cookie: quh[360]sd=sad;

请求http://127.0.0.1:8080/mmps-web/test.do 

该请求中存在 request.getCookies() 获取cookie内容。

控制台报错:

Exception handling request to /mmps-web/test.do: java.lang.IllegalArgumentException: Cookie name "qh[360]sd" is a reserved token

解决方案:

添加系统属性: org.glassfish.web.rfc2109_cookie_names_enforced=false ,让jboss忽略强制检查cookie名的标准。

可以在jboss的配置文件中添加(extensions节和managment节之间):

</extensions>

<system-properties>

        <property name="org.glassfish.web.rfc2109_cookie_names_enforced" value="false"/>

</system-properties>

<management>

也可以在代码层面,比如servlet初始化时。。spring context初始化时添加设置

System.setProperty("org.glassfish.web.rfc2109_cookie_names_enforced", "false");这样可以避免由于用户浏览器的cookie名存在不规范的情况导致我们的业务页面不能正常访问。

 

使用jstack分析cpu消耗过高的问题

http://www.iteye.com/topic/1114219

我们使用jdk自带的jstack来分析。当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 

1.top查找出哪个进程消耗的cpu高 
21125 co_ad2    18   0 1817m 776m 9712 S  3.3  4.9  12:03.24 java                                                                                           
5284 co_ad     21   0 3028m 2.5g 9432 S  1.0 16.3   6629:44 java                                                                                           
21994 mysql     15   0  449m  88m 5072 S  1.0  0.6  67582:38 mysqld                                                                                         
8657 co_sparr  19   0 2678m 892m 9220 S  0.3  5.7 103:06.13 java 

这里我们分析21125这个java进程。 

2.top中shift+h查找出哪个线程消耗的cpu高 
先输入top,然后再按shift+h 
21233 co_ad2    15   0 1807m 630m 9492 S  1.3  4.0   0:05.12 java                                                                                           
20503 co_ad2_s  15   0 1360m 560m 9176 S  0.3  3.6   0:46.72 java                                                                                           
21134 co_ad2    15   0 1807m 630m 9492 S  0.3  4.0   0:00.72 java                                                                                           
22673 co_ad2    15   0 1807m 630m 9492 S  0.3  4.0   0:03.12 java 

这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。 

3.jstack查找这个线程的信息 
jstack [进程]|grep -A 10 [线程的16进制] 
即: 

Java代码  收藏代码
  1. jstack 21125|grep -A 10 52f1  


-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。 
结果: 

Java代码  收藏代码
  1. "http-8081-11" daemon prio=10 tid=0x00002aab049a1800 nid=0x52bb in Object.wait() [0x0000000042c75000]  
  2.    java.lang.Thread.State: WAITING (on object monitor)  
  3.      at java.lang.Object.wait(Native Method)  
  4.      at java.lang.Object.wait(Object.java:485)  
  5.      at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)  


说不定可以一下子定位到出问题的代码。

可实施程度不高,明显的死循环找出来容易,遇到线程切换很频繁的应用,基笨无用。

解决案例:

并发太高,造成程序启用的http请求太多,连接池处理不了,很多http请求一直在runnable状态,造成cpu一直保持到高位。通过这种方法,就可以找出是哪些代码启用了这么多的http请求。 造成cpu飙高,很大一部分原因都是线程一直在运行或者等待造成的。如果线程切换很频繁,但每个线程都得到了很好的执行,即使cpu消耗很高,说明cpu利用率很高,程序很健康。但cpu一直保持高位甚至99%的时候,基本都是线程有问题了一直在运行。此时这些线程通过这种方法是很容易找出来的。

 

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

http://guafei.iteye.com/blog/1815222

公司内部同事分享的一篇文章 

周末看到一个用jstack查看死锁的例子。昨天晚上总结了一下jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令。供大家参考 

1.Jstack 
1.1   jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 
 
注:这个和thread dump是同样的结果。但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙 

1.2   命名行格式 
jstack [ option ] pid 
jstack [ option ] executable core 
jstack [ option ] [server-id@]remote-hostname-or-IP 
最常用的还是jstack  pid 

1.3   在thread dump中,要留意下面几种状态 
死锁,Deadlock(重点关注) 
等待资源,Waiting on condition(重点关注) 
•  等待获取监视器,Waiting on monitor entry(重点关注) 
阻塞,Blocked(重点关注) 
•  执行中,Runnable 
•  暂停,Suspended 
•  对象等待中,Object.wait() 或 TIMED_WAITING 
•  停止,Parked 
下面有详细的例子讲这种分析,大家参考原著 
http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 
http://www.cnblogs.com/nexiyi/p/java_thread_jstack.html

  jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:
     jstack [-l][F] pid
     如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。进程处于hung死状态可以用-F强制打出stack。
     dump 文件里,值得关注的线程状态有:
     死锁,Deadlock(重点关注)
     执行中,Runnable  
     等待资源,Waiting on condition(重点关注)
     等待获取监视器,Waiting on monitor entry(重点关注)
     暂停,Suspended
     对象等待中,Object.wait() 或 TIMED_WAITING
     阻塞,Blocked(重点关注) 
     停止,Parked
1.4   在thread dump中,有几种线程的定义如下 
线程名称 所属 解释说明 
Attach Listener JVM Attach Listener 线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。 如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。 
Signal Dispatcher JVM 前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather 线程去进行分发到各个不同的模块处理命令,并且返回处理结果。 signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。 
CompilerThread0 JVM 用来调用JITing,实时编译装卸class 。 通常,jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1 
Concurrent Mark-Sweep GC Thread JVM 并发标记清除垃圾回收器(就是通常所说的CMS GC)线程, 该线程主要针对于老年代垃圾回收。ps:启用该垃圾回收器,需要在jvm启动参数中加上: -XX:+UseConcMarkSweepGC 
DestroyJavaVM JVM 执行main()的线程在main执行完后调用JNI中的 jni_DestroyJavaVM() 方法唤起DestroyJavaVM 线程。   JVM在 Jboss 服务器启动之后,就会唤起DestroyJavaVM线程,处于等待状态,等待其它线程(java线程和native线程)退出时通知它卸载JVM。线程退出时,都会判断自己当前是否是整个JVM中最后一个非deamon线程,如果是,则通知DestroyJavaVM 线程卸载JVM。 
ps: 
扩展一下: 
1.如果线程退出时判断自己不为最后一个非deamon线程,那么调用thread->exit(false) ,并在其中抛出thread_end事件,jvm不退出。 
2.如果线程退出时判断自己为最后一个非deamon线程,那么调用before_exit() 方法,抛出两个事件:  事件1:thread_end 线程结束事件、事件2:VM的death事件。 
    然后调用thread->exit(true) 方法,接下来把线程从active list卸下,删除线程等等一系列工作执行完成后,则通知正在等待的DestroyJavaVM 线程执行卸载JVM操作。 
ContainerBackgroundProcessor 线程 JBOSS 它是一个守护线程, 在jboss服务器在启动的时候就初始化了,主要工作是定期去检查有没有Session过期.过期则清除. 
参考:http://liudeh-009.iteye.com/blog/1584876 

Dispatcher-Thread-3  线程 Log4j       Log4j具有异步打印日志的功能,需要异步打印日志的Appender都需要注册到 AsyncAppender对象里面去,由AsyncAppender进行监听,决定何时触发日志打印操作。 AsyncAppender如果监听到它管辖范围内的Appender有打印日志的操作,则给这个Appender生成一个相应的event,并将该event保存在一个buffuer区域内。  Dispatcher-Thread-3线程负责判断这个event缓存区是否已经满了,如果已经满了,则将缓存区内的所有event分发到Appender容器里面去,那些注册上来的Appender收到自己的event后,则开始处理自己的日志打印工作。 Dispatcher-Thread-3线程是一个守护线程。 
Finalizer线程 JVM 这个线程也是在main线程之后创建的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;关于Finalizer线程的几点: 
1) 只有当开始一轮垃圾收集时,才会开始调用finalize()方法;因此并不是所有对象的finalize()方法都会被执行; 
2) 该线程也是daemon线程,因此如果虚拟机中没有其他非daemon线程,不管该线程有没有执行完finalize()方法,JVM也会退出; 
3) JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收; 
4) JVM为什么要单独用一个线程来执行finalize()方法呢?如果JVM的垃圾收集线程自己来做,很有可能由于在finalize()方法中误操作导致GC线程停止或不可控,这对GC线程来说是一种灾难; 
Gang worker#0 JVM JVM 用于做新生代垃圾回收(monir gc)的一个线程。#号后面是线程编号,例如:Gang worker#1 
GC Daemon JVM GC Daemon 线程是JVM为RMI提供远程分布式GC使用的,GC Daemon线程里面会主动调用System.gc()方法,对服务器进行Full GC。 其初衷是当 RMI 服务器返回一个对象到其客户机(远程方法的调用方)时,其跟踪远程对象在客户机中的使用。当再没有更多的对客户机上远程对象的引用时,或者如果引用的“租借”过期并且没有更新,服务器将垃圾回收远程对象。 
不过,我们现在jvm启动参数都加上了-XX:+DisableExplicitGC配置,所以,这个线程只有打酱油的份了。 
IdleRemover JBOSS Jboss连接池有一个最小值, 该线程每过一段时间都会被Jboss唤起,用于检查和销毁连接池中空闲和无效的连接,直到剩余的连接数小于等于它的最小值。 
Java2D Disposer JVM           这个线程主要服务于awt的各个组件。 说起该线程的主要工作职责前,需要先介绍一下Disposer类是干嘛的。 Disposer提供一个addRecord方法。 如果你想在一个对象被销毁前再做一些善后工作,那么,你可以调用Disposer#addRecord方法,将这个对象和一个自定义的DisposerRecord接口实现类,一起传入进去,进行注册。  
          Disposer类会唤起“Java2D Disposer”线程,该线程会扫描已注册的这些对象是否要被回收了,如果是,则调用该对象对应的DisposerRecord实现类里面的dispose方法。 
          Disposer实际上不限于在awt应用场景,只是awt里面的很多组件需要访问很多操作系统资源,所以,这些组件在被回收时,需要先释放这些资源。 
InsttoolCacheScheduler_ 
QuartzSchedulerThread Quartz         InsttoolCacheScheduler_QuartzSchedulerThread是Quartz的主线程,它主要负责实时的获取下一个时间点要触发的触发器,然后执行触发器相关联的作业 。 
         原理大致如下: 
         Spring和Quartz结合使用的场景下,Spring IOC容器初始化时会创建并初始化Quartz线程池(TreadPool),并启动它。刚启动时线程池中每个线程都处于等待状态,等待外界给他分配Runnable(持有作业对象的线程)。 
         继而接着初始化并启动Quartz的主线程(InsttoolCacheScheduler_QuartzSchedulerThread),该线程自启动后就会处于等待状态。等待外界给出工作信号之后,该主线程的run方法才实质上开始工作。run中会获取JobStore中下一次要触发的作业,拿到之后会一直等待到该作业的真正触发时间,然后将该作业包装成一个JobRunShell对象(该对象实现了Runnable接口,其实看是上面TreadPool中等待外界分配给他的Runnable),然后将刚创建的JobRunShell交给线程池,由线程池负责执行作业。 
线程池收到Runnable后,从线程池一个线程启动Runnable,反射调用JobRunShell中的run方法,run方法执行完成之后, TreadPool将该线程回收至空闲线程中。 
InsttoolCacheScheduler_Worker-2 Quartz InsttoolCacheScheduler_Worker-2线程就是ThreadPool线程的一个简单实现,它主要负责分配线程资源去执行 
InsttoolCacheScheduler_QuartzSchedulerThread线程交给它的调度任务(也就是JobRunShell)。 
JBossLifeThread Jboss         Jboss主线程启动成功,应用程序部署完毕之后将JBossLifeThread线程实例化并且start,JBossLifeThread线程启动成功之后就处于等待状态,以保持Jboss Java进程处于存活中。  所得比较通俗一点,就是Jboss启动流程执行完毕之后,为什么没有结束? 就是因为有这个线程hold主了它。 牛b吧~~ 
JBoss System Threads(1)-1 Jboss   该线程是一个socket服务,默认端口号为: 1099。 主要用于接收外部naming service(Jboss  JNDI)请求。 
JCA PoolFiller Jboss     该线程主要为JBoss内部提供连接池的托管。  简单介绍一下工作原理 : 
    Jboss内部凡是有远程连接需求的类,都需要实现ManagedConnectionFactory接口,例如需要做JDBC连接的 
XAManagedConnectionFactory对象,就实现了该接口。然后将XAManagedConnectionFactory对象,还有其它信息一起包装到InternalManagedConnectionPool对象里面,接着将InternalManagedConnectionPool交给PoolFiller对象里面的列队进行管理。   JCA PoolFiller线程会定期判断列队内是否有需要创建和管理的InternalManagedConnectionPool对象,如果有的话,则调用该对象的fillToMin方法, 触发它去创建相应的远程连接,并且将这个连接维护到它相应的连接池里面去。 
JDWP Event Helper Thread JVM            
JDWP是通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的JVMTI和JDI的通信通畅。  该线程主要负责将JDI事件映射成JVMTI信号,以达到调试过程中操作JVM的目的。   
JDWP Transport Listener: dt_socket JVM 该线程是一个Java Debugger的监听器线程,负责受理客户端的debug请求。 通常我们习惯将它的监听端口设置为8787。 
Low Memory Detector JVM 这个线程是负责对可使用内存进行检测,如果发现可用内存低,分配新的内存空间。 
process reaper JVM     该线程负责去执行一个 OS 命令行的操作。 
Reference Handler JVM         JVM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题 。 
Surrogate Locker Thread (CMS) JVM           这个线程主要用于配合CMS垃圾回收器使用,它是一个守护线程,其主要负责处理GC过程中,Java层的Reference(指软引用、弱引用等等)与jvm 内部层面的对象状态同步。 这里对它们的实现稍微做一下介绍:这里拿 WeakHashMap做例子,将一些关键点先列出来(我们后面会将这些关键点全部串起来): 
1.  我们知道HashMap用Entry[]数组来存储数据的,WeakHashMap也不例外, 内部有一个Entry[]数组。 
2.   WeakHashMap的Entry比较特殊,它的继承体系结构为Entry->WeakReference->Reference 。 
3.  Reference 里面有一个全局锁对象:Lock,它也被称为pending_lock.    注意:它是静态对象。 
4.       Reference  里面有一个静态变量:pending。 
5.  Reference  里面有一个静态内部类:ReferenceHandler的线程,它在static块里面被初始化并且启动,启动完成后处于wait状态,它在一个Lock同步锁模块中等待。 
6.  另外,WeakHashMap里面还实例化了一个ReferenceQueue列队,这个列队的作用,后面会提到。 
7.  上面关键点就介绍完毕了,下面我们把他们串起来。 
     假设,WeakHashMap对象里面已经保存了很多对象的引用。 JVM 在进行CMS GC的时候,会创建一个ConcurrentMarkSweepThread(简称CMST)线程去进行GC,ConcurrentMarkSweepThread线程被创建的同时会创建一个SurrogateLockerThread(简称SLT)线程并且启动它,SLT启动之后,处于等待阶段。CMST开始GC时,会发一个消息给SLT让它去获取Java层Reference对象的全局锁:Lock。 直到CMS GC完毕之后,JVM 会将WeakHashMap中所有被回收的对象所属的WeakReference容器对象放入到Reference 的pending属性当中(每次GC完毕之后,pending属性基本上都不会为null了),然后通知SLT释放并且notify全局锁:Lock。此时激活了ReferenceHandler线程的run方法,使其脱离wait状态,开始工作了。ReferenceHandler这个线程会将pending中的所有WeakReference对象都移动到它们各自的列队当中,比如当前这个WeakReference属于某个WeakHashMap对象,那么它就会被放入相应的ReferenceQueue列队里面(该列队是链表结构)。 当我们下次从WeakHashMap对象里面get、put数据或者调用size方法的时候,WeakHashMap就会将ReferenceQueue列队中的WeakReference依依poll出来去和Entry[]数据做比较,如果发现相同的,则说明这个Entry所保存的对象已经被GC掉了,那么将Entry[]内的Entry对象剔除掉。 
taskObjectTimerFactory JVM           顾名思义,该线程就是用来执行任务的。 当我们把一个认为交给Timer对象,并且告诉它执行时间,周期时间后,Timer就会将该任务放入任务列队,并且通知taskObjectTimerFactory线程去处理任务,taskObjectTimerFactory线程会将状态为取消的任务从任务列队中移除,如果任务是非重复执行类型的,则在执行完该任务后,将它从任务列队中移除,如果该任务是需要重复执行的,则计算出它下一次执行的时间点。 
VM Periodic Task Thread JVM         该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。 该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控,还有我们经常需要去执行一些jstat 这类命令查看gc的情况,如下: 
jstat -gcutil 23483 250 7   这个命令告诉jvm在控制台打印PID为:23483的gc情况,间隔250毫秒打印一次,一共打印7次。 
VM Thread JVM          这个线程就比较牛b了,是jvm里面的线程母体,根据hotspot源码(vmThread.hpp)里面的注释,它是一个单例的对象(最原始的线程)会产生或触发所有其他的线程,这个单个的VM线程是会被其他线程所使用来做一些VM操作(如,清扫垃圾等)。 
         在 VMThread 的结构体里有一个VMOperationQueue列队,所有的VM线程操作(vm_operation)都会被保存到这个列队当中,VMThread 本身就是一个线程,它的线程负责执行一个自轮询的loop函数(具体可以参考:VMThread.cpp里面的void VMThread::loop()) ,该loop函数从VMOperationQueue列队中按照优先级取出当前需要执行的操作对象(VM_Operation),并且调用VM_Operation->evaluate函数去执行该操作类型本身的业务逻辑。 
       ps:VM操作类型被定义在vm_operations.hpp文件内,列举几个:ThreadStop、ThreadDump、PrintThreads、GenCollectFull、GenCollectFullConcurrent、CMS_Initial_Mark、CMS_Final_Remark….. 有兴趣的同学,可以自己去查看源文件。 
(搬运自 http://blog.csdn.net/a43350860/article/details/8134234 感谢原著作者) 

2.Jmap 
2.1   得到运行java程序的内存分配的详细情况。例如实例个数,大小等 

2.2   命名行格式 
jmap [ option ] pid 
jmap [ option ] executable core 
jmap [ option ] [server-id@]remote-hostname-or-IP 

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 
-finalizerinfo 打印正等候回收的对象的信息. 
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况. 
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. 
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. 
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. 
-h | -help 打印辅助信息 
-J 传递参数给jmap启动的jvm. 

2.3   使用例子 
jmap -histo pid(查看实例) 
 

jmap -dump:format=b,file=heap.bin pid(导出内存,据说对性能有影响,小心使用) 
(format=b是通过二进制的意思,但是能不能导出文本文件我没找到,知道的告诉我) 
把内存结构全部dump到二进制文件中,通过IBM的HeapAnalyzer和eclipse的MemoryAnalyzer都可以分析内存结构。 
这个是我用HeapAnalyzer查看出的我们daily的内存结构,已经列出了可能存在的问题。(这个工具我不熟悉,只供大家参考) 
 

下面是我用eclipse 的MemoryAnalyzer查看内存结构图 
 

 
 

上面的是eclipse分析内存泄漏分析出的。这个功能点非常多。可以慢慢学习 


3.Jstat 
3.1   这是一个比较实用的一个命令,可以观察到classloader,compiler,gc相关信息。可以时时监控资源和性能 

3.2      命令格式 
-class:统计class loader行为信息 
-compile:统计编译行为信息 
-gc:统计jdk gc时heap信息 
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况 
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件 
-gcnew:统计gc时,新生代的情况 
-gcnewcapacity:统计gc时,新生代heap容量 
-gcold:统计gc时,老年区的情况 
-gcoldcapacity:统计gc时,老年区heap容量 
-gcpermcapacity:统计gc时,permanent区heap容量 
-gcutil:统计gc时,heap情况 

JBOSS gc 配置
JAVA_OPTS="-Xms768m -Xmx1536m -XX:PermSize=128m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false  -Djava.rmi.server.hostname=10.19.250.40 --XX:+PrintGCDetails -XX:+PrintGCDateStamps Xloggc:/gc.log"
3.3   输出参数内容 
S0  — Heap上的 Survivor space 0 区已使用空间的百分比 
S0C:S0当前容量的大小 
S0U:S0已经使用的大小 
S1  — Heap上的 Survivor space 1 区已使用空间的百分比 
S1C:S1当前容量的大小 
S1U:S1已经使用的大小 
E   — Heap上的 Eden space 区已使用空间的百分比 
EC:Eden space当前容量的大小 
EU:Eden space已经使用的大小 
O   — Heap上的 Old space 区已使用空间的百分比 
OC:Old space当前容量的大小 
OU:Old space已经使用的大小 
P   — Perm space 区已使用空间的百分比 
OC:Perm space当前容量的大小 
OU:Perm space已经使用的大小 
YGC — 从应用程序启动到采样时发生 Young GC 的次数 
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) 
FGC — 从应用程序启动到采样时发生 Full GC 的次数 
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) 
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC 

例子1 
 

例子2(连续5次) 
 

例子3(PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量) 
 
这个工具的参数非常多,据说基本能覆盖jprofile等收费工具的所有功能了。多用用对于系统调优还是很有帮助的 


注1:我们在daily用这样命令时,都要用-F参数的。因为我们的用户都不是启动命令的用户 
注2:daily的这些命令好像都没有配置到环境变量里面,这个是我在自己应用机器里面看到的。需要去jdk目录底下执行。Sudo当然是必须的了

 

JBOSS标准物理部署图-示例.vsd

http://wiki.cns*****.com/pages/viewpage.action?pageId=17406722

 

Wildfly 四种集群方式的配置

http://www.tuicool.com/articles/IfuQjq

wildfly四种集群方式的配置

笔者之前对wildfly的集群进行学习,现整理资料如下:

standalone集群搭建

standalone模式下的集群有以下条件:

(1) 必须使用同一配置的profile,且是ha profile;

(2) 必须设定相同的多播地址;

(3) 确保集群中的各节点在同一局域网中。

该模式下的集群集群分为同机多节点集群和多机多节点集群。

同机多节点集群

对于该方式的集群,具体的配置如下所示(以两个节点为例进行说明)。

(1) 环境搭建

    将下载的wildfly-8.0.0.Alpha4.rar解压到IP地址为10.22.4.46机器的指定文件夹,同时将文件夹下面的standalone文件夹复制一份,并将它们分别命名为standalone-node1和standalone-node2,如下所示。

   

(2)部署应用

   在这两个文件夹下都部署web.xml文件中包含<distributable/>标签的Web应用,即将对应的.war文件拷贝到两个节点对应的deployments目录下。

(3)启动服务

   分别在命令行下启动:

     节点1:

 

./standalone.bat -c standalone-ha.xml -b 10.22.4.46  -u 230.0.0.4  -Djboss.server.base.dir=../standalone-node1 -Djboss.node.name=node1  -Djboss.socket.binding.port-offset=100

 

    节点2:

 

 ./standalone.bat -c standalone-ha.xml -b 10.22.4.46  -u 230.0.0.4  -Djboss.server.base.dir=../standalone-node2 -Djboss.node.name=node2  -Djboss.socket.binding.port-offset=200

 

 注:-c 指启动时所使用的服务器配置文件

       -b 指绑定的地址

       -u 指多播地址

       -Djboss.server.base.dir 指server节点所在的位置

       -Djboss.node.name 指server节点的名字

       -Djboss.socket.binding.port-offset 指server节点运行时的端口偏移值

启动起来,若如下图,则说明该模式的同机多节点集群配置成功:

      

(4)测试集群

    访问web应用,如下所示:

     

    

至此,standalone模式的同机多节点集群配置完毕。

多机多节点集群

对于该方式的集群,具体的配置方式如下所示(以两台机器为例予以说明):

(1) 环境搭建

     下载wildfly-8.0.0.Alpha4.rar分别在两台机器(IP地址分别为10.22.4.46和192.168.7.128)上进行解压,同时将解压后文件夹下面的standalone文件夹分别命名为standalone-node1及standalone-node2,其中10.22.4.46机器为windows环境,192.168.7.128为linux环境。

(2)部署应用

    在这两个文件夹下都部署web.xml文件中包含<distributable/>标签的Web应用,即将对应的.war文件拷贝到两个节点对应的deployments目录下。

(3)启动服务

   在两台机器上分别运行下面的命令启动服务器:

   在10.22.4.46机器上启动以下命令:

 

    standalone.bat -c standalone-ha.xml -b 10.22.4.46  -u 230.0.0.4  -Djboss.server.base.dir=../standalone-node1 -Djboss.node.name=node1  -Djboss.socket.binding. port-offset=100

 

 在192.168.7.128机器上启动以下命令:

 

  ./standalone.sh -c standalone-ha.xml -b 192.168.7.128  -u 230.0.0.4  -Djboss.server.base.dir=../standalone-node2 -Djboss.node.name=node2  -Djboss.socket.binding. port-offset=400

 

  注:-c 指启动时所使用的服务器配置文件

        -b 指绑定的地址

        -u 指多播地址

        -Djboss.server.base.dir 指server节点所在的位置

        -Djboss.node.name 指server节点的名字

        -Djboss.socket.binding.port-offset 指server节点运行时的端口偏移值

(4)警告信息

    启动服务器之后,你可能会遇到如下警告:

 

17:37:56,367 WARN  [org.jgroups.protocols.UDP] (ServerService Thread Pool -- 55) [JGRP00015] 

the receive buffer of socket MulticastSocket was set to 25MB, but the OS only allocated 20.97MB. 

This might lead to performance problems. Please set your max receive buffer in the OS correctly (e.g. net.core.rmem_max on Linux)  

 

   这个警告是由于linux操作系统设置的receive buffer of scoket 过小,只需要调整os的receive buffer of scoket值大小就可以解决。

  解决办法:

     ->打开linux系统根目录/下的etc下面的配置文件:vi /etc/sysctl.conf

     ->往sysctl.conf添加如下内容:

 

net.core.rmem_max = 2097152

net.core.wmem_max = 2097152

 

其中net.core.wmem_max是发送缓冲区上限,net.core.rmem_max 是接收缓冲区上限。

    ->执行配置:sysctl -p

   解决详情请参考: WildFly配置与维护之QA:the receive buffer of socket MulticastSocket was set to 25MB, but the OS only allocated 20.97MB.

(5)测试集群

    在两台机器上分别访问,如下所示:

    

   

至此,standalone模式的多机多节点集群配置完毕。

    

domian集群搭建

domain模式下的集群有以下条件:

(1) 有且只能有一个Domain Controller;

(2) Host Controller主机上的Server节点根据Domain Controller主机上的domain.xml配置启动;

(3) 确定集群中的各节点在同一局域网中。

该模式下的集群分为同机多节点集群和多机多节点集群。

同机多节点集群

 WildFly 一个很重要的特性是Domain Mode能够从单个的控制点管理多个服务器实例,这样的一组server作为一个整体由Domain Controller进程统一管理,在同机状态下以domain模式启动时,会在系统中同时启动5个进程:

 3个server实例;一个Domain Controller(Domain控制器),这个进程用来集中控制所有属于这个“domain”的server;一个轻量的Process Controller,负责管理其他的4个进程并监听它们的生命周期。

 对于该方式的集群,具体的配置如下所示(以三个节点为例进行实验)。

(1) 环境搭建

    下载wildfly-8.0.0.Alpha4.rar并解压到指定文件夹。

(2)修改配置

    ->在domain.xml配置文件中提供了两个群组,默认情况下我们使用“main-server-group”群组。其中的profile指定我们要使用的配置文件,socket-binding-group指定我们所依赖的协议,要配置该模式下的集群环境就需要将profile

的值设定为"ha",ref的值设定为" ha-sockets ",如下所示:

 

  <server-groups>

        <server-group name=" main-server-group "  profile="ha" >

            <jvm name="default">

                <heap size="64m" max-size="512m"/>

            </jvm>

            <socket-binding-group  ref="ha-sockets" />

        </server-group> 

        <server-group name="other-server-group" profile="full-ha">

            <jvm name="default"> 

                <heap size="64m" max-size="512m"/> 

            </jvm>

            <socket-binding-group ref="full-ha-sockets"/>

        </server-group>

  </server-groups> 

 

    -> 在设定群组之后,修改host.xml文件中的<servers>片段,添加要操作集群的节点,如下所示:

 

    <servers>

        <server name=" server-one " group="main-server-group">

             <socket-bindings  port-offset="100" />

        </server>

        <server name=" server-two " group="main-server-group" auto-start="true">

             <socket-bindings  port-offset="200" />       

       </server>

        <server name=" server-three " group="main-server-group" auto-start="true">

           <socket-bindings  port-offset="300" />

        </server> 

  </servers>

 

     此处注意server-one、server-two都属于main-server-group,它们的端口偏移值分别为100、200、300,即它们对应的端口号分别为8180、8280、8380。

   

 (3)启动服务

    启动服务器,控制台显示如下:

    

  此刻启动服务器之后不会显示出集群成功的信息,通过在控制台部署web.xml文件中包含<distributable/>标签的Web应用可以查看配置结果。    
(4)部署应用   

   部署war应用步骤:

   ->添加应用:

   ->分配群组:

  

(5)访问war应用

       8180端口节点:

       

      8280端口节点:

      

     8380端口节点:

     

    都能进行访问,至此,说明domain模式的同机多节点集群配置成功。

    小结:要实现该模式下的集群需要注意以下三点:

       1)  各节点的命名不能相同

       2)  各节点必须处在同一个群组内

       3)  各节点必须有不同的端口偏移值

多机多节点集群

对于该方式的集群,具体的配置如下所示(以两台机器为例进行实验)。

(1) 环境搭建

   下载wildfly-8.0.0.Alpha4.rar并分别在两台机器(IP地址分别为10.22.4.46和192.168.7.128)上解压到指定文件夹,同时设定IP地址为10.22.4.46的机器为主控制器(master),另一机器为从机(salve)。

(2) 配置主控制器

  1)设定一个群组。打开domain.xml文件,找到其中的<server-group>标签,如下所示(这里我们选择main-server-group作为默认的群组),profile的值设定为“ha”,ref的值设定为"ha-sockets",如下所示:

 

 <server-groups>

        <server-group name="main-server-group"  profile="ha" >

            <jvm name="default">

                <heap size="64m" max-size="512m"/>

            </jvm>

            <socket-binding-group  ref="ha-sockets" />

        </server-group>

 </server-groups>

         

 

  2) 在指定的群组中增加server节点。打开host.xml文件,找到<server>标签,为不同的节点指定相同的群组,即group值设定为"main-sever-group",如下所示:

 

  <servers>

        <server name=" server-one " group=" main-server-group ">

             <socket-bindings  port-offset="100" />

        </server>

        <server name=" server-two " group= "main-server-group " auto-start="true">

             <socket-bindings  port-offset="200" />       

        </server>

        <server name=" server-three " group=" main-server-group " auto-start="true">

            <socket-bindings  port-offset="300" />

        </server>

  </servers>

 

    此处注意server-one、server-two、server-three的端口偏移值分别为100、200、300,即它们对应的端口号分别为8180、8280、8380。    

  3) 配置接口信息

     默认状况下,host.xml文件中端口配置为127.0.0.1,如下所示:

 

   <interfaces>

       <interface name="management">

            <inet-address value="${jboss.bind.address.management: 127.0.0.1 }"/>

       </interface>

       <interface name="public">

            <inet-address value="${jboss.bind.address: 127.0.0.1 }"/>

       </interface>

       <interface name="unsecured">       

          <inet-address value=" 127.0.0.1 " />    

       </interface>

</interfaces>     

 

   为了能让从机找到主控制器,需将127.0.0.1改成主控制器实际的IP,如下所示:

 

<interfaces>

       <interface name="management">

            <inet-address value="${jboss.bind.address.management:  10.22.4.46 }"/>

       </interface>

       <interface name="public">

            <inet-address value="${jboss.bind.address:  10.22.4.46 }"/>

       </interface>

       <interface name="unsecured">       

          <inet-address value=" 10.22.4.46 " />    

       </interface>

</interfaces> 

 

(3) 配置从机

   1)角色配置

     在集群中从机不再充当主控制器的角色,因此可以将自己的domain.xml文件可以删掉或重命名,只需在host.xml文件修改配置即可。将host.xml文件中的host名修改为“slave”,并将主控制器修改为之前设定的主控制器的IP地址,如下所示:

 

<host  name="slave"  xmlns="urn:jboss:domain:2.0">

    

<domain-controller>

    <remote  host="10.22.4.46"  port="9999" security-realm="ManagementRealm"/>

</domain-controller> 

 

   2) 增加服务器节点 

     在host.xml文件中增加节点信息,同时群组名必须与主控制器规定的相同,如下所示:

 

 <servers>

        <server name= "server-four"  group= "main-server-group" >

             <socket-bindings  port-offset="400" />

        </server>

        <server name= "server-five"  group= "main-server-group"  auto-start="true">

             <socket-bindings  port-offset="500" />       

        </server>

        <server name= "server-six"  group= "main-server-group"  auto-start="true">

            <socket-bindings  port-offset="600" />

        </server>

  </servers>

 

     此处注意server-four、server-five、server-six的端口偏移值分别为400、500、600,即他们对应的端口号为8480、8580、8680。   

   3) 修改接口配置

      与主控制器相同,我们也需要将host.xml文件中的接口地址修改为从机的实际IP地址,如下所示:

 

 <interfaces>

       <interface name="management">

            <inet-address value="${jboss.bind.address.management:  192.168.7.128}"/>

       </interface>

       <interface name="public">

            <inet-address value="${jboss.bind.address:  192.168.7.128 }"/>

       </interface>

       <interface name="unsecured">       

          <inet-address value=" 192.168.7.128 " />    

       </interface>

</interfaces>    

 

(4) 安全配置

     1)添加用户
    为主控制器增加管理员用户admin及slave,同时为从机添加用户slave,具体的添加用户操作可以参考本文中添加管理用户一节(笔者在添加slave用户时使用的密码是sn@12345)
     2)修改主控制器配置

        成功添加管理员用户之后,在主控制器和从机的host.xml文件中分别添加如下配置(其中c25AMTIzNDU是sn@12345的base64码值,用户可以根据实际设定的密码值进行适当的修改,相对应的base64码值在添加用户的界面上会给出)。

 

<security-realms>

     <security-realm name="ManagementRealm">

            <server-identities>

                 <secret value="c25AMTIzNDU="/>

           </server-identities>

     </security-realm>

</security-realms>       

 

    

   3)警告信息

    至此,整个domian的多机多节点集群配置结束,windows下直接运行bin下面的domain.bat命令,linux下到bin目录下执行./domain.sh即可,但是启动服务器之后,你可能会遇到如下警告:

    警告1:

 

17:37:56,367 WARN  [org.jgroups.protocols.UDP] (ServerService Thread Pool -- 55) [JGRP00015] 

the receive buffer of socket MulticastSocket was set to 25MB, but the OS only allocated 20.97MB. 

This might lead to performance problems. Please set your max receive buffer in the OS correctly (e.g. net.core.rmem_max on Linux)  

 

   这个警告是由于操作系统os 设置的receive buffer of scoket 过小,只需要调整os的receive buffer of scoket值大小就可以解决。

  解决办法:

     ->打开linux系统根目录/下的etc下面的配置文件:vi /etc/sysctl.conf

     ->往sysctl.conf添加如下内容:

 

net.core.rmem_max = 2097152

net.core.wmem_max = 2097152

 

其中net.core.wmem_max是发送缓冲区上限,net.core.rmem_max 是接收缓冲区上限。

    ->执行配置:sysctl -p

   解决详情请参考: WildFly配置与维护之QA:the receive buffer of socket MulticastSocket was set to 25MB, but the OS only allocated 20.97MB.

   警告2:

 

  ARJUNA016009: Caught:: java.lang.ClassCastException: org.infinispan.transaction. TransactionTable cannot be cast to org.infinispan.transaction.xa.XaTransaction  
at org.jboss.as.clustering.infinispan.subsystem.CacheService$InfinispanXAResourceRecovery.getXAResources(CacheService. java:112 
at com.arjuna.ats.internal.jbossatx.jta.XAResourceRecoveryHelperWrapper.getXAResources(XAResourceRecoveryHelperWrapper.java:51) [narayana-jts-integration-5.0.0.M3. jar:5.0.0.M3  (revision: ${buildNumber})] 
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.resourceInitiatedRecoveryForRecoveryHelpers(XARecoveryModule. java:503 ) [narayana-jts-jacorb-5.0.0.M3. jar:5.0.0.M3  (revision: ${buildNumber})] 
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule. java:159 ) [narayana-jts-jacorb-5.0.0.M3. jar:5.0.0.M3 (revision: ${buildNumber})] 
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery. java:743 ) [narayana-jts-jacorb-5.0.0.M3. jar:5.0.0.M3  (revision: ${buildNumber})] 
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:371 ) [narayana-jts-jacorb-5.0.0.M3. jar:5.0.0.M3  (revision: ${buildNumber})]              

 

   解决方法:

   打开主控制器的domain.xml文件找到如下配置,增加红色字段配置即可,如下所示:

<cache-container name="web" aliases="standard-session-cache" default-cache="repl" module="org.wildfly.clustering.web.infinispan"> 
<transport lock-timeout="60000"/> 
<replicated-cache name="repl" mode="ASYNC" batching="true"> 
<transaction mode="NONE"/> 
<eviction strategy="NONE"/> 
<file-store/> 
</replicated-cache> 
<replicated-cache name="sso" mode="SYNC" batching="true"/> 
<distributed-cache name="dist" l1-lifespan="0" mode="ASYNC" batching="true"> 
<file-store/> 
</distributed-cache> 
</cache-container>

  具体参考 WildFly配置与维护之QA: TransactionTable cannot be cast to org.infinispan.transaction.xa.XaTransaction

(5)测试集群

    1)启动两机服务器(先主后从)

       主机上出现如下图所示,则表示集群部署成功:

       
   2)访问主机上wildfly web控制台

      看到如下结果则表示集群部署成功:

    
    3)部署war应用

         点击“Add”添加项目,再点击“Assign",选择main-server-group,如下所示:

       

          

        4)访问应用

           待应用部署到master和slave上的各个节点上去之后,通过浏览器来访问之前部署的应用,因为笔者在主从机各个节点之间设置的偏移量间隔是100,所以访问的端口也是从第一个server节点(server-one)8180(原8080+100)一直到8680都是可以访问的(注意主控制器和从机的IP不一致,访问的URL中的IP也要按照对应的)测试结果如下:

         主控制器8180端口:

          
        

        主控制器8280端口:

         
       

        主控制器8380端口:

         
       
   
    
   注意:在没有设置linux系统的相关配置的情况下,从机上的应用是不能访问的,提示192.168.7.128连接失败。
  具体问题如下:

      在主控制器的控制台中部署好项目并且主从服务器都启动的情况下,主控制器可以访问部署的项目,但是却无法访问从机上的应用,但是同时主机和从机之间可以ping的通,网上查阅资料后,解决方法是关闭虚拟机中的防火墙服务。linux在命令行模式下启动和停止防火墙的命令如下:  
       service iptables stop --停止  
       service iptables start --启动

     根据资料介绍,笔者将linux的防火墙关闭,如下所示:

     

     将可以访问,如下所示:

      

     但是在实际应用中,关闭防火墙降低的服务器的安全性,不能关闭防火墙,因此修改防火墙设置即可,具体设置步骤如下:

      ->打开/etc/sysconfig/iptables 文件;

      ->如果要开放8680端口,在里面添加一条 (其余类似) 
            -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8680 -j ACCEPT    

      ->最终开放了8480、8580、8680端口,如下所示:

         

      ->开启防火墙,如下所示:

         

      最终能正常访问,如下:

        

     从机的8480端口:

 
       
 
   
 

    从机的8580端口:

 
     
 
   
 

   同样访问192.168.7.128:8680也是可以的。

   至此,wildfly的两种模式的四种集群方式的配置已经完成,希望能给读者带来帮助,若发现不当,欢迎您批评指正!

 
       

附录:wildfly-8.0.0.Alpha4下载地址:      http://www.wildfly.org/download/

wildfly 8.1.0 final 系统部署安装 / REHL 6.3 64位 / JDK 1.7.0.25 64位  

单台机器部署方式:

fgroup1 fsever1   启用

fgroup2 fsever2   启用

bgroup1 bsever1 未启用

bgroup2 bsever2 启用

[root@sctspreapp01 soft]# id

uid=0(root) gid=0(root) groups=0(root)

[jbossuser@sctspreapp01 soft]#yum install *wildfly*

 

[jbossuser@sctspreapp01 soft]$ id

uid=503(jbossuser) gid=503(jbossuser) groups=503(jbossuser)

[jbossuser@sctspreapp01 soft]$ mv /opt/jboss/domain/configuration/host-master.xml /opt/jboss/domain/configuration/host.xml

 

[jbossuser@sctspreapp01 soft]$ vim /opt/jboss/domain/configuration/host.xml  

(修改93,103行的false为true)

(注释112到129行的back server)

 

[jbossuser@sctspreapp01 soft]$ /opt/jboss/bin/domain.sh   (SSH前台看日志方式启动)

 

[jbossuser@sctspreapp01 soft]$ /opt/jboss/bin/start.sh    (SSH后台方式启动)

 

[jbossuser@sctspreapp01 soft]$ pkill -9 java  (停止方式)

 

http://10.27.188.108:9990/    

admin / s*****@123

 

使用chrome 浏览器

Lost connection to the server.

使用firefox 浏览器 ok

 

DataSource 配置参考 

http://wiki.cns*****.com/pages/viewpage.action?pageId=18678418

数据源配置不走控制台配置enable=true ,走配置文件domain.xml配置为true即可,此为bug

 

jboss wildfly 8.1 配置ActiveMQ 5.9 jmx问题解决

https://issues.jboss.org/browse/WFLY-794

javax.naming.NameNotFoundException: rmi://127.0.0.1:1090/jmxrmi thrown when creating MBeanServerConnection

 

jboss配置rmi

需要在 /opt/jboss/modules/system/layers/base/sun/jdk/main/module.xml 文件中加一行

<path name="com/sun/jndi/url/rmi"/>

jboss才能支持jmxrmi方式访问

 

wildfly 8.1 final 配置 jconsole / jvirualvm访问

add-user.sh 创建application user

赋权

修改配置 

jvisualvm.exe -cp:a D:\Software\jboss-client.jar

jconsole -J-Djava.class.path="D:\Software\jboss-client.jar"

 

./add-user.sh 创建管理用户

./standalone.sh -Djboss.bind.address.management=10.27.188.108

启动 jconsole 监控   

service:jmx:http-remoting-jmx://10.27.188.108:9990

 

WildFly8.1.0.Final自带分析工具Jconsole使用:remote JMX调用

https://visualvm.java.net/nonav/apidocs/137/index.html

http://wiki.cns*****.com/pages/viewpage.action?pageId=17401275

https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/index.html

https://docs.jboss.org/author/display/WFLY8/JMX+subsystem+configuration 

https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html

https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html

 

WildFly的JMX调用使用http-remoting-jmx协议,如果使用JMX监控WildFly必须调用${JBOSS_HOME}/bin/client/jboss-cli-client.jar

 

第一步

windows 调用 wildfly 8 中应用JVM消耗情况监控,首先将wildlfy 8 的jboss-cli-client.jar放入到下面地址。

C:\Program Files\Java\jdk1.8.0_45\lib\jboss-client.jar"   

第二步

wildfly8 使用/opt/jboss/bin/add-user.sh 准备添加JMX监控用户 nmon2

[jbossuser@bogon ~]$ id
uid=500(jbossuser) gid=493(jbossuser) groups=493(jbossuser) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[jbossuser@bogon ~]$ /opt/jboss/bin/add-user.sh 

What type of user do you wish to add? 
 a) Management User (mgmt-users.properties) 
 b) Application User (application-users.properties)
(a): b

Enter the details of the new user to add.
Using realm 'ApplicationRealm' as discovered from the existing property files.
Username : nmon3
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
 - The password should be different from the username
Password : 
JBAS015269: Password must have at least 8 characters!
Are you sure you want to use the password entered yes/no? yes
Re-enter Password : 
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]: 
About to add user 'nmon3' for realm 'ApplicationRealm'
Is this correct yes/no? yes
Added user 'nmon3' to file '/opt/jboss/standalone/configuration/application-users.properties'
Added user 'nmon3' to file '/opt/jboss/domain/configuration/application-users.properties'
Added user 'nmon3' with groups  to file '/opt/jboss/standalone/configuration/application-roles.properties'
Added user 'nmon3' with groups  to file '/opt/jboss/domain/configuration/application-roles.properties'
Is this new user going to be used for one AS process to connect to another AS process? 
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="bm1vbjM=" />
[jbossuser@bogon ~]$ ll /opt/
total 2582420
drwxr-xr-x. 11 jbossuser jbossuser       4096 Dec  7 09:12 jboss
-rwxr-xr-x.  1 root      root      2644380936 Dec  7 09:19 jboss20151207.tar
drwxr-xr-x.  2 jbossuser jbossuser       4096 Dec  7 09:12 logs
drwxr-xr-x.  2 root      root            4096 May 10  2012 rh

/opt/jboss/bin/add-user.sh

wildfly8_jmx_add-user.sh.png 

 

wildfly8 使用web控制台,准备将/opt/jboss/bin/add-user.sh添加的nmon2用户到 web控制台角色中  

wildfly8_application_jmxuser_added.png 

 

第三步 ,工具一,jconsole

没有设置windows 8 classpath变量的jconsole可这样调用 wildfly 8应用的 JVM监控

DOS命令行启动如下:

C:\Program Files\Java\jdk1.8.0_45\bin>jconsole -J-Djava.class.path="C:\Program Files\Java\jdk1.8.0_45\lib\jboss-client.jar;C:\Program Files\Java\jdk1.8.0_45\lib\jconsole.jar;C:\Program Files\Java\jdk1.8.0_45\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_45\lib\dt.jar"

 

wildfly8_jconsole_jmx_widnows_start.png

打开jconsole界面前,先在wildfly控制台配置好nmon2,即/opt/jboss/bin/add-user.sh已添加的用户nmon2,如下wildfly8_jconsole_jmx_jvm_conf.png 

第三步,工具二,juisualvm

没有设置windows 8 classpath变量的jvisualvm可这样调用 wildfly 8 应用的JVM监控

DOS命令如下:

C:\Program Files\Java\jdk1.8.0_45\bin>jvisualvm.exe -cp:a "C:\Program Files\Java\jdk1.8.0_45\lib\jboss-client.jar"
或
C:\>"C:\Program Files\Java\jdk1.8.0_45\bin\jvisualvm.exe" -cp:a "C:\Program Files\Java\jdk1.8.0_45\lib\jboss-client.jar"
C:\>
The launcher has determined that the parent process has a console and will reuse
 it for its own console output.
Closing the console will result in termination of the running program.
Use '--console suppress' to suppress console output.
Use '--console new' to create a separate console window.

 wildfly8_jvisualvm_jmx_widnows_start.png 

 

打开jvisualvm界面前,先在wildfly控制台配置好nmon2,即/opt/jboss/bin/add-user.sh已添加的用户nmon2,如下wildfly8_jvisualvm_jmx_jvm_conf.png

 

 

使用mod_cluster进行负载均衡初步预研

http://pengtyao.iteye.com/blog/794855

http://docs.jboss.org/mod_cluster/1.3.0/html/

http://mod-cluster.jboss.org/mod_cluster/downloads/1-3-1-Final-bin

http://docs.jboss.org/mod_cluster/1.3.0/pdf/Mod_cluster-UserGuide.pdf

 

Apache web服务器扩容 / WildFly应用服务器扩容 mod_cluster

http://wiki.cns*****.com/pages/viewpage.action?pageId=18678515 

 

WildFly-Mod_Cluster配置.docx

http://wiki.cns*****.com/pages/viewpage.action?pageId=16614107

http://wiki.cns*****.com/download/attachments/16614107/WildFly-Mod_Cluster%E9%85%8D%E7%BD%AE.docx 

 

wildfly8_domain.xml_最大文件上传10MB为100MB.png

http://dl2.iteye.com/upload/attachment/0121/1593/464bc774-b8c8-3aa5-a2be-75daaeeffe98.png 

 

jboss gc 引起的问题案例1 / jboss_verbose.gc_201610221449_金融部门.zip

问题现象:loadrunner 压测订单系统TPS性能指标,隔点时间就下将为0,还很规律,DISK小busy下,怎么这么巧,每次还必现金融推给网络,线路差不稳定,网络部tcpdump很难收集,日志更大,放弃分析,背锅1次,loadrunner 截图如下。

初步分析:

jboss JAVA CORE 分析:java logback 2分钟生成近1G,量大,减小log生成量后,CPU 90% 以上 下降为 10%左右,TPS 也增加

jboss VerboseGC 分析intervalms="1151872.408" 和 reason="card cleaning threshold reached"

问题查实:jboss机器磁盘空间/opt/jboss = 30GB,开发日志打印量过大,于是开发用java把应用log压缩成tar.gz用来省空间。

http://dl.iteye.com/topics/download/aa843a6b-e54d-3f8e-9e8e-8204c74f8748

问题出在:intervalms="1151872.408" 和 reason="card cleaning threshold reached"

<con event="collection" id="12" timestamp="Oct 22 14:49:09 2016" intervalms="1151872.408">
<time exclusiveaccessms="0.256" meanexclusiveaccessms="0.100" threads="18" lastthreadtid="0x00000000BED28000" />
<refs soft="30778" weak="29607" phantom="1949" dynamicSoftReferenceThreshold="23" maxSoftReferenceThreshold="32" />
<nursery freebytes="459565256" totalbytes="483183616" percent="95" />
<tenured freebytes="2508296" totalbytes="536870912" percent="0" >
<soa freebytes="360968" totalbytes="534723584" percent="0" />
<loa freebytes="2147328" totalbytes="2147328" percent="100" />
</tenured>
<stats tracetarget="87459327">
<traced total="81595240" mutators="77990120" helpers="3605120" percent="93" />
<cards cleaned="303" kickoff="4534268" reason="card cleaning threshold reached" />
</stats>
<con event="remembered set scan">
<stats objectsfound="839" traced="1740940" timetakenms="3.872" />
</con>
<con event="final card cleaning">
<stats cardscleaned="1463" traced="2231812" durationms="3.241" />
</con>
<gc type="global" id="14" totalid="5151" intervalms="1151879.868">
<finalization objectsqueued="125" />
<timesms mark="14.601" sweep="3.672" compact="0.000" total="18.540" />
<nursery freebytes="475979816" totalbytes="483183616" percent="98" />
<tenured freebytes="397035200" totalbytes="536870912" percent="73" >
<soa freebytes="395425472" totalbytes="535261184" percent="73" />
<loa freebytes="1609728" totalbytes="1609728" percent="100" />
</tenured>
</gc>
<nursery freebytes="475979816" totalbytes="483183616" percent="98" />
<tenured freebytes="397035200" totalbytes="536870912" percent="73" >
<soa freebytes="395425472" totalbytes="535261184" percent="73" />
<loa freebytes="1609728" totalbytes="1609728" percent="100" />
</tenured>
<refs soft="30008" weak="29335" phantom="1938" dynamicSoftReferenceThreshold="23" maxSoftReferenceThreshold="32" />
<time totalms="26.335" />
</con>
<af type="nursery" id="5138" timestamp="Oct 22 14:49:10 2016" intervalms="459.562">
<minimum requested_bytes="16" />
<time exclusiveaccessms="0.131" meanexclusiveaccessms="0.094" threads="5" lastthreadtid="0x00000000BED17F00" />
<refs soft="61939" weak="38262" phantom="1953" dynamicSoftReferenceThreshold="23" maxSoftReferenceThreshold="32" />
<nursery freebytes="0" totalbytes="483183616" percent="0" />
<tenured freebytes="396752544" totalbytes="536870912" percent="73" >
<soa freebytes="395142816" totalbytes="535261184" percent="73" />
<loa freebytes="1609728" totalbytes="1609728" percent="100" />
</tenured>
<gc type="scavenger" id="5138" totalid="5152" intervalms="459.875">
<flipped objectcount="99105" bytes="5895648" />
<tenured objectcount="384" bytes="20632" />
<scavenger tiltratio="89" />
<nursery freebytes="477198424" totalbytes="483183616" percent="98" tenureage="14" />
<tenured freebytes="396715464" totalbytes="536870912" percent="73" >
<soa freebytes="395105736" totalbytes="535261184" percent="73" />
<loa freebytes="1609728" totalbytes="1609728" percent="100" />
</tenured>
<time totalms="17.352" />
</gc>
<nursery freebytes="477196376" totalbytes="483183616" percent="98" />
<tenured freebytes="396715464" totalbytes="536870912" percent="73" >
<soa freebytes="395105736" totalbytes="535261184" percent="73" />
<loa freebytes="1609728" totalbytes="1609728" percent="100" />
</tenured>
<refs soft="29999" weak="29306" phantom="1938" dynamicSoftReferenceThreshold="23" maxSoftReferenceThreshold="32" />
<time totalms="17.789" />
</af>

http://dl2.iteye.com/upload/attachment/0121/2693/fb538065-d829-3274-838b-8303b9ccee35.png

  

http://dl2.iteye.com/upload/attachment/0121/2719/151a3ddb-fd0a-30d3-bbf8-b030b1ce1aac.png

 

 

附:

tcpdump抓包命令

tcpdump -i bond0:0/eth0 port 35100 -s0 -w /home/iptv/cms/c2.cap 

tcpdump -i bond0:0 dst 192.168.46.21 -A -vv -s 0 

Linux的抓包命令tcpdump -i eth0 -Xs 10000 -vv port 22808 -I 表示监测的设备号,-vv表示显示详细信息, -s 表示设置断行, -c 表示最多截取包数。-w表示存到文件中。如抓包tcpdump tcp port 22808 –X –vv –c 100 –s 1500 –w tcp.log   

tcpdump 的抓包保存到文件的命令参数是-w xxx.cap

抓eth1的包 

tcpdump -i eth1 -w /tmp/xxx.cap 

抓 192.168.1.123的包 

tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap 

抓192.168.1.123的80端口的包 

tcpdump -i eth1 host 192.168.1.123 and port 80 -w /tmp/xxx.cap 

抓192.168.1.123的icmp的包 

tcpdump -i eth1 host 192.168.1.123 and icmp -w /tmp/xxx.cap 

抓192.168.1.123的80端口和110和25以外的其他端口的包 

tcpdump -i eth1 host 192.168.1.123 and ! port 80 and ! port 25 and ! port 110 -w /tmp/xxx.cap 

抓vlan 1的包 

tcpdump -i eth1 port 80 and vlan 1 -w /tmp/xxx.cap 

抓pppoe的密码 

tcpdump -i eth1 pppoes -w /tmp/xxx.cap 

以100m大小分割保存文件, 超过100m另开一个文件 -C 100m 

抓10000个包后退出 -c 10000 

后台抓包, 控制台退出也不会影响: 

nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & 

 

2016111双十一GC回收频率 jboss verbosegc

http://dl2.iteye.com/upload/attachment/0121/2793/1addabe1-0c57-3363-acc0-2c465da30acd.png

 

定制版wildfly安装:SN-RedHat-Linux-wildfly-x64-8.1.0.Final-6.x86_64.rpm

安装软件 yum install  *wildfly* 

查看用户 id jbossuser

修改密码 passwd jbossuser

切换用户 su - jbossuser

前台打日志方式启动 /opt/jboss/bin/domain.sh

后台打日志方式启动 /opt/jboss/bin/start.sh

添加控制台用户     /opt/jboss/bin/add-user.sh

[jbossuser@ptsppreapp06 configuration]$ /opt/jboss/bin/add-user.sh 

添加控制台用户admin: 

What type of user do you wish to add? 
 a) Management User (mgmt-users.properties) 
 b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : admin
User 'admin' already exists and is enabled, would you like to... 
 a) Update the existing user password and roles 
 b) Disable the existing user 
 c) Type a new username
(a): a
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
 - The password should be different from the username
Password : 
JBAS152565: Password must not be equal to 'admin', this value is restricted.
Are you sure you want to use the password entered yes/no? yes
Re-enter Password : 
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]: 
Updated user 'admin' to file '/opt/jboss/domain/configuration/mgmt-users.properties'
Updated user 'admin' with groups  to file '/opt/jboss/domain/configuration/mgmt-groups.properties'
Is this new user going to be used for one AS process to connect to another AS process? 
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="YWRtaW4=" />

登陆控制台 http://10.27.216.101:9990/console/App.html , ok

 

wildfly的远程debug设置

http://wiki.cns*****.com/pages/viewpage.action?pageId=16613793

修改文件:/opt/jboss/domain/configuration/host.xml

修改内容:

  

end

  • 大小: 123.1 KB
  • 大小: 14.5 KB
  • 大小: 7 KB
  • 大小: 325.4 KB
  • 大小: 78 KB
  • 大小: 269.9 KB
  • 大小: 228.7 KB
  • 大小: 12.7 KB
  • 大小: 15.5 KB
  • 大小: 50.7 KB
  • 大小: 2.8 KB
  • 大小: 91.9 KB
  • 大小: 121.5 KB
  • 大小: 57.1 KB
  • 大小: 78.8 KB
  • 大小: 34.5 KB
  • 大小: 125.4 KB
  • 大小: 68.7 KB
分享到:
评论

相关推荐

    java.lang.NoClassDefFoundError: org/jboss/logging/

    Java编程中的`java.lang.NoClassDefFoundError: org/jboss/logging/`是一个常见的运行时错误,通常发生在尝试执行一个类时,JVM无法找到在编译时已经存在的类定义。这个错误并不意味着类在编译期间不存在,而是表明...

    Apache Jboss/Tomcat集群(手稿)

    Apache JBoss/Tomcat集群是一种高可用性和可扩展性的架构,用于处理大量并发请求和分发负载。在本文档中,我们将深入探讨如何构建这样的集群。 首先,集群的基础架构包括一个前端Apache HTTP服务器,多个后端JBoss...

    wildfly:WildFly项目的Docker映像

    docker run -p 8080:8080 -p 9990:9990 -it jboss/wildfly /opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 以域模式启动 docker run -it jboss/wildfly /opt/jboss/wildfly/bin/domain.sh -...

    wildfly9 多实例的配置实例(有说明)

    本教程将深入讲解如何在Linux环境(CentOS)下配置Wildfly9的多实例,以及使用JDK8和shell脚本来管理这些实例。 首先,确保你已经安装了CentOS操作系统,并且系统中已经部署了JDK8或更高版本。Java Development Kit...

    wildfly, 用于复制项目的Docker 映像.zip

    wildfly, 用于复制项目的Docker 映像 复制 Docker 映像这是一个示例 Dockerfile,带有 WildFly应用程序服务器 。用法以独立模式引导docker run -it jboss/wildfly在远程使用管理控制台的独立模式下启动

    JPA/JBOSS/EJB基础教程PDF资料

    综合来看,"JPA/JBOSS/EJB基础教程PDF资料"这套资源将帮助初学者理解并掌握Java企业级开发的核心技术,包括对象关系映射、组件化开发以及应用服务器的使用。通过学习EJB 3和JBoss 4.0,开发者可以了解如何在现代企业...

    Jboss-EAP-6.4配置web工程,修改根目录,修改内存,修改端口

    JBoss EAP 6.4 是一款广泛应用的企业级应用服务器,尤其适合部署Web应用程序。本文主要介绍了如何配置和管理JBoss EAP 6.4,包括安装和部署FineReport、修改服务器端口、调整内存设置以及改变Web工程的根目录。 ...

    JdonFramework-5.0_03

    and add all jar files in jboss/server/default/lib/ to it. Castor: same as above, castor-xml.jar is under the directory of this project. about struts library , recommend copy all struts libraries to ...

    wildfly安装部署文档

    随着JBoss AS的不断演进和完善,为了更好地反映其作为企业级应用平台的身份,自2014年起,JBoss AS正式更名为Wildfly。 #### 二、Wildfly的下载与安装 ##### 1. 下载Wildfly 根据题目中的部分信息,我们知道可以...

    linux系统jboss安装,供大家学习研究参考!

    例如,JBoss EAP(Enterprise Application Platform)或WildFly(JBoss的社区版)。 2. 使用`wget`命令在Linux终端下载JBoss压缩包,如:`wget ...

    JBossTools-ALL-win32-3.0.0.CR2

    9. WildFly和EAP(Enterprise Application Platform)支持:尽管这个版本可能主要面向较早的JBoss AS,但随着JBoss AS演变为WildFly和EAP,JBossTools也持续更新以支持这些现代应用服务器。 通过这个压缩包,开发者...

    ant/c3p0/jboss/mysql/slf4j各类的jar包

    各类jar包,ant-contrib.jar、c3p0-0.9.1-pre6、jboss-common-jdbc-wrapper、mysql-connector-java-5.1.18-bin、slf4j-api-1.6.1

    jboss配置入门,jboss的初级配置

    例如,在jboss3.2.3中,我们可以修改%JBOSS_HOME%/server/default/deploy/jbossweb-tomcat41.sar/META-INF/jboss-service.xml文件,以实现session sticky配置。 jboss的应用程序下载和安装 jboss的应用程序可以从...

    Linux下安装jboss

    使用`mkdir /app/jboss`创建了“/app/jboss”目录,随后通过`chown jboss /app/jboss/ -R`和`chmod 755 /app/jboss/ -R`命令分别更改了该目录的所有者为“jboss”用户,并赋予了相应的读写执行权限。 ### 二、安装...

    JBoss-config.zip_jboss

    - **JNDI命名**:在`$JBOSS_HOME/server/$PROFILE/conf/jboss-service.xml`和`$JBOSS_HOME/server/$PROFILE/deploy/jboss-service.xml`中配置JNDI命名服务。 - **数据库连接**:通过`$JBOSS_HOME/server/$PROFILE/...

    ubuntu安装jboss

    将你的Java EE应用打包成`.war`或`.ear`文件,然后将其复制到`/opt/jboss/standalone/deployments`目录下。JBoss会自动检测并部署该应用。 10. **监控和日志**: JBoss的默认管理界面可以通过访问`...

Global site tag (gtag.js) - Google Analytics