小编Vla*_*lad的帖子

DotNet Core 2.1在Linux中囤积内存

我有一个websocket服务器,在几天内囤积内存,直到Kubernetes最终杀死它.我们用prometheous-net监控它.

# dotnet --info

Host (useful for support):
  Version: 2.1.6
  Commit:  3f4f8eebd8

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.6 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Run Code Online (Sandbox Code Playgroud)

但是当我远程连接并进行内存转储(使用createdump)时,突然内存丢失......没有服务停止,重新启动或丢失任何连接的用户.请参见图中的绿线.

我可以在图表中看到,GC正在各代人中定期收集.

使用以下命令禁用GC Server:

<PropertyGroup>
  <ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

在禁用GC Server之前,用于以更快的速度增长内存的服务.现在进入512Mb需要两周时间.

在请求/响应方式上使用ASP.NET Core的其他服务不会显示此问题.这使用Websockets,每个连接通常持续大约10分钟......所以我猜想与连接相关的一切都很容易存在到第2代.

在此输入图像描述 请注意,有两个pod,显示相同的行为,然后由于获取内存转储,一个(绿色)突然在内存消息中下降.

在此输入图像描述

在获取内存转储期间,pod未重新启动: 在此输入图像描述

没有连接丢失或重新启动.

堆:

(lldb) eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x00007F8481C8D0B0
generation 1 starts at 0x00007F8481C7E820
generation 2 starts at 0x00007F852A1D7000
ephemeral segment allocation context: none …
Run Code Online (Sandbox Code Playgroud)

linux garbage-collection memory-leaks kubernetes asp.net-core

11
推荐指数
1
解决办法
1845
查看次数

实体框架"SELECT IN"不使用参数

为什么在使用"SELECT IN"时,Entity Framework将文字值放在生成的SQL中而不是使用参数:

