supervisor 无法使用jvm命令

supervisor 无法使用jvm命令,第1张

supervisor 无法使用jvm命令 背景

在通过systemctl启动supervisor,使用supervisor管理进程时,比如管理的是java进程。在日常排查问题时使用到jvm工具,如jstack,发现不能获取到进程信息

问题复现
    进入supervisor客户端,先查看线程信息
supervisor> status
243-kafka-broker                 RUNNING   pid 81835, uptime 0:13:39
    获取当前java进程信息,返回报错
> jstack -l 81835
81835: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
分析

出现这个错误一般有两种可能,

    使用jstack的用户不是进程启动的用户,这个可以通过sudo -u {user} jstack -l 81835 来解决
    本次问题不是这个原因

    jstack没有找到当前进程描述信息。在用户启动进程时,会在/tmp目录下保存进程信息,默认情况下在hsperfdata_{user}目录,里面保存以pid为文件名的文件。然而在hsperfdata_{user}目录下,没有发下pid为81835的文件,但是/tmp目录有个systemd-private-535e3c77103b4bff8a4f39375245eb3f-supervisord.service-xhjWOp目录,目录结构为:

/tmp
|-systemd-private-535e3c77103b4bff8a4f39375245eb3f-supervisord.service-xhjWOp
    |-tmp
        |-hsperfdata_baseuser
            |-81835

pid:81835即为我们java启动进程,这个目录需要在/tmp/hsperfdata_{user}才能被jstack命令识别这样直接原因就找到了,那么为什么会出现这种情况呢。

原因

我们使用systemctl启动supervisor,在systemctl的unit配置文件中有个PrivateTmp配置项,如果PrivateTmp=true,会在/tmp单独生成包含服务名称的目录,存放进程信息。
因为这个原因,导致jstack 无法找到进程描述信息,从而不能正常使用

解决方案

修改supervisor服务的描述文件,设置PrivateTmp=true。然后重启supervisor

    查询服务描述文件位置:
> systemctl status supervisord

● supervisord.service - Service for supervisord
   Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
   Active: active (running) since 五 2022-01-07 13:58:32 CST; 1h 10min ago
  Process: 14228 ExecStart=/opt/zms/agentshell/supervisord-start.sh start (code=exited, status=0/SUCCESS)
 Main PID: 14233 (supervisord)
   CGroup: /system.slice/supervisord.service
    修改 PrivateTmp=true重启
> systemctl daemon-reload
> systemctl restart supervisord
验证:
    查询进程文件
> ls /tmp/hsperfdata_baseuser

6331
    查询线程栈
> jstack -l 6331


2022-01-07 17:26:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.91-b14 mixed mode):

"Attach Listener" #14 daemon prio=9 os_prio=0 tid=0x00007fba0c001000 nid=0x1a0b waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"ProcessThread(sid:0 cport:2181):" #13 prio=5 os_prio=0 tid=0x00007fba3c20b000 nid=0x18f6 waiting on condition [0x00007fba2c294000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000ff826928> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.linkedBlockingQueue.take(linkedBlockingQueue.java:442)
	at org.apache.zookeeper.server.PrepRequestProcessor.run(PrepRequestProcessor.java:122)

   Locked ownable synchronizers:
	- None
...

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5702173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存