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

git repack多包使用及相关性能测试

1、git数据结构

git 中存在四种数据结构,即object包含四种,分别是tree对象、blob对象、commit对象、tag对象

1.1 blob对象

存储文件内容,内容是二进制的形式,通过SHA-1算法对文件内容和头信息进行计算得到key(文件名)。
如果一个commitId为73c17abe44977ee82cd949f489996c2715335119,则这个blob文件在.git/objects/73文件夹下,名为c17abe44977ee82cd949f489996c2715335119,也就是说hash值的前两位为objects目录下子目录的名字,剩余38位为文件名。

1.2 tree对象

可以看作一个目录,管理一些“tree”对象或是“blob”对象。它有一串指向“blob”对象或是其它“tree”对象的指针,一般用来表示内容之间的目录层次关系(就像文件和子目录)

1.3 commit对象:

commit对象指向一个“tree对象”,并且带有相关的描述信息,标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交的指针等

commit、tree、blob关系可以总结如下:
一个commit对应一个tree对应多个blob
在这里插入图片描述

1.4 tag对象:

一个tag对象包括一个对象名(SHA1签名)、对象类型、标签名、标签创建人的名字(“tagger”), 还有一条可能包含有签名(signature)的消息。
通过

总结

git每次提交存储的都是整个文件,而不是采用增量,所以会导致存储数据量很大,git针对此采用了zlib对数据进行压缩,可以采用cat-file命令来查看

一旦将内容存储在了对象数据库中,那么可以通过 cat-file 命令从 Git 那里取回数据。 为 cat-file 指定 -p 选项可指示该命令自动判断内容的类型,并为我们显示大致的内容:
在这里插入图片描述

2、git pack

git向仓库中推送文件时存储使用的是“松散文件”,如果有一个1.txt现在是10k,下次推送增加了0.1k,也就是说现在是10.1k,name第二个版本就会重新产生一个1.1k的文件,这样会产生磁盘浪费,所以git会将这些文件打包成一个二进制类型的包文件(packfile),并生成对应的.idx索引文件,以节省空间和提升效率。这些被打包的文件存储在.git/objects/pack目录下,执行find .git/objects/ -type f命令如下
在这里插入图片描述
看到.git/objects目录下的文件详情,包含了8个松散文件、一个pack文件、一个idx文件,如果想查看更详细的内容可以执行
git count-objects -v命令
在这里插入图片描述
git count-objects -v命令结果的各个含义如下:

  • count: 松散对象数
  • size:松散对象占用的磁盘空间,单位为KB
  • in-pack:在pack文件中的objects数量
  • size-pack:pack文件占用的空间,单位为KB
  • prune-packable:同时在松散对象和packs文件中都包含的objects数量,这种objects可以执行git prune-packed命令修剪
  • garbage:对象数据库中既不是有效松散对象也不是有效包的文件数
  • size-garbage:垃圾文件占用的磁盘空间,单位为KB

3、git repack

3.1 repack作用

用于将当前不驻留在“pack”中的所有对象合并到包中。它还可用于将现有包重新组织为一个更高效的包。pack文件是单独压缩的对象的集合,应用了增量压缩,存储在单个文件中,并具有关联的索引文件。而且pack文件用于减少镜像系统、备份引擎、磁盘存储等上的负载。

3.2 单包与多包

3.2.1 单包

在重新打包时repack会有一些options可供选择,如-d, -A,如果加上了-A,则重新打包时就会将新的松散文件与之前的pack共同打包成一个pack。

在单包时通常会将加上--write-bitmap-index来生成.bitmap文件(bitmap文件存储有关包文件或多包索引(MIDX)中对象集的可达性信息),此option会覆盖repack.writeBitmaps值,当然如果不指定此option,也可通过命令git config --global repack.writeBitmaps true,然后通过git config -l查看是否成功设置此option。需要注意的是--write-bitmap-index option只在单包时才会生效,也就是说只在与-a、-A或-m一起使用时有意义,因为位图必须能够引用所有可访问的对象(多包如何设置bitmap后面会涉及)。

3.2.2 多包

随着文件数越来越多,pack文件就会越来越大,单包策略的缺点就暴露了出来,如果使用单包,包大小高达30g甚至更大,当有新的松散文件时、或gc时,触发的repack将会非常慢。

针对上述问题,可以采用多包的方式,为每个packfile设置一个限制(pack.packSizeLimit),超过这个限制就分包,同时每次repack重新打包时将新的松散对象采用增量(git repack -d)打包,然后在于之前的小于某个限制(git multi-pack-index repack --batch-size=<size>)的所有pack重新打包,看下如下命令:

# 设置每个packfile的大小为3g,-d表示采用增量的方式将新松散文件打包,使用--write-midx 开启多包索引
git -c pack.threads=4 -c pack.packSizeLimit=3g -c repack.packKeptObjects=true -c core.multiPackIndex=true repack -l -d -n --write-midx # git multi-pack-index repack --batch-size=<size>,将小于size的packfile重新打包成一个或多个packfile,如果两个packfile都小于size打小,但是重新repack后生成的新packfile大于pack.packSizeLimit,那么将不予合并打包
git -c pack.threads=4 -c repack.packKeptObjects=true -c pack.packSizeLimit=3g -c core.multiPackIndex=true multi-pack-index repack --batch-size=2g # 重新生成bitmap
git multi-pack-index write --bitmap

