s
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
/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` PID=`ps -ef | grep java | grep Standalone |awk -F ' ' '{print $2}'` 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 if [ "x$PID" = "x" ];then ## 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 & else echo "Standalone is already running..." exit 1 fi f
Wildfly 8.0 版本压测异常,Wildfly 8.1 版本压测无异常,web container 自适应。商品详细场景环境压测
1、jboss的task-io的web container线程池默认为15,数据源的连接池配置Min Pool Size 为20,Max Pool Size为200.压测过程中监测数据源的连接池最多使用为17。
可以修改apache的/opt/apache/conf/mod_cluster.conf文件
添加参数
LBstatusRecalTime 1
即可消除CPU锯齿抖动问题
<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>
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进制]
即:
- jstack 21125|grep -A 10 52f1
-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。
结果:
- "http-8081-11" daemon prio=10 tid=0x00002aab049a1800 nid=0x52bb in Object.wait() [0x0000000042c75000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- at java.lang.Object.wait(Object.java:485)
- 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
(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
警告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 使用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
修改内容:
Standalone:8080
mock-battle-schedule.war
end