using (var context = new TestContext())
{
    var values = new int[] { 1, 2, 3 };
    var query = context.Things.Where(x => values.Contains(x.Id));

    Console.WriteLine(query.ToString());
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下SQL:

SELECT
    [Extent1].[Id] AS [Id]
    FROM [dbo].[PaymentConfigurations] AS [Extent1]
    WHERE [Extent1].[Id] IN (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

我在SQL Server中看到了很多缓存的查询计划.有没有让EF放置参数而不是编码值,或者激活参数嗅探是唯一的选择?

它也发生在EF Core中.

.net c# sql-server entity-framework ef-core-2.0

7
推荐指数
1
解决办法
811
查看次数

使用C#结构的生产者/消费者?

我有一个处理请求的单例对象.每个请求大约需要一毫秒才能完成,通常更少.此对象不是线程安全的,它期望以特定格式的请求,封装在Request类中,并将结果返回为Response.该处理器具有另一个通过套接字发送/接收的生产者/消费者.

我实施了生产者/消费者方法来快速工作:

  • 客户端准备一个RequestCommand包含a TaskCompletionSource<Response>和目标的命令对象Request.
  • 客户端将命令添加到"请求队列"(Queue<>)并等待command.Completion.Task.
  • 不同的线程(和实际的背景Thread)从"请求队列"中拉出命令,处理command.Request,生成Response并发出命令信号,如使用command.Completion.SetResult(response).
  • 客户继续工作.

但是在进行小内存基准测试时,我看到很多这些对象被创建并且在内存中排列最常见的对象列表.请注意,没有内存泄漏,GC可以在每次触发时很好地清理所有内容,但显然很快就创建了很多对象,这使得Gen 0非常大.我想知道更好的内存使用是否会产生更好的性能.

我正在考虑将这些对象中的一些转换为结构以避免分配,特别是现在有一些新功能可以使用C#7.1.但我没有看到这样做的方法.

  • 值类型可以在堆栈中实例化,但是如果它们从一个线程传递到线程,它们必须被复制到stackA-> heap和heap-> stackB我猜.此外,当队列中排队时,它从堆栈到堆.
  • 单例对象是真正异步的.存在一些内存处理,但有90%的时间需要在外部调用并通过内部生产者/消费者.
  • ValueTask<> 这似乎不适合这里,因为事情是异步的.
  • TaskCompletionSource<>有一个州,但它是object,所以它将被装箱.
  • 该命令也从线程跳转到线程.
  • Reciclying对象仅适用于命令本身,其内容无法回收(TaskCompletionSource<>和a string).

有什么方法可以利用结构来减少内存使用量和/或提高性能?还有其他选择吗?

c# memory multithreading struct garbage-collection

7
推荐指数
1
解决办法
790
查看次数

通过ElasticSearch 6中的子聚合进行过滤,排序和分页

我收集了一些文件,其中每个文件都指出了给定酒店和一天的可用客房,以及当天的费用:

{
    "hotel_id": 2016021519381313,
    "day": "20200530",
    "rooms": [
        {
            "room_id": "00d70230ca0142a6874358919336e53f",
            "rate": 87
        },
        {
            "room_id": "675a5ec187274a45ae7a5fdc20f72201",
            "rate": 53
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

作为映射:

{
    "properties": {
        "day": {
            "type": "keyword"
        },
        "hotel_id": {
            "type": "long"
        },
        "rooms": {
            "type": "nested",
            "properties": {
                "rate": {
                    "type": "long"
                },
                "room_id": {
                    "type": "keyword"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试找出一个查询,在该查询中我可以获取一组总费用小于给定金额的天的可用客房,并按总费用升序排序并分页。

到目前为止,我想出了一种方式来获取当天可用的房间及其总费用。基本上是按天过滤,然后按酒店和房间ID进行分组,要求聚合中的最小计数是我要查找的天数。

{
    "size" : 0,
    "query": {
        "bool": { 
            "must": [
                {
                    "terms" : {
                        "day" : ["20200423", "20200424", "20200425"]
                    }
                }
            ] …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-aggregation

7
推荐指数
1
解决办法
97
查看次数

如何使用 DDD 对保存图像的操作进行建模?

基本上,用户想要更改其个人资料图片。Web 服务器收到针对 发布的图像/user/35435/profile/picture,因此需要保存数据,并LastModification更新配置文件对象的属性。

图像不存储在本地网络服务器中,它们需要上传到其他地方(即:云存储)。

目前,每个操作都由命令或查询表示。命令在环境事务(如 SQL 事务)中运行。图像上传操作不是事务性的,但可以在发生错误时执行补偿操作(即:如果数据库操作失败则删除图像)。

在简单的实现中,会创建一个包含当前日期和图像数据的命令。执行命令处理程序,加载ProfileAggregate聚合,并ProfileAggregate.updateProfilePicture(imageUploader, image, currentDate)通过传递域服务作为参数来执行imageUploader。在该方法内,上传图像并更新配置文件。命令处理程序将更改保存在数据库中并返回。

我不喜欢在图像上传期间进行交易。我不喜欢从聚合内部执行非域模型操作(例如上传图像)(即使聚合正在其他地方调用)。

如果这种交互建模为以串行方式执行的两个独立命令,或者只要具体实现中不存在依赖关系,就可以将任何内容放入聚合中。

design-patterns domain-driven-design aggregateroot

5
推荐指数
2
解决办法
2235
查看次数

如何在 ASP.NET 4.7.1 中报告 Prometheus-net 指标

如何在常规 ASP.NET 4.7.1 应用程序中使用 prometheus-net?在 .Net Core 中很容易,但我找不到在 4.7.1 中向 Grafana 报告指标的好方法

理想的情况是拥有/metrics报告指标的路径。

我试图创建一个粗略的测试控制器来运行,MetricServer但出现错误。

// horrible test code
[RoutePrefix("metrics")]
public class MetricsController : ApiController
{
    static readonly MetricServer _server = new MetricServer(7777);

    static MetricsController()
    {
        _server.Start();
    }

    [Route("")]
    public async Task<IHttpActionResult> Get()
    {
        using (var client = new HttpClient())
        {
            var metrics = await client.GetAsync("http://localhost:7777/metrics");
            return Content(HttpStatusCode.OK, await metrics.Content.ReadAsStringAsync(),null, metrics.Content.Headers.ContentType.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

System.Net.HttpListenerException: '访问被拒绝'

c# asp.net asp.net-mvc prometheus-net

5
推荐指数
2
解决办法
2682
查看次数

使用yum在Amazon Linux 2中安装.NET Core

我找不到在AWS Linux 2 AMI上安装dotnet 2.2的直接方法。

有一些公告说已经安装了预构建的AMI,但是我看到的也有不同版本的MSSQL Server。

是否没有办法使用yum安装dotnet core 2.2或在没有SQL Server的情况下获得AMI?

在Amazon Linux AMI上发现了Run .NET程序,但我想知道它是否仍然有效,还有没有更简单的方法。

amazon-web-services .net-core asp.net-core amazon-ami

1
推荐指数
3
解决办法
1648
查看次数