再记一次MemoryLeak分析
性能是优化出来的,不管是在上生产前,还是在上生产后。大部分性能在性能测试阶段就能发现问题,但也有一些性能问题,结合生产的环境,生产数据才能表现出来,成为一个显著的瓶颈。
这次是生成pdf造成的内存泄露,大体代码如下,具体表现是内存缓慢增长,在docker中比windows增长速度要快,但都有只增不回收的特点。 using System.Data; using System.Reflection.Metadata; using QuestPDF.Helpers; using QuestPDF.Infrastructure; using QuestPDF.Fluent; using QRCoder; using Microsoft.AspNetCore.Mvc; using QuestPDF.Drawing; using QuestPDF; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/getpdf", () => { var table = new DataTable(); for (var i = 0; i < 10; i++) { table.Columns.Add(i.ToString()); } for (var row = 0; row < 1000; row++) { table.Rows.Add(row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), DateTime.Now + "wwewrwerewfdsfdswefwefewfwefwefew" + row, row.ToString(), row.ToString()); } return TypedResults.File(GetPDF(table), contentType: "application/pdf", fileDownloadName: "a.pdf"); }); app.Run(); static IContainer CellStyle(IContainer container) { return container.DefaultTextStyle(x => x.SemiBold().FontSize(11)).PaddingVertical(5).BorderBottom(1).BorderColor(Colors.Black); } static byte[] GetPDF(DataTable dt) { var doc = QuestPDF.Fluent.Document.Create(container => { using var stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fonts", "MEIRYO.TTC")); FontManager.RegisterFont(stream); Settings.EnableCaching = true; Settings.EnableDebugging = false; container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.PageColor(Colors.White); page.DefaultTextStyle(x => x.FontSize(14).FontFamily("Meiryo")); page.Content() .PaddingVertical(1, Unit.Centimetre) .Column(x => { x.Item().Table(table => { table.ColumnsDefinition(columns => { for (var i = 0; i < dt.Columns.Count; i++) { columns.RelativeColumn(); } }); table.Header(header => { foreach (DataColumn col in dt.Columns) { header.Cell().Element(CellStyle).Text(col.ColumnName); } }); foreach (DataRow row in dt.Rows) { for (var i = 0; i < dt.Columns.Count; i++) { if (i == 7) { byte[] qrCodeAsBitmapByteArr = PngByteQRCodeHelper.GetQRCode(row[i].ToString(), QRCodeGenerator.ECCLevel.Q, 20, false); using var ms = new MemoryStream(qrCodeAsBitmapByteArr); table.Cell().Image(qrCodeAsBitmapByteArr); } else { table.Cell().Element(CellStyle).Text(row[i].ToString()); } } } }); }); page.Footer() .AlignCenter() .Text(x => { x.Span("Page "); x.CurrentPageNumber(); x.Span("/ "); x.TotalPages(); }); }); }); return doc.GeneratePdf(); }
各种.net的调试工具用上,都只能证明内存只增不减,连pmap都用上了,发现下面的一个大文件的内存占用,并且很多,大体都是在65M左右。 Address Kbytes RSS Dirty Mode Mapping 00007f4d54000000 65536 65536 65536 rw--- [ anon ]
经过一天的测试,找不到具体的问,最后推测是生成Pdf后,生成的内存是非托管内存,GC回收不掉,每当有用户下载PDF时,就会积累内存,直到Pod崩掉。
干不掉bug,就干掉需求吧,因为经过统计这个下载pdf的使用量很低,可以下掉功能。同时把这个问题给QuestPDF提了个issues。就准备躺平。QuestPDF回应很快,说注册字体只用注册一次就行,多次注册会重复累加字体,37到40行代码,只在服务启动时加载一次即可,经过测试果然有效果。
在复盘时,总结,常规的思维在win下注册字体,多次注册不会让相同的字体保存多份,从而认知QuestPDF注册也是同理,造成下载一次就注册一次,造成内存积加,这也是为什么65M左右的内存一起在累加的原因。
后来,我又思考了一下,如果做一个支持高并发,高性能的web服务,像下载Excel,PDF这些操作,是不能在后台生成的,因为用户的一个文件的体积和用户的数据是有关系的,大小很难控件,如果耦合在web服务端来做这件事,肯定是个"雷"。也有的建议是用其他服务或cli异步生成,然后放在云存储上让用户下载,这也是一种解决方案。
我觉还是让web服务做自己擅长的事,提供数据,把文件生成组装操作转嫁给客户的浏览器来完成,这样既能减轻web服务的负载,又能充分利用客户端的资源,一举两得。
熟女的优雅装扮从1974年第一条意大利本土出品的裹身裙开始,这条裙子就成为女人味的象征。高级的真丝裹身裙就具备这种魔法,任何不完美身材穿上都轻易能够显瘦显高挑显优雅显华美。它给予女人味三字令人心
6支夏日绝美口红分享,我不允许你一支都没有那么夏天到了当然是要换一批夏天用的口红啦所以今天,拖拖决定为你们推荐6支超级适合夏天涂的口红让我的仙女可以在人群中脱颖而出!!ColourpopFlifi开架彩妆品牌中的战斗机co
生活偶感愿我们既有能力享受安静,又有能力享受真正的狂欢生活中,许多人都有这样的感觉,越是身处热闹的地方越是觉得孤独,越是忙碌的时候越是觉得空虚。现代人似乎特别矛盾,一方面害怕独处,一方面又想着逃离喧嚣。他们害怕独处时的安静,他们也厌倦
你若大气,必有福气你若大气,不斤斤计较,必有福气,一个人的福气是在后头,只有靠着自己慢慢地去修,福气才会朝着你一点点地来。人生不要着急,好的事情会一点点地朝着你而来的,可能你当下一无所有,可是有些物
乐观所谓乐观,关键是乐观需要如何写。乐观的发生,到底需要如何做到,不乐观的发生,又会如何产生。既然如此,而这些并不是完全重要,更加重要的问题是,我们都知道,只要有意义,那么就必须慎重考
学会孤独头条创作挑战赛慢慢的朋友渐行渐远,虽然说有互联网的加持。但是。一如那句老话,远亲不如近邻。再有,互联网也不可能每天都分享生活的琐事,而且环境不一样,烦恼是不一样的。慢慢的,时间也开
全国各地开展消费者权益保护活动央视网消息(新闻联播)今天(3月15日)是国际消费者权益日。市场监管总局公布数据,2022年,全国市场监管部门共受理消费者投诉举报和咨询2940。77万件,为消费者挽回经济损失45
质量问题频发虚假宣传,新能源车成消费者维权新热点虽然今年315国际消费者权益日到来之前,网上传出将会有新能源车企将被曝光,但实际上,本届315晚会并没有着重关注汽车领域。不过,在过去的一年,针对汽车产品服务贷款等环节的维权事件也
全力以赴电动化,宝马首次公布新世代车型产品规划记者从宝马集团获悉,3月15日,宝马集团首次公布新世代车型及产品规划。走量车型打头阵2025年下半年开始量产随后的24个月内至少投产6款车型,宝马集团在今天举行的2023年财报年会
保障消费者权益靠什么?公平和诚信是商品经济的主旋律,也是市场经济参与各方必须遵守的共同准则,更是为消费者营造良好消费环境的保障。企业是市场经济中最为活跃的一份子和重要组成部分,应积极承担社会责任,切实履
醉酒女子殴打代驾司机我男朋友上海人公安局的,官方回应来了醉酒女子殴打代驾司机我男朋友上海人公安局的,官方回应来了3月14日,上海普陀,一位醉酒女子当街殴打代驾司机的视频登上了热搜,引起了网友们的热议。整个视频长达六分钟,根据现场目击者的