在通过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 ...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)