我有一个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,显示相同的行为,然后由于获取内存转储,一个(绿色)突然在内存消息中下降.
没有连接丢失或重新启动.
堆:
(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
为什么在使用"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中.
我有一个处理请求的单例对象.每个请求大约需要一毫秒才能完成,通常更少.此对象不是线程安全的,它期望以特定格式的请求,封装在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.但我没有看到这样做的方法.
ValueTask<>
这似乎不适合这里,因为事情是异步的.TaskCompletionSource<>
有一个州,但它是object
,所以它将被装箱.TaskCompletionSource<>
和a string
).有什么方法可以利用结构来减少内存使用量和/或提高性能?还有其他选择吗?
我收集了一些文件,其中每个文件都指出了给定酒店和一天的可用客房,以及当天的费用:
{
"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) 基本上,用户想要更改其个人资料图片。Web 服务器收到针对 发布的图像/user/35435/profile/picture
,因此需要保存数据,并LastModification
更新配置文件对象的属性。
图像不存储在本地网络服务器中,它们需要上传到其他地方(即:云存储)。
目前,每个操作都由命令或查询表示。命令在环境事务(如 SQL 事务)中运行。图像上传操作不是事务性的,但可以在发生错误时执行补偿操作(即:如果数据库操作失败则删除图像)。
在简单的实现中,会创建一个包含当前日期和图像数据的命令。执行命令处理程序,加载ProfileAggregate
聚合,并ProfileAggregate.updateProfilePicture(imageUploader, image, currentDate)
通过传递域服务作为参数来执行imageUploader
。在该方法内,上传图像并更新配置文件。命令处理程序将更改保存在数据库中并返回。
我不喜欢在图像上传期间进行交易。我不喜欢从聚合内部执行非域模型操作(例如上传图像)(即使聚合正在其他地方调用)。
如果这种交互建模为以串行方式执行的两个独立命令,或者只要具体实现中不存在依赖关系,就可以将任何内容放入聚合中。
如何在常规 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: '访问被拒绝'
我找不到在AWS Linux 2 AMI上安装dotnet 2.2的直接方法。
有一些公告说已经安装了预构建的AMI,但是我看到的也有不同版本的MSSQL Server。
是否没有办法使用yum安装dotnet core 2.2或在没有SQL Server的情况下获得AMI?
我在Amazon Linux AMI上发现了Run .NET程序,但我想知道它是否仍然有效,还有没有更简单的方法。
c# ×3
asp.net-core ×2
.net ×1
.net-core ×1
amazon-ami ×1
asp.net ×1
asp.net-mvc ×1
ef-core-2.0 ×1
kubernetes ×1
linux ×1
memory ×1
memory-leaks ×1
sql-server ×1
struct ×1