义乌设计网站,wordpress 换首页,网站色调,网站建设怎么改首页的标题起因#xff1a;最近公司的一个web产品遇到了内存溢出#xff0c;于是开始着手调查。调查#xff1a;首先当务之急是找到那个或那些API导致Memory Leak#xff0c;这个应该不难#xff0c;根据监控分析#xff0c;在内存上升时间段内有哪些API被访问#xff0c;再就是根… 起因最近公司的一个web产品遇到了内存溢出于是开始着手调查。调查首先当务之急是找到那个或那些API导致Memory Leak这个应该不难根据监控分析在内存上升时间段内有哪些API被访问再就是根据开发人员提供信息评估可能内存溢出的API。案例分析划定API范围后用压力测试来重现问题进一步定位具体是哪个方法哪个技术点出问题这些应该也不难难的是知道什么地方有问题但不知道怎么解决。下面是经过精简后分离出的有问题的代码。项目文件csprojProject SdkMicrosoft.NET.SdkPropertyGroupOutputTypeExe/OutputTypeTargetFrameworknet6.0/TargetFrameworkImplicitUsingsenable/ImplicitUsingsNullableenable/NullableServerGarbageCollectionfalse/ServerGarbageCollectionConcurrentGarbageCollectiontrue/ConcurrentGarbageCollection/PropertyGroupItemGroupPackageReference IncludeClosedXML Version0.96.0 /PackageReference IncludeQRCoder Version1.4.2 //ItemGroup
/Project具体代码program.csusing ClosedXML.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using QRCoder;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using Color System.Drawing.Color;Console.WriteLine(回车开始);
Console.ReadLine();
var qrGenerator new QRCodeGenerator();
while (true)
{using var workBook new XLWorkbook();var ws workBook.Worksheets.Add(TestSheet);for (var i 1; i 200; i){using var qrCodeData qrGenerator.CreateQrCode(${i}_{DateTime.Now.ToString(yyMMddHHmmssfffffff)}_01PAe8np5m7pVULUiuxwwZTWQ9KZ8JUgQyWiyUrsiHqi4FKrCzhRAcddCkkJKDgVEkpmqD7kYJz5GTpe4oHvJdJDnNMMCTwbV19G, QRCodeGenerator.ECCLevel.L);using var qrCode new QRCode(qrCodeData);using var qrCodeImage qrCode.GetGraphic(20, Color.Black, Color.White, false);using var imgStream new MemoryStream();qrCodeImage.Save(imgStream, ImageFormat.Png);using var image ws.AddPicture(imgStream).MoveTo(ws.Cell(i, 1), new Point(50, 10));image.Width 60;image.Height 60;}workBook.SaveAs($/app/images/{i}_{DateTime.Now.ToString(yyyyMMddHHmmss)}.xlsx);Console.WriteLine($完了:{DateTime.Now});Console.ReadLine();
}很有趣的是这块代码在docker里运行时会有memory leak但在windows上是没有问题的。上面代码主要有两个功能生成二维码然后保存在Excel里最后保存本地。具体表现是每生成一个Excel内存就会增加不释放直到容器重启。其实找性能问题是一个排查的过程首先要一点一点把认为有问题的代码修正再次进行测试看是否有改善比如主动去释放一些对象使用using或者直接用GC.Collect()来测试。经过一轮后发现没有改善内存只涨不降的现象。于是就进行功能分享把QR生成换成静态图片查看Excel生成部分是否有问题这样很快就定位到了QR生成有问题但QR生成能有什么问题呢并且这个功能一直在用从.net 5用到.net 6都没有变更过这里的代码。那只能查看是QR生成有无问题了。下面是经过一番查找后的结果果然ORCode类对.net 6.0不能很好的支持只能换掉它了替代的方式是用PngByteQRCode。https://github.com/codebude/QRCoder/wiki/Advanced-usage---QR-Code-renderers#2-overview-of-the-different-renderers修改后的代码是using ClosedXML.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using QRCoder;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using Color System.Drawing.Color;Console.WriteLine(回车开始);
Console.ReadLine();
var qrGenerator new QRCodeGenerator();
while (true)
{using var workBook new XLWorkbook();var ws workBook.Worksheets.Add(TestSheet);for (var i 1; i 200; i){ byte[] qrCodeAsBitmapByteArr PngByteQRCodeHelper.GetQRCode(DateTime.Now.ToString(yyMMddHHmmssfffffff) 01PAe8np5m7pVULUiuxwwZTWQ9KZ8JUgQyWiyUrsiHqi4FKrCzhRAcddCkkJKDgVEkpmqD7kYJz5GTpe4oHvJdJDnNMMCTwbV19G, QRCodeGenerator.ECCLevel.Q, 20, false);var imgStream new MemoryStream(qrCodeAsBitmapByteArr);imgStream.Seek(0, SeekOrigin.Begin);using var image ws.AddPicture(imgStream).MoveTo(ws.Cell(i, 1), new Point(50, 10));image.Width 60;image.Height 60;}workBook.SaveAs($C:\Users\axzxs\Pictures\{DateTime.Now.ToString(yyyyMMddHHmmss)}.xlsx);Console.WriteLine($完了:{DateTime.Now});Console.ReadLine();
}其实单看上面过程很简单其实测试过程中的一些指标表象以及个人对技术点的认知都会让性能分析起来要走一些弯路。比如上面功能其实我们花了很多时间在Excel的生成找问题甚至换了Excel生成组件来进行测试经过多轮出修改方案修改代码压力测试结果分析才最终定义QR码又经过多轮对QR码生成的方案优化最后才找到是因为QR不支持导致的结果。性能分析就是找疑难杂症是个痛苦过程同时解决掉又是一个很喜悦的收获。