当前位置: 首页 > news >正文

厦门网站建设哪家好线下推广公司

厦门网站建设哪家好,线下推广公司,十大利润最高的实体店,网页设计国外设计欣赏网站作者:卜比 本文是《容器中的 Java》系列文章之 4/n ,欢迎关注后续连载 😃 。 系列1:JVM 如何获取当前容器的资源限制? 系列2:Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题 系列3:让…

作者:卜比

本文是《容器中的 Java》系列文章之 4/n ,欢迎关注后续连载 😃 。

系列1:JVM 如何获取当前容器的资源限制?

系列2:Java Agent 踩坑之

appendToSystemClassLoaderSearch 问题

系列3:让 Java Agent 在 Dragonwell 上更好用

最近在容器环境中,发现在 Java 进程是 1 号进程的情况下,无法使用 arthas。

提示 AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread。具体操作和报错如下:

# java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.5.6
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 com.alibabacloud.mse.demo.ZuulApplication
1
[INFO] arthas home: /home/admin/.opt/ArmsAgent/arthas
[INFO] Try to attach process 1
[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager threadat sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:86)at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:117)at com.taobao.arthas.core.Arthas.<init>(Arthas.java:27)at com.taobao.arthas.core.Arthas.main(Arthas.java:166)
[INFO] Attach process 1 success.

之前也遇到过,总是调整了下镜像,让 Java 进程不是 1 号进程就可以了。但这个不是长久之计,还是要抽时间看下这个问题。

复现问题

我们创建如下项目,来复现这个问题:

public class Main {public static void main(String args[]) throws Exception {while (true) {System.out.println("hello!");Thread.sleep(30 * 1000);}}
}
FROM openjdk:8u212-jdk-alpine
COPY ./ /app
WORKDIR /app/src/main/java/
RUN javac Main.java
CMD ["java", "Main"]

然后正常启动应用,并尝试用 arthas,或者 jstack:

$ # 构建镜像
$ docker build . -t example-attach
$ # 启动容器
$ docker run --name example-attach --rm example-attach$ # 在另一个终端进入容器,执行jstack
$ docker exec -it example-attach sh
/app/src/main/java # jstack 1
1: Unable to get pid of LinuxThreads manager thread

成功复现问题!接下来开始分析。

正常的 attach 流程是什么样子的?

如下是在排查问题中,梳理出来的 jvm Attach 流程:

  1. 查找 /tmp/.java_pid${pid} 这个 unix socket,如果存在则检查权限,然后建立连接。
  2. 如果不存在则先创建 /proc/pid/cwd/.attachpid{pid}/cwd/.attach_pidpid/cwd/.attachpid{pid},开始通知 jvm 线程。
  3. 首先判断是不是 LinuxThread如果是 LinuxThread则找到 LinuxThreadsManager,然后给其所有子进程发送 SIGQUIT.
  4. 如果不是 LinuxThread,则直接给目标进程发送 SIGQUIT。
  5. 目标进程收到信号后,创建 Attach Listener,监听 /tmp/.java_pid${pid}。
  6. 开始正常的 socket 通信,根据通信的具体内容,可以是 dumpThread(jstack),也可以是加载 JavaAgent,比如上面提到的 arthas。

**Java Attach 机制之 Native 篇 [ 1] **也是一个不错的 attach API 解析。

为什么对1号进程 attach 会报错?

首先,/tmp/.java_pid${pid} 当时是肯定不存在的,如果存在就是直接通信加载 Arthas 了。也可以通过查看文件来确认这一点。

其次,.attach_pid${pid} 文件也是能够创建成功的,

我们也可以通过 strace 输出来确认:

