JenkinsThinPool163840

82 阅读4分钟

场景描述: 一直用jenkins发布开发环境,差不多用了一年之后,有天发版突然失败报错

构建打包的时候会产生如下的报错

Step 1/4 : FROM openjdk:11.0.14-oracle
 ---> cdaf89830c3a
Step 2/4 : ENV JAVA_OPTS "-Xmx2048M -Xms2048M -Dspring.profiles.active=db,dev -DNACOS_NAMESPACE=dev -DNACOS_ADDR=192.168.1.63:8848"
devmapper: Thin Pool has 163779 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior


Error when executing always post condition:
hudson.AbortException: script returned exit code 1
    at org.jenkinsci.plugins.workflow.steps.durable_task.DurableTaskStep$Execution.handleExit(DurableTaskStep.java:667)
    at org.jenkinsci.plugins.workflow.steps.durable_task.DurableTaskStep$Execution.check(DurableTaskStep.java:613)
    at org.jenkinsci.plugins.workflow.steps.durable_task.DurableTaskStep$Execution.run(DurableTaskStep.java:557)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
    
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

devmapper: Thin Pool has 163779 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior
使用docker info查看docker相关的配置信息

Pool Name: docker-253:2-1617832-pool
 Pool Blocksize: 65.54kB
 Base Device Size: 10.74GB
 Backing Filesystem: xfs
 Udev Sync Supported: true
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data loop file: /home/docker/devicemapper/devicemapper/data
 Metadata loop file: /home/docker/devicemapper/devicemapper/metadata
 Data Space Used: 96.56GB
 Data Space Total: 107.4GB
 Data Space Available: 10.81GB
 Metadata Space Used: 32.01MB
 Metadata Space Total: 2.147GB
 Metadata Space Available: 2.115GB
 Thin Pool Minimum Free Space: 10.74GB
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
这些参数描述了存储系统的使用情况,包括数据空间和元数据空间的信息。下面是各个参数的含义:
Data Space Used: 已经使用的数据空间大小。在这个例子中为 96.14GB。
Data Space Total: 数据空间的总大小。在这个例子中为 107.4GB。
Data Space Available: 可用的数据空间大小。即总数据空间减去已使用的数据空间。在这个例子中为 11.23GB。
Metadata Space Used: 已经使用的元数据空间大小。元数据是指用来描述数据的数据,例如文件系统中的文件和目录信息。在这个例子中为 31.45MB。
Metadata Space Total: 元数据空间的总大小。在这个例子中为 2.147GB。
Metadata Space Available: 可用的元数据空间大小。即总元数据空间减去已使用的元数据空间。在这个例子中为 2.116GB。
Thin Pool Minimum Free Space: 瘦供给池(thin pool)所需的最小空闲空间。瘦供给是一种存储管理技术,允许在分配给卷的空间少于实际使用的空间时创建卷。这个值通常是为了保证一定的可用空间,以防止存储空间被完全占用而导致系统无法正常工作。在这个例子中为 10.74GB。
解释
数据空间(Data Space):指的是实际存储用户数据的空间。
Used: 已经被用户数据占用的空间量。
Total: 存储设备上分配给用户数据的最大空间量。
Available: 当前还剩余可用于存储用户数据的空间量。
元数据空间(Metadata Space):指的是存储文件系统元数据的空间,例如文件名、文件大小、权限等信息。
Used: 已经被元数据占用的空间量。
Total: 分配给元数据的最大空间量。
Available: 当前还剩余可用于存储元数据的空间量。
瘦供给池(Thin Pool):这是一种虚拟化存储技术,允许在物理存储空间未完全分配的情况下创建逻辑卷。这意味着逻辑卷可以比实际分配的物理空间大,只有在实际写入数据时才会真正占用物理空间。
Minimum Free Space: 为了保证系统的稳定运行,需要保留的最小空闲空间量。如果低于这个值,系统可能会采取一些措施来防止数据丢失或损坏,例如禁止写入操作。

Pool Blocksize: 65.54kB 表示存储池中的块大小为 65.54 千字节 (kB)。这决定了数据如何被组织和存储在存储系统中。块大小的选择对存储性能和空间利用率有重要影响。

大概意思就是目前 发版可用的数据空间只剩下 11.23GB - 10.74GB  完全不够

临时修改方案:

// 临时方案  修改  /etc/docker/daemon.json  如果没有就建一个
    "storage-driver": "devicemapper",
    "storage-opts": [
       "dm.loopdatasize=150G"
       ]
注意  "dm.loopdatasize=150G" 大小不可超过当前目录存储空间大小




// 或者更改 修改docker.service配置文件,一般默认在/lib/systemd/system/docker.service,找不到的就find搜索吧,在ExecStart=/usr/bin/dockerd 后,加入如下参数 --storage-opt dm.basesize=10G  --storage-opt dm.loopdatasize=200G  --storage-opt dm.loopmetadatasize=5G
vim /lib/systemd/system/docker.service
  [Service]
  Type=notify
  # the default is not to use systemd for cgroups because the delegate issues still
  # exists and systemd currently does not support the cgroup feature set required
  # for containers run by docker
  ExecStart=/usr/bin/dockerd --storage-opt dm.basesize=10G --storage-opt dm.loopdatasize=200G  --storage-opt dm.loopmetadatasize=5G -H fd:// --containerd=/run/containerd/containerd.sock
  
//修改完成后重启docker
systemctl stop docker
systemctl daemon-reload
docker start docker