我想使用JConsole来监视我的Websphere应用程序,但我不知道如何启用JMX.
我的具体问题与JDK 1.6中使用的JMX有关:如果我使用JRE 1.6运行Java进程
com.sun.management.jmxremote
Run Code Online (Sandbox Code Playgroud)
在命令行中,Java是否为远程JMX连接选择了一个默认端口?
背景故事:我目前正在尝试开发一个程序,让客户能够通过JMX从远程机器连接到我们的一个进程.目标是实现对实时显示控制台上发生的情况的远程调试.由于他们的服务级别协议,他们强烈有动力捕获尽可能多的数据,如果情况看起来太复杂,无法快速修复,重新启动显示控制台并允许它重新连接到服务器端.
我知道我可以在JDK 1.6进程上运行jconsole,在JDK 1.6.7进程上运行jvisualvm,同时可以访问控制台.但是,由于操作要求和涉及的人员问题,我们强烈要求远程获取我们需要的数据并重新启动和运行.
编辑:我知道命令行端口属性
com.sun.management.jmxremote.port=portNum
Run Code Online (Sandbox Code Playgroud)
我想回答的问题是,如果你没有在命令行设置该属性,Java是否会选择另一个端口进行远程监控?如果是这样,你怎么能确定它可能是什么?
我在寻找:
我知道spring会自动暴露JMX bean.我能够使用VisualVM在本地访问它.
但是在prod上如何使用它的JMX bean远程连接到应用程序?是否有默认端口或我应该另外定义任何东西?
谢谢,雷.
对于特定的Java代码段,我想测量:
我是一个相对Java的新手,并不熟悉如何实现这一点.我已经被提到了JMX,但是我不确定如何使用JMX,JMX看起来有点"沉重",我正在寻找的东西.
理想情况下,我想要一些可以告诉我想要测量的测量类,可以选择start()
在代码段之前调用方法,然后调用stop()
方法.相关指标将记录到我指定的文件中.
例如:
import com.example.metricLogger;
metricLogger logger = new metricLogger();
logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);
logger.start();
/* Code to be measured */
logger.stop();
Run Code Online (Sandbox Code Playgroud)
在Java中是否有任何标准/通用/传统方式来实现这一目标?
这种测量用于一次性性能比较,因此我不会寻找任何生产中的长期监测过程.
我很高兴被引用到教程或外部示例,并且不希望在这里得到完整答案.也就是说,如果能够实现上述任何简单的事情,那么一个现实的例子就会非常好.
我们在连接到在Amazon的EC2集群中运行的Java应用程序时遇到问题.我们肯定允许"JMX端口"(通常是RMI注册表端口)和服务器端口(完成大部分工作)到相关实例的安全组.Jconsole连接但似乎挂起并且从不显示任何信息.
我们正在运行我们的java,如下所示:
java -server -jar foo.jar other parameters here > java.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我们尝试过:
jconsole
在ssh上使用remote-X11在实例上运行,它可以连接并显示信息.因此JRE 是本地出口的.tcpdump
以确保交通不会到其他端口.java -version
输出:
OpenJDK Runtime Environment (IcedTea6 1.11.5) (amazon-53.1.11.5.47.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我们使用的是我的简单的JMX包,它允许我们设置两个 RMI注册表和服务器端口,一般是通过RMI注册表半随机选择的.您还可以使用以下JMX URI强制执行此操作:
service:jmx:rmi://localhost:" + serverPort + "/jndi/rmi://:" + registryPort + "/jmxrmi"
Run Code Online (Sandbox Code Playgroud)
这些天我们为服务器和注册表使用相同的端口.在过去,我们使用X
注册表端口和X+1
服务器端口来简化安全组规则.您连接到注册表端口jconsole
或您正在使用的任何JMX客户端.
我想从java代码计算OS的CPU使用百分比.
unix
的命令[例如,使用mpstat
,/proc/stat
等...]和使用Runtime.getRuntime().exec
但我不想使用系统调用.
我试过了 ManagementFactory.getOperatingSystemMXBean()
OperatingSystemMXBean osBean =
(OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println(osBean.getSystemLoadAverage());
Run Code Online (Sandbox Code Playgroud)
但它给出了cpu加载但不是cpu使用.反正有没有找到使用百分比?
我正在尝试远程监视在docker中运行的JVM.配置如下所示:
机器1:在ubuntu机器上的docker中运行JVM(在我的例子中,运行kafka); 本机的IP是10.0.1.201; 在docker中运行的应用程序是172.17.0.85.
机器2:运行JMX监控
请注意,当我从机器2运行JMX监视时,它会因以下错误的版本而失败(注意:当我运行jconsole,jvisualvm,jmxtrans和node-jmx/npm:jmx时会出现相同的错误):
失败时的堆栈跟踪对于每个JMX监视工具看起来类似于以下内容:
java.rmi.ConnectException: Connection refused to host: 172.17.0.85; nested exception is
java.net.ConnectException: Operation timed out
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
(followed by a large stack trace)
Run Code Online (Sandbox Code Playgroud)
现在有趣的是,当我在运行docker(上面的机器1)的同一台机器上运行相同的工具(jconsole,jvisualvm,jmxtrans和node-jmx/npm:jmx)时,JMX监控正常工作.
我认为这表明我的JMX端口处于活动状态且工作正常,但是当我远程执行JMX监视时(从机器2),它看起来像JMX工具无法识别内部docker IP(172.17.0.85)
下面是机器1上JMX监控工作的相关(我认为)网络配置元素(注意docker ip,172.17.42.1):
docker0 Link encap:Ethernet HWaddr ...
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr:... Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6787941 errors:0 dropped:0 overruns:0 frame:0
TX packets:4875190 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1907319636 (1.9 GB) TX bytes:639691630 (639.6 MB)
wlan0 Link encap:Ethernet HWaddr ...
inet addr:10.0.1.201 …
Run Code Online (Sandbox Code Playgroud) 我们在Sun VM 1.5.0_06-b05上运行的Tomcat 5.5.17上部署的Web应用程序出现了一些减速,我们的托管公司没有提供足够的数据来查找问题.
我们正在考虑在生产服务器上安装lambda探针,但它需要启用JMX(com.sun.management.jmxremote)以获取内存和CPU统计信息.
启用JMX会导致严重的性能损失吗?
如果我们启用JMX,我们是否会打开任何安全漏洞?如果我们只启用对JMX的本地访问,是否需要设置安全身份验证?
是否有人使用相同的(tomcat + lambda探针)没有生产问题?
看看答案似乎单独启用JMX不会给VM带来很大的开销.如果附加到VM的监视应用程序(无论是JConsole,lambda探测器还是其他任何程序)都过度投入,则可能会产生额外的工作.
如果我能看到JAVA OPTS参数,我相信我能搞清楚.我想使用Jconsole监视一个hornetq服务器,所以我需要端口号.
我记得在我连接它的时候使用了一些像java grep等命令.
jmx ×10
java ×9
jconsole ×3
java-ee ×2
performance ×2
amazon-ec2 ×1
docker ×1
jboss ×1
jmxtrans ×1
jvisualvm ×1
measurement ×1
monitoring ×1
security ×1
spring ×1
spring-boot ×1
tomcat ×1
websphere ×1