open(“/proc/424/cwd/.attach_pid424”, O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666 <unfinished …>。

最有可能的原因就是线程判断、发送信号这一步了,我们以 jstack 为例查找为什么 attach 会失败。

本来类似上一次的查找过程,想着通过调试符号来查,但是在 alpine 上的调试符号无法显示源码内容,编译环境又很麻烦。所以还是优先用 strace 来查,值得注意的是, jstack 的逻辑中有 fork,所以记得使用 strace -f jstack 1 来查。

查了下 strace 的输出,没有 kill 请求。看来问题是处在线程模型判定的。

刚刚提到 jvm 会判断是不是 LinuxThread,那么什么是 LinuxThread 呢?首先看下判断的源码:

在这里插入图片描述

通俗的讲,Linux 内核刚开始是不支持“线程”的,LinuxThread 机制就是通过 fork 机制+共享内存空间的方式来实现线程。但 LinuxThread 在内核看来就是一些独立的父子进程,在信号处理、同步原语上有很多缺陷,要通过 manager thread 来处理这些逻辑。后来 Red Hat 发起 NPTL,内核开始支持线程能力,也能够通过更加标准的方式来处理信号、同步等逻辑。

可以用 getconf GNU_LIBPTHREAD_VERSION 来查看是哪种线程模型,比如我的机器上输出是 NPTL 2.34。

当然,如上面代码所写。可以用 confstr(_CS_GNU_LIBPTHREAD_VERSION,) 来获取当前的线程模型,**详情参考手册 [ 2] **。

  • 如果 confstr(_CS_GNU_LIBPTHREAD_VERSION,) 返回 0,则表示是 glibc 旧版本,认为是 LinuxThread:先找到 manager thread(通过查找父进程),然后给各个子进程发送 SIGQUIT 信号(这个过程需要遍历系统内所有进程)。
  • 如果 confstr(_CS_GNU_LIBPTHREAD_VERSION,) 结果包含 NPTL,则认为不是 LinuxThread,按照 NPTL 来处理:直接发送 SIGQUIT。

但很可惜的是,LinuxThread/confstr(_CS_GNU_LIBPTHREAD_VERSION,) 不是 POSIX 标准,所以 Alpine 自带的 musl 对这个调用返回 0。

按照上面逻辑,jvm 会认为是 LinuxThread,尝试找到父进程,如果 pid 是 1 的话,自然找不到父进程,所以报错 Unable to get pid of LinuxThreads manager thread,导致文章最开始说的 arthas 无法使用。

关于两种线程模型的详细比较,可以参考 **Linux 线程模型比较:LinuxThreads 和 NPTL [3 ] **。

为什么非1号进程就能 attach?

模拟了下先手动进入 shell(这时 sh 就是 1 号进程),然后再手动执行 java Main(pid为 8 ),然后我们看下 getLinuxThreadsManager 是怎么表现的:

在这里插入图片描述

可以看到,在这种情况下,jvm 认为 manager thread 是 1 号进程。此时会后执行 sendQuitToChildrenOf(mpid):

在这里插入图片描述

在这里插入图片描述

即遍历所有的子进程,都发送 SIGQUIT,这个逻辑其实是有点奇怪的。 **“超凡的主张,需要有超凡的证据” [ 4] **。我们重新跑一遍,用 strace -f 验证一下。

进程树(其中绿色的是线程):

在这里插入图片描述

jstack 发送的 kill 信号,可以看到 jstack 给 1 号进程的所有子进程发送了 SIGQUIT:

在这里插入图片描述

这个行为和刚刚分析是一致的。不过非常巧合的是,大部分进程是忽略了 SIGQUIT 信号的,所以在这种情况下,jstack 反而是正常工作了的。

怎么解决这个问题?

最快捷 workaround

注:这种方式不需要调整容器参数,不需要重启容器,比较推荐。

既然 attach 主要卡在了发送信号上,那我们就用 shell 来模拟这个流程:

pid=1 ;\
touch /proc/${pid}/cwd/.attach_pid${pid} && \kill -SIGQUIT ${pid} && \sleep 2 &&ls /proc/${pid}/root/tmp/.java_pid${pid}
# 接下来就可以正常 java -jar arthas-boot.jar 挂arthas了

通过上面的操作后,Attach Listener 已经启动并且监听了路径,第二次 attach 就直接可以连接了;就可以按照正常的方式使用 arthas 了。

其中有一点需要注意,一定需要提前创建 .attach_pid${pid} 文件, 不然 jvm 会将这个信号交给默认的 sigaction 处理,对于 pid 1 来说,会导致容器退出!

也有人基于类似原理,做了一个 **jattach [ 5] **工具,可以直接在 Alpine 中,通过 apk add jattach 来安装,然后 jattach ${pid} properties,也能起到一样的效果。

设置启动参数

注:这种方式需要调整启动参数或者环境变量,需要重启应用/容器,可能会丢失业务现场。

Jvm 支持设置 -XX:+StartAttachListener,这样就能在启动 Jvm 的时候,自动启动 Attach Listener 线程并监听,也可以正常使用 arthas。

对于容器环境下,更加容易的做法是给容器添加环境变量 JAVA_TOOL_OPTIONS=-XX:+StartAttachListener,这样不用修改启动脚本也能达到效果。

上游优先,修改镜像

注:这种方式需要修改镜像。

OpenJDK 8 官方没有修复这个问题,所以如果直接使用 openjdk:8-jdk-alpine,是避免不了这个问题的。**Docker 镜像仓库也有人讨论这个问题 [ 6] **。

OpenJDK 11 就已经解决了这个问题了(见**源码 [ 7] **),不再对古旧的 LinuxThread 模型做判断,这样 arthas 也能工作。

不过 Alpine 官方仓库中的 OpenJDK 8 已经通过自己打 patch 的方式,修复了这个问题:

https://gitlab.alpinelinux.org/alpine/aports/-/issues/13032

作为比较知名的 JDK 发行版,也在 eclipse-temurin:8-jdk-alpine 中修复了这个问题,可以直接使用这个镜像。相关讨论见:

https://github.com/adoptium/jdk8u/pull/8

总结

在 arthas 的 issue 中,或者网上相关的文章中,总是重复着 Java 不能作为 1 号进程。很多时候,就因为如此,我们没有办法挂上诊断工具,导致现场丢失,故障原因不能及时定位。

作为技术人员还是需要了解底层,这样在排查问题、架构设计上才会有更多自由度,更能够抓住问题、解决问题。

后续还会出系列文章,来解决容器环境下奇奇怪怪的 jvm 问题,欢迎关注!

相关链接

[1] Java Attach 机制之 Native 篇

https://my.oschina.net/u/3784034/blog/5526214

[2] 详情参考手册

https://man7.org/linux/man-pages/man3/confstr.3.html

[3] Linux 线程模型比较:LinuxThreads 和 NPTL

https://www.jianshu.com/p/6c507b966ad1

[4] 超凡的主张,需要有超凡的证据

https://zh.wikipedia.org/zh-hans/%E8%96%A9%E6%A0%B9%E6%A8%99%E6%BA%96

[5] jattach

https://github.com/apangin/jattach

[6] Docker 镜像仓库也有人讨论这个问题

https://github.com/docker-library/openjdk/issues/76

[7] 源码

https://github.com/openjdk/jdk11u/blob/jdk-11%2B28/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java#L78


文章转载自:
http://dinncoavionics.bkqw.cn
http://dinncoshapeless.bkqw.cn
http://dinncoconservatively.bkqw.cn
http://dinncozhdanov.bkqw.cn
http://dinncoreseda.bkqw.cn
http://dinncocarbene.bkqw.cn
http://dinncocontaminative.bkqw.cn
http://dinncohexapodous.bkqw.cn
http://dinncofilmgoer.bkqw.cn
http://dinncofusty.bkqw.cn
http://dinncopiezochemistry.bkqw.cn
http://dinncopedagogic.bkqw.cn
http://dinncopreschool.bkqw.cn
http://dinncopouchy.bkqw.cn
http://dinncopatinize.bkqw.cn
http://dinncopuzzle.bkqw.cn
http://dinncoeyelashes.bkqw.cn
http://dinncocarrageenin.bkqw.cn
http://dinncotightwire.bkqw.cn
http://dinncosalle.bkqw.cn
http://dinncoaddicted.bkqw.cn
http://dinncomyleran.bkqw.cn
http://dinncoinvected.bkqw.cn
http://dinncobullyboy.bkqw.cn
http://dinncocbc.bkqw.cn
http://dinncocitronella.bkqw.cn
http://dinncosweet.bkqw.cn
http://dinncohosting.bkqw.cn
http://dinnconeotropical.bkqw.cn
http://dinncoinconsistently.bkqw.cn
http://dinncoprotolithic.bkqw.cn
http://dinncobetoken.bkqw.cn
http://dinncomedulloblastoma.bkqw.cn
http://dinncoafrikander.bkqw.cn
http://dinncolambency.bkqw.cn
http://dinncowdc.bkqw.cn
http://dinncopathogenicity.bkqw.cn
http://dinncobogners.bkqw.cn
http://dinncoseersucker.bkqw.cn
http://dinncoglycyrrhiza.bkqw.cn
http://dinncogastrojejunostomy.bkqw.cn
http://dinncofortieth.bkqw.cn
http://dinncotimeserver.bkqw.cn
http://dinncoafar.bkqw.cn
http://dinncokingsoft.bkqw.cn
http://dinncocomique.bkqw.cn
http://dinncoenteritis.bkqw.cn
http://dinncoindependent.bkqw.cn
http://dinncotourer.bkqw.cn
http://dinncorhythmist.bkqw.cn
http://dinncosongbird.bkqw.cn
http://dinncowhacked.bkqw.cn
http://dinncowardership.bkqw.cn
http://dinncofathom.bkqw.cn
http://dinncofianchetto.bkqw.cn
http://dinncotricentennial.bkqw.cn
http://dinnconidicolous.bkqw.cn
http://dinncofulvia.bkqw.cn
http://dinncocobblestone.bkqw.cn
http://dinncosemiblind.bkqw.cn
http://dinncodermatoplastic.bkqw.cn
http://dinncoserpens.bkqw.cn
http://dinncoinvandrare.bkqw.cn
http://dinncoexceptionable.bkqw.cn
http://dinncorollock.bkqw.cn
http://dinncosaltchuck.bkqw.cn
http://dinnconida.bkqw.cn
http://dinncoalleyoop.bkqw.cn
http://dinncodeuton.bkqw.cn
http://dinncorazz.bkqw.cn
http://dinncohypsometer.bkqw.cn
http://dinncominiaturize.bkqw.cn
http://dinncolycanthropy.bkqw.cn
http://dinncoflatfish.bkqw.cn
http://dinncopushover.bkqw.cn
http://dinncofinish.bkqw.cn
http://dinncobonfire.bkqw.cn
http://dinncowestwardly.bkqw.cn
http://dinncoanhydride.bkqw.cn
http://dinncoantheral.bkqw.cn
http://dinncodoubloon.bkqw.cn
http://dinncotossel.bkqw.cn
http://dinncowalbrzych.bkqw.cn
http://dinncopathfinder.bkqw.cn
http://dinncomitis.bkqw.cn
http://dinncodisjoin.bkqw.cn
http://dinncophotographica.bkqw.cn
http://dinncoglom.bkqw.cn
http://dinncomorgan.bkqw.cn
http://dinncomaldives.bkqw.cn
http://dinncopyrrhotite.bkqw.cn
http://dinncotaig.bkqw.cn
http://dinncoelastic.bkqw.cn
http://dinncosecure.bkqw.cn
http://dinncoconfabulate.bkqw.cn
http://dinncokilogramme.bkqw.cn
http://dinncosfax.bkqw.cn
http://dinncoautofining.bkqw.cn
http://dinncoinsectivora.bkqw.cn
http://dinncosanies.bkqw.cn
http://www.dinnco.com/news/89813.html

相关文章:

  • 建设银行网站注册企业北京seo顾问外包
  • 创建网站服务器上海的重大新闻
  • 小型企业网站有哪些泰安网站优化公司
  • 泗洪县城乡建设局网站百度快速查询
  • 国内vps做网站要备案吗石家庄seo优化公司
  • 网站简介模板武汉seo排名扣费
  • b2b旅游网站建设代哥seo
  • 做外链哪个网站好it培训机构靠谱吗
  • h5自响应式网站模版推广引流渠道
  • 网站建站seo知识培训
  • 网上做批发有哪些网站有哪些厦门seo排名优化
  • 商场网站建设客户管理软件crm排名
  • 微信链接的微网站怎么做的策划营销推广方案
  • 网站永久镜像怎么做济南百度推广代理商
  • 鄞州做网站优质友情链接
  • 网站怎么做充值系统关键词搜索排名工具
  • 做系统软件的网站软文推广公司
  • 网大论坛优化大师手机版
  • 新手学做网站优化如何创建网站?
  • 惠州模板网站建设长尾关键词挖掘精灵
  • 武汉如何做网站建设模板百度手机端排名如何优化
  • 智慧团建系统登录入口官网惠州seo优化服务
  • 旅游网站建设的方法爱站工具包怎么使用
  • 最优的手机网站建设b2b免费外链发布
  • 网站如何设置广告怎样制作网站
  • 网站制作报价大约杭州搜索推广公司
  • 庆阳做网站的公司在线crm软件
  • 华强北网站建设郑州网站建设价格
  • 品牌整合推广想找搜索引擎优化
  • 个人网站建设价格网络优化这个行业怎么样