记录netcore一次内存暴涨的坑
项目用到了Coldairarrow/EFCore.Sharding: Database Sharding For EFCore (github.com)这个组件,最初是因为分表做的还不错所以用了它。
因为项目一直在开发测试中,所以有个服务内存一直暴涨,重启就好了,时间一长就起来了。不得不说微软文档真的很给力
dotnet-counters 诊断工具 - .NET CLI | Microsoft Docs
一开始是看到这篇文章来的,没有它,也不会去深究微软的诊断工具了。
【.Net Core】分析.net core在linux下内存占用过高问题--持续更新 - 郑立赛 - 博客园 (cnblogs.com)

上图发现System.Diagnostics.StackFrame占用内存是最高的,后面分析了所有的输出信息,发现是数据库输出的信息非常多,...定位到是分表不能释放导致。
通过下载示例代码:
using EFCore.Sharding;
using EFCore.Sharding.Tests;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks; namespace Demo.DateSharding
{
class Program
{
static async Task Main(string[] args)
{
DateTime startTime = DateTime.Now.AddMinutes(-5);
ServiceCollection services = new ServiceCollection();
//配置初始化
services.AddLogging(x =>
{
x.AddConsole();
});
services.AddEFCoreSharding(config =>
{
config.SetEntityAssemblies(typeof(Base_UnitTest).Assembly); //添加数据源
config.AddDataSource(Config.CONSTRING1, ReadWriteType.Read | ReadWriteType.Write, DatabaseType.SqlServer); //按分钟分表
config.SetDateSharding<Base_UnitTest>(nameof(Base_UnitTest.CreateTime), ExpandByDateMode.PerMinute, startTime);
}); var serviceProvider = services.BuildServiceProvider();
new EFCoreShardingBootstrapper(serviceProvider).StartAsync(default).Wait(); for (int i = 0; i < 2000; i++)
{
using var scop = serviceProvider.CreateScope();
var db = scop.ServiceProvider.GetService<IShardingDbAccessor>();
var logger = scop.ServiceProvider.GetService<ILogger<Program>>();
await db.InsertAsync(new Base_UnitTest
{
Id = Guid.NewGuid().ToString(),
Age = 1,
UserName = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now
});
DateTime time = DateTime.Now.AddMinutes(-2);
var count = await db.GetIShardingQueryable<Base_UnitTest>()
.Where(x => x.CreateTime >= time)
.CountAsync();
logger.LogWarning("当前数据量:{Count}", count);
}
Console.ReadKey(); }
}
}
using var scop = serviceProvider.CreateScope()如果多次创建,这个内存是持续上涨的,不会释放。
如果把这一行代码移出去的话,内存就会很稳定。虽然继承了idisposiable ,用了using但是仍然不会释放,很头痛。 但是下面的代码改造成上面的就不会出现内存保障情况。
using EFCore.Sharding;
using EFCore.Sharding.Tests;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks; namespace Demo.HelloWorld
{
class Program
{
static async Task Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddLogging(config =>
{
config.AddConsole();
});
services.AddEFCoreSharding(config =>
{
config.SetEntityAssemblies(typeof(Base_UnitTest).Assembly); config.UseDatabase(Config.SQLITE1, DatabaseType.SQLite);
});
var serviceProvider = services.BuildServiceProvider();
new EFCoreShardingBootstrapper(serviceProvider).StartAsync(default).Wait(); using var scop = serviceProvider.CreateScope();
//拿到注入的IDbAccessor即可进行所有数据库操作
var db = scop.ServiceProvider.GetService<IDbAccessor>();
var logger = scop.ServiceProvider.GetService<ILogger<Program>>();
while (true)
{
await db.InsertAsync(new Base_UnitTest
{
Age = 100,
CreateTime = DateTime.Now,
Id = Guid.NewGuid().ToString(),
UserId = Guid.NewGuid().ToString(),
UserName = Guid.NewGuid().ToString()
});
var count = await db.GetIQueryable<Base_UnitTest>().CountAsync(); logger.LogWarning("当前数量:{Count}", count); await Task.Delay(1000);
}
}
}
}
后来发现IDbAccessor是通过工厂创建的,没有通过service注入。但是IShardingDbAccessor是通过 services.AddScoped<IShardingDbAccessor, ShardingDbAccessor>()注入到服务中的。
项目需要解决办法就是把
services.AddScoped<IShardingDbAccessor, ShardingDbAccessor>()改成单利注入。
记录netcore一次内存暴涨的坑的更多相关文章
- MySQL information_schema表查询导致内存暴涨
case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from p ...
- windbg分析一次大查询导致的内存暴涨
项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...
- 记一次 .NET 某三甲医院HIS系统 内存暴涨分析
一:背景 1. 讲故事 前几天有位朋友加wx说他的程序遭遇了内存暴涨,求助如何分析? 和这位朋友聊下来,这个dump也是取自一个HIS系统,如朋友所说我这真的是和医院杠上了,这样也好,给自己攒点资源, ...
- ARC 下处理内存暴涨的一个解决办法
有一种情况: ; i < ; i++) { NSString *s = @"ABC"; s = [s lowercaseString]; s = [s stringByApp ...
- [自带避雷针]DropShadowEffect导致内存暴涨
原文:[自带避雷针]DropShadowEffect导致内存暴涨 [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...
- Unity Built-In Shader造成的运行时内存暴涨
在某个PC项目中使用了大量的材质球, 并且都使用了自带的Standard Shader, 在编辑器运行的时候, 一切良好, 运行内存只在1G左右, 然而在进行AssetBundle打包之后, EXE运 ...
- NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat
此次路演由莫斯科演讲师Andrew首先致辞.首先安德鲁回顾了NGK近些年发展的整体情况,表示,NGK技术团队一直在认真的做事并将更加注重技术方案的改进,为行业提供更好的技术解决方案是NGK的愿景,NG ...
- 记一次 .NET 某WMS仓储打单系统 内存暴涨分析
一:背景 1. 讲故事 七月中旬有一位朋友加wx求助,他的程序在生产上跑着跑着内存就飙起来了,貌似没有回头的趋势,询问如何解决,截图如下: 和这位朋友聊下来,感觉像是自己在小县城当了个小老板,规律的生 ...
- Python ThreadPoolExecutor 线程池导致内存暴涨
背景 在有200W的任务需要取抓取的时候,目前采用的是线程池去抓取,最终导致内存暴涨. 原因 Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无 ...
随机推荐
- Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方
市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...
- JavaScript 钩子
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...
- SQLAlchemy(十)
ORM操作在实际项目中的应用非常多,涉及到的框架也是根据不同的项目有不同的处理模块,不过操作流程和步骤都是大同小异基本没有什么太大变化,唯一需要注意的就是在实际操作过程中你要使用的ORM框架的处理性能 ...
- HTML相关知识入门
HTML 注意点 html是不区分大小写的 建议包括嵌套,不要交叉嵌套 文件后缀名可以是.html或.htm 格式 <!------类似于java中类的大括号--------> <h ...
- 超详细的编码实战,让你的springboot应用识别图片中的行人、汽车、狗子、喵星人(JavaCV+YOLO4)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ecos matlab版本安装
官网链接 github地址 1.注意不仅要下载matlab版本,同时还要下载c版本,因为matlab版本缺少第三方软件,将两个版本解压缩后将c版本下的文件夹external,ecos_bb,inclu ...
- Cplex用法
Cplex用法 1.将问题转化为LP问题: cplex -c read mps/nw460.mps change problem type lp opt 2.将问题转化为LP问题并输出问题: cple ...
- Java打印空心菱形
使用Java打印空心菱形 public static void main(String[] args) { int n = 5; //这里输出菱形的上半部分 for (int i = 1; i < ...
- 【小测试】使用腾讯云上的群集版redis
具体的文档请见:https://cloud.tencent.com/document/product/239/3205 群集版本相当于很多个redis进程构成一个群集,最大支持128个分片(猜测分片就 ...
- 第57篇-profile实例
之前已经介绍过回边计数和ProfileData与Layout,下面举个具体的例子看下MethodData是怎么利用ProfileData等记录详细的运行时信息的.实例如下: package com.t ...