3.3 repack单包与多包性能对比

当测试repack相关功能时,为了验证单包和多包性能问题,需要保持每次松散对象数量是一致的,因此当执行完单包命令之前需要将objects文件夹备份,并在执行完单包命令之后将备份的objects重新复制回去并执行unpack命令,流程如下:

3.3.1 前置条件:

已有40w个松散对象被打包成一个pack(约7.5g),以及10w个松散对象(约2g)。本次通过直接执行命令观看效果,因此使用了root权限。
在这里插入图片描述

  • 1、将.git/objects整个目录备份,并将10w个文件产生的对应的pack(记为pack-d69d44271fc40005eed5c8e0d7ec82c15e80dddd.pack)文件备份
  • 2、执行cat pack-d69d44271fc40005eed5c8e0d7ec82c15e80dddd.pack | git unpack-objects,将pack-d69d44271fc40005eed5c8e0d7ec82c15e80dddd.pack重新unpack成loose objects,需要注意的是执行unpack-objects命令的pack需要从.git/objects目录下移走
  • 3、验证单包/多包命令
  • 4、回到步骤2循环执行
3.3.2 测试命令

测试时可参考下述命令
单包

  • gc:
git -c repack.writeBitmaps=true -c pack.writeBitmapHashCache=true  -c gc.writeCommitGraph=false gc --prune=30.minutes.ago
  • repack
git -c pack.threads=16 -c repack.writeBitmaps=true repack -A -l -d -n

多包

  • gc
git -c pack.packSizeLimit=3g -c repack.packKeptObjects=true -c gc.writeCommitGraph=false -c gc.bigPackThreshold=2g gc --prune=30.minutes.agogit multi-pack-index write --bitmap
  • repack
git multi-pack-index expire git -c pack.threads=16 -c pack.packSizeLimit=3g -c repack.packKeptObjects=true -c core.multiPackIndex=true repack -l -d -n --write-midx git -c pack.threads=16 -c repack.packKeptObjects=true -c pack.packSizeLimit=3g -c core.multiPackIndex=true multi-pack-index repack --batch-size=2g git multi-pack-index write --bitmap
3.3.3 测试结果及分析
1、耗时分析
  • 单包repack
    在这里插入图片描述
  • 多包repack
    在这里插入图片描述
    重写bitmap耗时约1m 18s
    在这里插入图片描述
    可以看到多包repack总耗时约在4m 42s
2、cpu分析

左边是单包,右边是多包
在这里插入图片描述
可以看到单包时cpu使用超50%耗时约420s,而多包则在140s

3、IO读写

在这里插入图片描述

总结

整理IO读写并进行估算后,结果如下(旧逻辑即为单包,新逻辑即为多包)
在这里插入图片描述
绘图如下
在这里插入图片描述

可以看到使用多包处理后资源占用明显降低,耗时减少。

相关文档

1、Git-内部原理-Git-对象
2、git-gc
3、git-config
4、git-pack-objects
5、git-multi-pack-index
6、git-repack
7、git-count-objects
8、bitmap

相关文章:

git repack多包使用及相关性能测试

1、git数据结构 git 中存在四种数据结构&#xff0c;即object包含四种&#xff0c;分别是tree对象、blob对象、commit对象、tag对象 1.1 blob对象 存储文件内容&#xff0c;内容是二进制的形式&#xff0c;通过SHA-1算法对文件内容和头信息进行计算得到key(文件名)。 如果一…...

QT获取dll库文件详细信息

一、需求背景获取软件下依赖的dll库的版本信息&#xff0c;如下图所示版本为1.0.7.1018二、实现方法2.1步骤windows下实现&#xff0c;基于version.lib(version.dll)提供的函数获取这些信息首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小&#xff0c;申请缓冲区&…...

常见的电脑运行卡顿原因及解决方法

大家在日常使用电脑过程中&#xff0c;会发现多开几个文件就卡顿&#xff0c;其实很多时候都跟C盘长期不清理有关&#xff0c;C盘的内存被下载的软件安装包、页面文件、休眠文件、更新文件等一系列的文件占据。大的文件甚至能占到20-30G&#xff0c;驱动人生就为大家带来几种解…...

案例08-让软件的使用者成为软件的设计者

一&#xff1a;背景介绍 对于需求的开发每天可能都会有上线的情况&#xff0c;为了防止每次上线拉取代码或者修改配置而引发的冲突以及发生了冲突应该找谁一起确定一下代码留下那一部分的情况。所以在开发的群中会有一个表格来记录每个需求上线修改的环境、是否修改数据库、是否…...

QinQ与Vlan Mapping讲解

目录 QinQ Vlan扩展 QinQ实现方式 QinQ实验配置 Vlan Mapping Vlan映射 映射方式 配置命令 QinQ Vlan扩展 QinQ全称为802.1Q-in-802.1Q&#xff0c;为Vlan扩展技术&#xff0c;在802.1Q标签报文的基础上再增加一层802.1Q标签&#xff0c;实现扩展Vlan空间&#xff1b;可…...

