项目用到了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一次内存暴涨的坑的更多相关文章

  1. MySQL information_schema表查询导致内存暴涨

    case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from p ...

  2. windbg分析一次大查询导致的内存暴涨

    项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...

  3. 记一次 .NET 某三甲医院HIS系统 内存暴涨分析

    一:背景 1. 讲故事 前几天有位朋友加wx说他的程序遭遇了内存暴涨,求助如何分析? 和这位朋友聊下来,这个dump也是取自一个HIS系统,如朋友所说我这真的是和医院杠上了,这样也好,给自己攒点资源, ...

  4. ARC 下处理内存暴涨的一个解决办法

    有一种情况: ; i < ; i++) { NSString *s = @"ABC"; s = [s lowercaseString]; s = [s stringByApp ...

  5. [自带避雷针]DropShadowEffect导致内存暴涨

    原文:[自带避雷针]DropShadowEffect导致内存暴涨  [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...

  6. Unity Built-In Shader造成的运行时内存暴涨

    在某个PC项目中使用了大量的材质球, 并且都使用了自带的Standard Shader, 在编辑器运行的时候, 一切良好, 运行内存只在1G左右, 然而在进行AssetBundle打包之后, EXE运 ...

  7. NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat

    此次路演由莫斯科演讲师Andrew首先致辞.首先安德鲁回顾了NGK近些年发展的整体情况,表示,NGK技术团队一直在认真的做事并将更加注重技术方案的改进,为行业提供更好的技术解决方案是NGK的愿景,NG ...

  8. 记一次 .NET 某WMS仓储打单系统 内存暴涨分析

    一:背景 1. 讲故事 七月中旬有一位朋友加wx求助,他的程序在生产上跑着跑着内存就飙起来了,貌似没有回头的趋势,询问如何解决,截图如下: 和这位朋友聊下来,感觉像是自己在小县城当了个小老板,规律的生 ...

  9. Python ThreadPoolExecutor 线程池导致内存暴涨

    背景 在有200W的任务需要取抓取的时候,目前采用的是线程池去抓取,最终导致内存暴涨. 原因 Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无 ...

随机推荐

  1. xshell 所选的用户密钥未在远程主机上注册;无法加载密钥

    他山之石 https://zhuanlan.zhihu.com/p/92528287 安全起见,服务器最近的安全策略准备进行更改,逐渐由原来的密码登录更换为密钥登录认证. 于是今天把服务器上的id_r ...

  2. spring boot 启动读取的配置文件优先级

    1.优先级从高到低 1.  file:/config/ 2. file:/ 3. classpath:/config/ 4. classpath:/ 所有位置的application.properti ...

  3. Spring cloud 框架 --- Eureka 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 (1)接触了spring cloud 框架 ,首先要知道Eureka是什 ...

  4. 使用Eclipse新建项目

    如果图片损坏,点击查看: https://www.toutiao.com/i6496078011538866702/ 出现"新建"对话框,输入mavem 点击创建"简单M ...

  5. 利用代码生成工具Database2Sharp生成ABP VNext框架项目代码

    我们在做某件事情的时候,一般需要详细了解它的特点,以及内在的逻辑关系,一旦我们详细了解了整个事物后,就可以通过一些辅助手段来提高我们的做事情的效率了.本篇随笔介绍ABP VNext框架各分层项目的规则 ...

  6. vps上安装CobaltStrike服务端

    今天我在我的vps上安装CobaltStrike服务端,真的是踩坑无数,所以写这篇博客记录一下,防止后人再踩坑 安装Oracle JDK8 官方不建议使用OpenJdk,建议使用Oracle JDK的 ...

  7. 【爬虫】从零开始使用 Scrapy

    一. 概述 最近有一个爬虫相关的需求,需要使用 scrapy 框架来爬取数据,所以学习了一下这个非常强大的爬虫框架,这里将自己的学习过程记录下来,希望对有同样需求的小伙伴提供一些帮助. 本文主要从下面 ...

  8. 开源数据可视化BI工具SuperSet(使用)

    上一篇介绍了Linux 下如何安装SuperSet ,本篇简单介绍一下如何使用 1.输入安装时设置的用户名密码登录控制台  2.控制界面如下  3.第一步添加数据源(已安装好的mysql) 点击 da ...

  9. 实习之bii--在vsphere client 给esxi上的虚拟机增加U盘识别

    esxi上安装虚拟机默认不包含U盘控制器,在服务器上插U盘也不会识别,所以要通过客户端登陆esxi管理为虚拟机增加U盘控制器,步骤如下: 1.首先登陆服务器的管理ip 2.选择一部虚拟机,进行编辑设置 ...

  10. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...