tini启动进程的原理

什么是tini

tini 是一个小型的守护进程初始化系统,主要用于容器环境下作为 PID 为 1 的 init 进程。在 Linux 系统中,PID(进程标识符)为 1 的进程具有特殊的意义,它是系统的第一个进程,也称为 init 进程,负责创建、管理和终止其他所有进程,并且能够正确地处理和转发信号给其子进程。

在 Docker 容器中,由于容器通常会直接运行用户指定的应用程序而非一个完整的 init 系统(如 Systemd 或 Upstart),因此有时候会出现信号处理不当或者僵尸进程的问题。具体问题包括:

  1. 僵尸进程(Zombie Process):当子进程终止但父进程没有正确地调用 wait() 函数回收其资源时,子进程就会变为僵尸进程。在容器环境中,若父进程未能妥善处理这种情况,可能会导致僵尸进程堆积。

  2. 信号转发(Signal Propagation):当发送给容器的信号(例如通过 docker stop 发送的 SIGTERM)被容器内的 PID 1 进程接收到时,需要确保这些信号能够正确地传递给所有的子进程。标准 shell(如 bash 或 sh)并不总是适合作为容器的 PID 1 进程,因为它们可能无法正确处理或转发信号。

tini 的作用在于:

  • 防止僵尸进程:tini 作为 PID 1 的 init 进程,会持续监控并正确地回收其子进程,从而避免僵尸进程的产生。

  • 信号转发:tini 将接收到的任何信号透明地转发给所有子进程,确保容器内的应用程序能够及时响应操作系统发出的信号,从而允许容器能够优雅地停止、重启等。

在 Docker 容器启动命令中看到 tini -s -- 这样的形式,意味着容器首先启动 tini,-s 参数是让 tini 运行在静默模式下,不打印不必要的信息到 stdout,而 -- 则用于分隔 tini 的参数与后面要执行的实际应用程序及其参数,表明之后的所有内容都是 tini 应该启动和管理的子进程。

简单用法

常用的JDK 1.8调优参数到Dockerfile和启动命令。

# 使用官方基础镜像
FROM openjdk:8-jdk-alpine

# 设置工作目录
WORKDIR /app

# 将应用 jar 包复制到容器中
COPY app.jar /app/app.jar

# 安装 tini,用于作为容器的init进程
RUN apk add --no-cache tini && \
    chmod +x /sbin/tini

# 设置默认的Java调优参数,也可以通过环境变量覆盖
ENV JAVA_OPTS="-server \
-Xms4096m -Xmx4096m -Xmn3000m -Xss256k \
-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:+UnlockDiagnosticVMOptions -XX:+PrintGCDetails \
-XX:+PrintGCDateStamps -Xloggc:/logs/gc.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"

# 定义容器启动时执行的命令
ENTRYPOINT ["/sbin/tini", "-s", "--"]
CMD ["java", "$JAVA_OPTS", "-jar", "/app/app.jar"]

启动命令(伪脚本形式)

# 构建Docker镜像
docker build -t my-java-app .

# 启动Docker容器
docker run -d --name my-java-container \
    -v /host/logs:/logs \
    -p 9010:9010 \
    -e "JAVA_OPTS=-Xms4096m -Xmx4096m -Xmn3000m -Xss256k ..." \
    my-java-app

# 注意:环境变量JAVA_OPTS用于覆盖Dockerfile中设置的默认值

在改进后的Dockerfile和启动命令中,我们加入了以下调优参数:

  • -server:启用服务器模式,提供更好的性能优化。

  • -XX:+UseG1GC:使用G1垃圾收集器,适用于大内存场景,以较低的暂停时间为目标。

  • -XX:MaxGCPauseMillis=200:设置G1的最大停顿目标时间。

  • -XX:+UnlockDiagnosticVMOptions:解锁诊断相关的VM选项。

  • JMX监控相关参数,用于远程监控JVM性能:

    • -Dcom.sun.management.jmxremote=true
    • -Dcom.sun.management.jmxremote.port=9010
    • -Dcom.sun.management.jmxremote.authenticate=false
    • -Dcom.sun.management.jmxremote.ssl=false
  • -p 9010:9010:在启动容器时映射JMX监控端口到宿主机。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JF Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值