1 | FROM openjdk:8-jdk-alpine |
Docker Compose
基本概念
默认情况下,Compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。
默认情况下,应用程序的网络名称基于Compose的工程名称,而项目名称基于docker-compose.yml所在目录的名称。如需修改工程名称,可使用–project-name标识或COMPOSE_PORJECT_NAME环境变量。
举个例子,假如一个应用程序在名为myapp的目录中,并且docker-compose.yml如下所示:
1 | version: '2' |
Dockerfile
我们可以使用Dockfile构建一个镜像,然后直接在docker中运行。Dockerfile文件为一个文本文件,里面包含构建镜像所需的所有的命令,首先我们来认识一下Dockerfile文件中几个重要的指令。
docker 重要命令
安装Docker
频繁上下文切换
上下文切换会消耗CPU的时间,并导致进程真正运行的时间缩短,从而成为系统性能下降的一个因素。过多的上下文切换可能会使得CPU花费过多的时间用于保存和恢复寄存器、内核栈以及虚拟内存等数据,从而影响系统的响应速度和吞吐量。
vmstat是一个非常有用的系统性能分析工具,它可以提供关于系统内存、CPU活动、分页和上下文切换等信息。
在使用vmstat查看上下文切换情况时,可以显示以下统计信息:
Pasted image 20230724142209
频繁GC问题
通过使用jstat工具的-gc选项,我们可以观察GC的分代变化情况,以便确定GC是否过于频繁。具体来说,我们可以使用以下命令来观察进程的GC情况:
1 | jstat -gc <pid> 1000 |
在上述命令中,<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);"><pid></font>
是目标Java进程的PID,而<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">1000</font>
表示采样间隔(以毫秒为单位)。通过这个命令,我们可以获取关于Survivor区、Eden区、老年代(Old Generation)、元数据区(Metaspace)的容量和使用量信息,以及关于Young GC和Full GC的耗时和次数以及总耗时信息。
Cpu使用率飙升如何排查?
06 实例调优篇
05 分析GC日志
1 GC 分类(概念)
概念分类
针对 HotSpot VM 的实现,它里面的 GC 按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)
- 部分收集(Partial GC):不是完整收集整个 Java 堆的垃圾收集。其中又分为:
- 新生代收集(Minor GC / Young GC):只是新生代(Eden / S0, S1)的垃圾收集
- 老年代收集(Major GC / Old GC):只是老年代的垃圾收集。目前,只有 CMS GC 会有单独收集老年代的行为。注意,很多时候 Major GC 会和 Full GC 混淆使用,需要具体分辨是老年代回收还是整堆回收。
- 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前,只有 G1 GC 会有这种行为
- 整堆收集(Full GC):收集整个 java 堆和方法区的垃圾收集。