golang 获取token方法

package main import ( "fmt" "time" "github.com/dgrijalva/jwt-go" ) const ( SECRETKEY "202203021124355xxx" //私钥 ) // 自定义 Claims type CustomClaims struct { UserId int64 jwt.StandardClaims } func main() { //生…...

【数据库专题】数据库Mongodb之深入认知云计算三种服务方式、mongodb特点、mongodb重要进程 mongod、mongo、其他进程区别

文章目录一、什么是云计算1. IaaS:基础设施即服务2. SaaS:软件即服务3. PaaS:平台即服务二、大数据与云计算关系三、什么是MongoDB四、大数据与MongoDB五、MongoDB特点六、安装MongoDB七、重要进程介绍7.1 mongod进程7.2 mongo进程7.3 其他进程7.3.1 mongodump重建数据库7.3.2 …...

ccc-pytorch-小实验合集(4)

文章目录一、 Himmelblau 优化二、多分类实战-Mnist三、Sequential与CPU加速-Mnist四、visidom可视化一、 Himmelblau 优化 Himmelblau 是一个具有4个最优值的2维目标函数。其函数和最优值点如下&#xff1a; 图象绘制&#xff1a; import numpy as np from matplotlib impo…...

webrtc音频系列——4、RTP与RTCP协议

如果让你从0开发一套实时互动直播系统&#xff0c;你首先要选择网络传输协议。UDP 还是 TCP&#xff1f;答案是&#xff1a;UDP。为什么实时传输不能用 TCP &#xff1f;TCP 的目的就是实现数据的可靠传输&#xff0c;因此他有一套 握手&#xff0c;发送 -> 确认&#xff0c…...

C++枚举解读(enum)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、枚举是什么&#xff1f;二、使用步骤1.作用域2.隐式类型转换3.显式指定枚举值类型4.指定枚举值的值4.整形显式转换成枚举总结前言 对于开发C来说&#xff0…...

OSCP-课外5(Web图片泄露服务信息、日志中毒)

目录 一、主机发现与端口扫描 二、Web信息收集 三、系统信息收集与提权 一、主机发现与端口扫描...

汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)

一、ADD加法操作指令将eax置1&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果保存到eaxadd eax,ebx扩展&#xff1a;adc需要再加上CF标志位的值adc eax&#xff0c;ebx二、SUB减法操作指令将eax置3&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果…...

【电源专题】案例:充电芯片损坏为什么判断是从NTC进入的EOS

最近有发现一个异常就是测试部测试测试然后充电芯片就无法使用了。通过二极管特性分析(参考文章:电源专题】案例:电源芯片厂家怎么判断电源芯片端口是否损坏)是NTC管脚已经损坏对地短路了。但是以前没有发现这个问题,最近更换了芯片后就发现的特别明显。 首先分析一下现在…...

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲&#xff0c;但是迟迟没有开始复习&#xff0c;一方面是因为学校学业却是繁忙&#xff0c;另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰&#xff0c;但如今&#xff0c;复习必须开始了。今天我从C语言的最…...

Android kotlin实战之协程suspend详解与使用

前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言。与许多其他具有类似功能的语言不同&#xff0c;async 与 await 在 Kotlin 中并不是关键字&#xff0c;甚至都不是标准库的一部分。此外&#xff0c;Kotlin 的 挂起函数 概念为异步操作提供…...

Pycharm中的Virtualenv Environment、Conda Environment

版本一 Conda Environment该不该选? 先说结论&#xff0c;该选&#xff0c;而且还是正解。前提是你打算"用Anaconda来管理各种Python环境&#xff0c;同时管理Python下面的各种包"。 选了Conda Environment意味着什么? 意味着你以后如果要装新的包的话&#xf…...

C++容器介绍:vector

目录vector简介使用方法1.头文件2.vector声明及初始化3.vector基本操作(1). 容量(2). 修改(3)迭代器(4)元素的访问(5)算法vector 简介 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vecto…...

抗锯齿和走样(笔记)

Artifacts&#xff08;瑕疵&#xff09;&#xff1a; 比如人眼采样频率跟不上陀螺的旋转速度&#xff0c;这时就有可能看到陀螺在反方向旋转怎么做抗锯齿&#xff08;滤波&#xff09;&#xff1a; 在采样之前先进行一个模糊操作&#xff0c;可以降低锯齿的明显程度 通过傅里叶…...

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool&#xff1a;Executors.newCachedThreadPool&#xff1a;Executors.newSingleThreadExecutor&#xff1a;Executors.newScheduledThreadPool&#xff1a;Executors.newSingleThreadScheduled…...

代码随想录算法训练营day47 |动态规划 198打家劫舍 213打家劫舍II 337打家劫舍III

day47198.打家劫舍1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组213.打家劫舍II情况一&#xff1a;考虑不包含首尾元素情况二&#xff1a;考虑包含首元素&#xff0c;不包含尾元素情况三&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...