解决Arthas 端口冲突问题
这是我实操中遇到问题,记录一下。
[ERROR] The telnet port 3658 is used by process 2200792 instead of target process 3734134, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 2200792, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
分析:
根据错误信息,Arthas 的 telnet 端口 3658 已经被进程 2200792 占用,而您想要诊断的进程是 3734134。这意味着之前已经有一个 Arthas 实例在进程 2200792 上运行,并且占用了端口 3658。解决方案(按照错误提示):重启 arthas-boot,选择进程 2200792,然后运行 'stop' 命令来关闭该 Arthas 实例。或者使用 arthas-client 连接到现有的 Arthas 实例并执行停止命令。或者为新的 Arthas 实例使用不同的 telnet 端口。由于您想要诊断的进程是 3734134,而端口被另一个进程的 Arthas 占用,因此最直接的方法是先停止占用端口的 Arthas 实例(即进程 2200792 上的 Arthas),然后再对目标进程 3734134 启动 Arthas。步骤:方法一:停止现有的 Arthas 实例(针对进程 2200792)a. 连接到现有的 Arthas 实例(使用 telnet):
telnet 127.0.0.1 3658b. 在连接成功后,在 Arthas 命令行中输入:
stopc. 然后重新运行 arthas-boot.jar 并选择目标进程 3734134。方法二:使用 arthas-client 直接发送停止命令(无需交互)a. 运行:
java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"b. 然后重新运行 arthas-boot.jar 并选择目标进程 3734134。方法三:使用新端口启动(这样两个 Arthas 实例可以共存,但请注意,一个进程只能连接一个 Arthas 实例)a. 为新的 Arthas 实例指定不同的端口,例如:
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1b. 然后选择目标进程 3734134。注意:方法三使用了新的端口,因此您需要记住使用新的端口号进行连接,例如 telnet 127.0.0.1 9998。根据您的需求,如果您不需要之前进程 2200792 的 Arthas 实例,建议使用方法一或方法二停止它,然后为目标进程启动新的 Arthas。如果您希望同时监控两个进程,那么可以使用方法三,为每个进程的 Arthas 实例使用不同的端口。请根据实际情况选择合适的方法。
解决 Arthas 端口冲突问题
根据您提供的错误信息,这是一个典型的 Arthas 端口冲突问题。当前端口 3658 被进程 2200792 占用,但您想要诊断的是进程 3734134。以下是详细的解决方案:
问题分析
- 端口冲突:端口 3658 已经被进程 2200792 的 Arthas 实例占用
- 目标进程不匹配:您想诊断的是进程 3734134,但端口被另一个进程占用
解决方案
方案一:停止占用端口的 Arthas 实例(推荐)
按照错误提示的第一种方法,停止占用端口的 Arthas 实例:
# 1. 首先连接到占用端口的 Arthas 实例
java -jar arthas-boot.jar 2200792# 2. 在 Arthas 命令行中执行 stop 命令
[arthas@2200792]$ stop# 3. 然后重新连接到您想诊断的进程
java -jar arthas-boot.jar 3734134
方案二:使用客户端直接发送停止命令
按照错误提示的第二种方法,使用 arthas-client 发送停止命令:
# 直接发送停止命令到占用端口的 Arthas 实例
java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"# 然后重新连接到您想诊断的进程
java -jar arthas-boot.jar 3734134
方案三:使用不同的端口(推荐用于多进程诊断)
按照错误提示的第三种方法,为新的 Arthas 实例使用不同的端口:
# 使用不同的 telnet 端口,并禁用 HTTP 端口
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1 3734134# 或者同时指定不同的 telnet 和 HTTP 端口
java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999 3734134
方案四:查找并管理所有 Arthas 实例
如果您不确定有多少个 Arthas 实例在运行,可以使用以下命令查找:
# 查找所有使用 Arthas 端口的进程
netstat -tunlp | grep -E "(3658|8563|9998|9999)"# 或者使用 lsof 查找
lsof -i :3658
lsof -i :8563# 查找所有 Java 进程
jps -l
最佳实践建议
-
为每个进程使用不同的端口:
如果您需要同时诊断多个 Java 进程,建议为每个进程的 Arthas 实例使用不同的端口:# 进程 1 java -jar arthas-boot.jar --telnet-port 10001 --http-port 10002 进程1_ID# 进程 2 java -jar arthas-boot.jar --telnet-port 10003 --http-port 10004 进程2_ID
-
创建端口映射表:
记录每个进程使用的端口,便于管理:进程ID 进程名称 Telnet端口 HTTP端口 3734134 目标应用 10001 10002 2200792 其他应用 10003 10004 -
使用脚本管理:
创建一个简单的脚本来自动化管理 Arthas 实例:#!/bin/bash # arthas_manager.shPID=$1 TELNET_PORT=$2 HTTP_PORT=$3# 检查端口是否被占用 if lsof -i :$TELNET_PORT >/dev/null 2>&1; thenecho "端口 $TELNET_PORT 已被占用,尝试停止占用进程..."lsof -ti :$TELNET_PORT | xargs kill -9 fiif lsof -i :$HTTP_PORT >/dev/null 2>&1; thenecho "端口 $HTTP_PORT 已被占用,尝试停止占用进程..."lsof -ti :$HTTP_PORT | xargs kill -9 fi# 启动 Arthas java -jar arthas-boot.jar --telnet-port $TELNET_PORT --http-port $HTTP_PORT $PID
使用方式:
./arthas_manager.sh 3734134 10001 10002