首页 > 其他分享 >【解决了一个小问题】错误配置 s3 sdk 的 part size 导致 oom

【解决了一个小问题】错误配置 s3 sdk 的 part size 导致 oom

时间:2024-09-09 12:46:32浏览次数:8  
标签:sliceSize Uploader oom s3 part func go sdk

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


某服务上线后,运行一段程序崩溃,一开始以为是panic,为所有的go出来的协程都加上了recover()处理,仍然未找到崩溃原因。
更奇怪的是,在 aws 云中,程序崩溃后,其对应的容器一直无法拉起。
最后在 SRE 的帮助下找到了最终的崩溃信息:

    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
      Started:      Fri, 06 Sep 2024 18:14:51 +0800
      Finished:     Fri, 06 Sep 2024 18:15:48 +0800

继续观察崩溃时候的golang runtime 上报:

容器最大内存为 16 gb,可见确实是某种原因导致了内存分配太多。

为了找到程序崩溃的原因,开启了程序的 pprof http 端口:

	wget -O heap_profile.out "http://[xxxxx]:18888/debug/pprof/heap"
	scp myserver:/home/ahfuzhang/temp/2024-09-09/heap_profile.out ./
	go tool pprof -http=:8090 heap_profile.out

打开浏览器,看到如下信息:

通过 top 也发现 s3 sdk 里面内存分配得很离谱:

通过源码分析:

// vendor/github.com/aws/aws-sdk-go/service/s3/s3manager/pool.go
func (p *maxSlicePool) newSlice() *[]byte { 
	bs := make([]byte, p.sliceSize)  // 这里的 sliceSize 太大了
	return &bs
}

func newMaxSlicePool(sliceSize int64) *maxSlicePool {
	p := &maxSlicePool{sliceSize: sliceSize}  // sliceSize 是调用端传进来的
	p.allocator = p.newSlice

	return p
}

func newUploader(client s3iface.S3API, options ...func(*Uploader)) *Uploader {
	u := &Uploader{
		S3:                client,
		PartSize:          DefaultUploadPartSize,
		Concurrency:       DefaultUploadConcurrency,
		LeavePartsOnError: false,
		MaxUploadParts:    MaxUploadParts,
		BufferProvider:    defaultUploadBufferProvider(),
	}

	for _, option := range options {
		option(u)
	}

	u.partPool = newByteSlicePool(u.PartSize)  // 原来是 part size 决定了内部缓冲区的大小

	return u
}

最后,修改 part size 后问题解决:

xx := s3manager.NewUploader(session.Must(sess, err), func(u *s3manager.Uploader) {
			u.Concurrency = types.UploadConcurrency
			u.PartSize = partSize // 默认 20mb,不分片
		})

引入这个问题是因为某次讨论中认为分片没必要,直接将默认分片从 5mb 修改为 3GB
修改后未确认 s3 sdk 内部的逻辑。

标签:sliceSize,Uploader,oom,s3,part,func,go,sdk
From: https://www.cnblogs.com/ahfuzhang/p/18404323

相关文章

  • Study Plan For Algorithms - Part26
    1.礼物的最大价值在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?方法一:de......
  • Study Plan For Algorithms - Part27
    1.最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。方法一:deflengthOfLongestSubstring(s):n=len(s)max_len=0start=0char_index={}forendinrange(n):ifs[en......
  • PhotoZoom Pro 9真的可以图像无损放大可能吗?
     PhotoZoomPro9是一款非常精悍的图片无损放大,且放大不失真的图片处理软件。它是一款采用国际领先插值算法的新颖的、技术上具有革命性的对数码图片无损放大的工具。PhotoZoomPro9全新版本震撼来袭无损放大照片,无与伦比的画质效果。强大易用的软件界面, 清晰小图......
  • 使用multipartFile对象解析Execl
    1.需要使用multipartFile包packageorg.springframework.web.multipart;2.数据校验publicStringexportVehicleViol(MultipartFilemultipartFile){    try{      //对前端传递的文件进行校验      if(multipartFile==null&&multipartF......
  • BZOJ 3796 Mushroom追妹纸 题解
    Statement给\(s_1,s_2,s_3\),求最长的\(w\)的长度,满足\(w\)是\(s_1\)子串\(w\)是\(s_2\)子串\(s_3\)不是\(w\)子串Solution1以下是我没看题解瞎胡的首先一个弱智想法是,枚举\(s_1\)上\(w\)的左端点,二分右端点,判定时\(s_2\)用SAM,\(s_3\)用单串AC自动......
  • 【Java】已解决:org.springframework.web.multipart.MultipartException
    文章目录一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例1.配置文件上传限制2.控制器代码五、注意事项已解决:org.springframework.web.multipart.MultipartException一、分析问题背景在使用Spring框架进行文件上传时,开发者可能会遇到o......
  • 代码随想录训练营 Day53打卡 图论part04 110. 字符串接龙 105. 有向图的完全可达性 10
    代码随想录训练营Day53打卡图论part04一、卡码110.字符串接龙本题与力扣127题是一样的,所以这里使用力扣127题。字典wordList中从单词beginWord到endWord的转换序列是一个按下述规格形成的序列beginWord->s1->s2->…->sk:    每一对相邻的单词只......
  • DAY11 栈与队列part02
      逆波兰式求值代码随想录(programmercarl.com)1classSolution{2public:3intevalRPN(vector<string>&tokens){4stack<longlong>st;5for(inti=0;i<tokens.size();i++)6{78if(tokens[i]=="+......
  • Day07 字符串part01| LeetCode 344. 反转字符串,541. 反转字符串II,卡码网:54.替换数字
    反转字符串344.反转字符串classSolution{publicvoidreverseString(char[]s){intlens=s.length;intright,left;if(lens%2!=0)//奇数个{right=lens/2+1;left=lens/2-1......
  • Day03 链表part01| LeetCode 203. 移除链表元素,707. 设计链表,206. 反转链表
    链表理论基础链表一种通过指针串联在一起的线性结构数据域指针域(存放指向下一个节点的指针,最后一个节点的指针域指向NULL)入口节点——head头节点链表类型单链表双链表两个指针域一个指向下一个节点一个指向上一个节点循环链表首尾相连约瑟夫环问题......